Резервное копирование баз данных ClickHouse
Содержание
Введение
В составе ClickHouse нет инструментов для резервного копирования, как это принято в случае MySQL или PostgreSQL. Вместо этого в сервере ClickHouse, начиная с версии 21.10, есть встроенные средства резервного копирования.
Настройка сервера
Для того, чтобы воспользоваться встроенными средствами резервного копирования, нужно добавить в файл конфигурации /etc/clickhouse-server/config.xml
описание хранилища резервных копий:
<yandex>
<storage_configuration>
<disks>
<backups>
<type>local</type>
<path>/backups/</path>
</backups>
</disks>
</storage_configuration>
<backups>
<allowed_disk>backups</allowed_disk>
<allow_concurrent_backups>false</allow_concurrent_backups>
<allow_concurrent_restores>false</allow_concurrent_restores>
</backups>
</yandex>
В ветке <storage_configuration>
описана конфигурация локального хранилища, которое располагается в каталоге /backups
/ и называется backups
.
В ветке <backups>
даётся разрешение использовать хранилище с именем backups
в качестве аргумента для встроенной функции Disk
(см. далее). Две другие опции запрещают выполнять одновременно несколько операций резервного копирования или восстановления данных из резервных копий.
Убедитесь, что каталог для резервных копий существует, а сервер ClickHouse имеет к нему доступ. Если каталога для резервных копий ещё нет, то создать его и выставить необходимые права доступа можно, например, следующим образом:
# mkdir /backups/
# chown clickhouse:clickhouse /backups/
# chmod u=rwx,g=rx,o= /backups/
Чтобы применить изменения, внесённые в файл конфигурации, нужно перезапустить сервер ClickHouse:
# systemctl restart clickhouse-server
Резервное копирование и восстановление
Теперь можно подключиться к серверу ClickHouse клиентом и выполнять запросы для резервного копирования и восстановления таблиц и баз данных. Например, чтобы создать архив userloginjournal.zip
, содержащий резервную копию таблицы userloginjournal
из базы данных smart_house_box
, можно поступить одним из двух способов. Можно сначала поменять текущую базу данных, а затем сохранить таблицу, указав её имя внутри базы данных:
USE smart_house_box;
BACKUP TABLE userloginjournal TO Disk('backups', 'userloginjournal.zip');
Обратите внимание, что имя функции Disk
начинается с заглавной буквы - имена функций в ClickHouse чувствительны к регистру.
После выполнения запроса в каталоге /backups/
появится архив с именем userloginjournal.zip
.
То же самое можно сделать, не меняя текущую базу данных, а указав полное имя таблицы следующим образом;
BACKUP TABLE smart_house_box.userloginjournal TO Disk('backups', 'userloginjournal.zip');
Для восстановления таблиц используются выражения, которые кажутся совершенно очевидными после того, как мы познакомились с выражениями для резервного копирования:
RESTORE TABLE smart_house_box.userloginjournal FROM Disk('backups', 'userloginjournal.zip');
Если имя базы данных не указано, то таблица будет восстановлена в текущую базу данных.
А что делать, если нужно восстановить данные из таблицы в таблицу с другим именем? Для этого достаточно указать после исходного имени таблицы её новое имя, вот так:
RESTORE TABLE smart_house_box.userloginjournal AS smart_house_box.userloginjournal2 FROM Disk('backups', 'userloginjournal.zip');
Кроме отдельных таблиц можно выполнять резервное копирование отдельных баз данных. Делается это аналогичными запросами, в которых ключевое слово TABLE
нужно заменить на ключевое слово DATABASE
:
BACKUP DATABASE smart_house_box TO Disk('backups', 'smart_house_box.zip');
RESTORE DATABASE smart_house_box AS smart_house_box_restored TO Disk('backups', 'smart_house_box.zip');
Стоит отметить, что структуры архивов с резервными копиями в случае таблиц и баз данных совпадают, так что из архива с базой данных можно восстановить любую отдельную таблицу, а из архива с одной таблицей можно восстановить базу данных, в которой будет только одна таблица.
Периодическое резервное копирование
Для автоматизации резервного копирования всех баз данных, кроме базы данных default
, system
, information_schema
и INFORMATION_SCHEMA
, я написал скрипт chbackup.sh. Скрипт формирует в каталоге для резервных копий файлы с именами вида dbname.YYYYmmdd.zip
, где dbname
- имя базы данных, YYYYmmdd
- текущая дата. Также имеется возможность заливать только что сделанные резервные копии на удалённый сервер по SSH.
Настроить скрипт можно с помощью файла конфигурации /etc/chbackup.conf
, пример которого приведён ниже:
BACKUPS_PATH=/backups/
DAYS=1
RUSER=archive
RSERVER=archive.server.tld
RPATH=/archive/clickhouse.core/
RKEY=/root/.ssh/id_ed25519
Где:
BACKUP_PATH
- каталог для резервных копий баз данных,RUSER
- имя пользователя на удалённом сервере,RSERVER
- доменное имя или IP-адрес удалённого сервера, на который нужно скопировать архив с резервной копией,RPATH
- путь к файлу архива на удалённом сервере,RKEY
- путь к приватному ключу пользователя на удалённом сервере для подключения по SSH,DAYS
- сколько архивов с резервной копией необходимо сохранять локально.
Для работы скрипту нужны права администратора базы данных. Учётные данные для подключения к базе данных можно поместить в файл /root/.clickhouse-client/config.xml
в следующем виде:
<config>
<host>localhost</host>
<port>9000</port>
<database>default</database>
<user>default</user>
<password>$3cr3tP4$$w0rd</password>
<multiquery>1</multiquery>
<format_display_secrets_in_show_and_select>1</format_display_secrets_in_show_and_select>
</config>
Чтобы посторонние пользователи не смогли увидеть пароль пользователя root, поменяем права доступа к файлу с помощью следующих команд:
# chown root:root /root/.clickhouse-client/config.xml
# chmod o= /root/.clickhouse-client/config.xml
Для включения периодического резервного копирования нужно выполнить команду редактирования списка периодических задач с помощью следующей команды:
# crontab -e
И добавить в список задач время запуска скрипта и путь к скрипту, в данном случае скрипт /usr/local/bin/chbackup.sh
будет запускаться ежесуточно ровно в 4 часа утра:
0 4 * * * /usr/local/bin/chbackup.sh
Описанный скрипт адаптирован для запуска в отказоустойчивом кластере, настроенном в соответствии со статьёй Настройка кластера ClickHouse в Debian 12 Bookworm. Я настроил этот скрипт для запуска на обоих узлах кластера, но отправка резервных копий по SSH выполняется только при запуске скрипта на запасном узле кластера. Считается, что на активном узле кластера VRRP есть два IP-адреса, а на запасном - один IP-адрес. Если на узле настроен не один и не два IP-адреса, то архивация на удалённый сервер по SSH выполнена не будет и скрипт выведет предупреждение "Unknown node mode, please, check script logic".