Перенос базы данных ClickHouse
Содержание
Введение
Для переноса базы данных с одного сервера ClickHouse на другой есть как минимум три возможных варианта. Первый и самый лучший вариант - воспользоваться функционалом резервного копирования, который описан в статье Резервное копирование баз данных ClickHouse. Если же по каким-то причинам вам досталась унаследованная система со старой версией ClickHouse, в которой ещё нет встроенной функции резервного копирования, то можно воспользоваться функциями remote
и remoteSecure
или утилитой rsync
и запросами ATTACH TABLE
. Рассмотрим оба этих варианта процедуру подробнее.
remote и remoteSecure
Обе эти функции позволяют обращаться к таблицам на удалённом сервере ClickHouse, почти как к локальным таблицам.
Настройка доступа
Прежде всего на исходном сервере нужно создать пользователя, от имени которого сервер-приёмник сможет читать содержимое таблиц. В случае, если для управления доступом к базам данных используется настройка пользователей через файлы конфигурации, нужно создать, например, файл /etc/clickhouse-server/users.d/exporter.xml
со следующим содержимым:
<clickhouse>
<users>
<exporter>
<password>p4$$w0rd</password>
<networks incl="networks" replace="replace">
<ip>192.168.118.48</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<allow_databases>
<database>db</database>
</allow_databases>
</exporter>
</users>
</clickhouse>
Копирование структуры
Подключаемся к базе данных на исходном сервере:
$ clickhouse-client -h source.domain.tld -d db -u user --ask-password
Смотрим на источнике список таблиц в базе данных и их структуру:
SHOW TABLES;
SHOW CREATE TABLE pagehit;
Например, структура таблицы pagehit
выглядит следующим образом:
CREATE TABLE db.pagehit
(
`date` DateTime,
`user_agent` String,
`browser` String,
`brand` String,
`device_type` String,
`page_id` Int64,
`contract` Nullable(String),
`os` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY date
SETTINGS index_granularity = 8192
Подключаемся к базе данных на целевом сервере:
$ clickhouse-client -h destination.domain.tld -d db -u user --ask-password
Копирование данных
На приёмнике выполняем копирование данных таблицы с исходного сервера:
INSERT INTO pagehit
SELECT * FROM remote('source.domain.tld', db, pagehit, 'exporter', 'p4$$w0rd');
rsync и ATTACH TABLE
Этот способ не проверялся в варианте переноса базы данных с сервера в кластер ClickHouse с репликацией. Тут могут возникнуть сложности, поскольку на репликах может понадобиться разместить те же самые данные, а команда ATTACH TABLE
может не работать с таблицами типа ReplicatedMergeTree
.
Настройка SSH
На приёмнике генерируем SSH-ключи, если их ещё нет:
$ ssh-keygen
Берём содержимое файла .ssh/id_rsa.pub
и добавляем в отдельную строку файла .ssh/authorized_keys
на источнике.
Убеждаемся в возможности подключиться с приёмника на источник по SSH. При проблемах проверяем, что в файле /etc/passwd на источнике прописан домашний каталог пользователя и оболочка, что доступ по SSH не блокируется в /etc/hosts.allow или фаерволом.
Установка rsync
Устанавливаем на источнике и приёмнике rsync:
# apt-get install rsync
Копирование базы данных
Запускаем на приёмнике копирование интересующей базы данных в локальный каталог для пользовательских файлов Clickhouse:
$ rsync -avv user@source.domain.tld:/var/lib/clickhouse/data/db/ /var/lib/clickhouse/user_files/
При необходимости можно также сменить владельца, группу и права доступа к скопированным файлам:
$ chown -R clickhouse:clickhouse /var/lib/clickhouse/user_files/
$ chmod -R o= /var/lib/clickhouse/user_files/
Присоединение таблиц к базе данных
Подключаемся к базе данных на исходном сервере:
$ clickhouse-client -h source.domain.tld -d db -u user --ask-password
Смотрим на источнике список таблиц в базе данных и их структуру:
SHOW TABLES;
SHOW CREATE TABLE pagehit;
Например, структура таблицы pagehit
выглядит следующим образом:
CREATE TABLE db.pagehit
(
`date` DateTime,
`user_agent` String,
`browser` String,
`brand` String,
`device_type` String,
`page_id` Int64,
`contract` Nullable(String),
`os` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY date
SETTINGS index_granularity = 8192
Подключаемся к базе данных на целевом сервере:
$ clickhouse-client -h destination.domain.tld -d db -u user --ask-password
На приёмнике выполняем подсоединение таблиц в нужную базу данных, указывая структуру таблицы:
ATTACH TABLE pagehit FROM '/var/lib/clickhouse/user_files/pagehit'
(
`date` DateTime,
`user_agent` String,
`browser` String,
`brand` String,
`device_type` String,
`page_id` Int64,
`contract` Nullable(String),
`os` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY date
SETTINGS index_granularity = 8192;
Повторяем действия для каждой таблицы базы данных.
Эти действия можно автоматизировать с помощью скрипта, но написание такого скрипта оставим за рамками статьи.
Окончательный перенос
После того, как выполнена подготовка, описанная выше, можно завершить перенос.
Закрываем доступ к исходной базе данных.
Запускаем на приёмнике синхронизацию содержимого интересующей базы данных:
$ rsync -avv user@source.domain.tld:/var/lib/clickhouse/data/db/ /var/lib/clickhouse/data/db/
Если нужно, то меняем также владельца, группу и права доступа ко вновь появившимся файлам:
$ chown -R clickhouse:clickhouse /var/lib/clickhouse/data/db
$ chmod -R o= /var/lib/clickhouse/data/db
Переключаемся на копию базы данных.
Теперь можно удалить исходную базу данных:
DROP DATABASE db;
Скрипт для резервного копирования и восстановления базы данных
Для резервного копирования и восстановления можно воспользоваться наколеночным скриптом chbr.sh. Прежде чем воспользоваться им, нужно создать в домашнем каталоге пользователя, от имени которого он будет запущен, файл конфигурации ~/.clickhouse-client/config.xml
для подключения к базе данных:
<config>
<host>127.0.0.1</host>
<port>9000</port>
<user>user</user>
<password>password</password>
</config>
Для снятия резервной копии нужно вызвать скрипт следующим образом:
$ ./chbr.sh backup db
В текущем каталоге будет сформирован файл db.tar, содержащий внутри себя по два файла для каждой из таблиц:
- table.sql - файл с командой для создания таблицы,
- table.tsv.gz - файл со сжатыми данными таблицы в формате с колонками, разделёнными табуляциями.
Для восстановления резервной копии нужно создать пустую базу данных и запустить скрипт следующим образом:
$ ./chbr.sh restore db
Работоспособность скрипта не гарантируется, скрипт сделан скорее в целях демострации концепции, а не как как готовое решение.