Перенести данные из ClickHouse® в облачную базу данных ClickHouse® с помощью Trino
Вы можете перенести таблицы из своего ClickHouse® — на собственном сервере или в другом облаке — в облачную базу данных ClickHouse® с помощью облака для Trino. Trino читает данные из исходного ClickHouse и записывает их в целевой кластер SQL-запросом, без промежуточных файлов и выгрузок.
Способ подходит, если нужно перенести отдельные базы данных и таблицы, отфильтровать или преобразовать данные при переносе. Trino поддерживает не все типы данных ClickHouse — перед переносом проверьте структуру таблиц по разделу Ограничения.
Как устроена миграция
Целевой кластер ClickHouse можно создать рядом с Trino или использовать существующий кластер в другом пуле:
- вариант 1 — новый кластер ClickHouse создается в пуле ru-7 в одной приватной подсети с кластером Trino. Trino подключается к нему по приватному IP-адресу;
- вариант 2 — существующий кластер ClickHouse находится в другом пуле. Trino подключается к нему через интернет по публичному IP-адресу.
В обоих вариантах к исходному ClickHouse Trino подключается через интернет. Для этого подсеть кластера Trino подключена к облачному роутеру с доступом в интернет — роутер выпускает трафик подсети в интернет через свой внешний IP-адрес. SQL-запросы вы отправляете в Trino со своего компьютера через внешний доступ к кластеру Trino.
Схема миграции: исходный ClickHouse → облачный роутер → кластер Trino → целевой кластер ClickHouse.
Исходный и целевой ClickHouse подключаются к Trino как два каталога с коннектором ClickHouse. Каждая база данных ClickHouse отображается в каталоге как схема. В одном SQL-запросе можно читать данные из одного каталога и записывать их в другой.
Что нужно для миграции
- исходный ClickHouse, доступный из интернета по публичному IP-адресу или DNS-адресу, с включенным HTTPS-интерфейсом;
- права на создание пользователей в исходном ClickHouse и доступ к файрволу сервера;
- консольный клиент clickhouse-client с доступом к исходному ClickHouse — чтобы получить структуру таблиц;
- компьютер с клиентом для подключения к Trino — Trino CLI или DBeaver.
В инструкции используются имена из примера — замените их на свои:
Шаги миграции
-
Настройте сеть.
-
Подготовьте исходный ClickHouse.
-
Подготовьте целевой кластер ClickHouse.
-
Создайте кластер Trino с каталогами.
-
Подключитесь к кластеру Trino и проверьте каталоги.
-
Перенесите данные.
-
Проверьте результат.
1. Настроить сеть
Кластер Trino подключается к приватной подсети. Чтобы Trino мог подключиться к исходному ClickHouse и к кластеру в другом пуле через интернет, подключите подсеть к облачному роутеру с доступом в интернет. Подробнее в подразделе Настроить доступ в интернет через облачный роутер.
-
Создайте приватную сеть:
1.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные серверы.
1.2. Перейдите в раздел Сеть → вкладка Приватные сети.
1.3. Нажмите Создать сеть.
1.4. Выберите локацию — пул ru-7.
1.5. Введите имя сети — trino-migration-net.
1.6. Введите CIDR подсети, например
192.168.0.0/24.1.7. Нажмите Создать.
-
Создайте облачный роутер с подключением к интернету:
2.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные серверы.
2.2. Перейдите в раздел Сеть → вкладка Облачные роутеры.
2.3. Нажмите Создать роутер.
2.4. Выберите локацию — пул ru-7.
2.5. Выберите тип роутера.
2.6. Введите имя роутера — trino-migration-router.
2.7. Отметьте чекбокс Подключить роутер к интернету — для роутера будет выделен внешний IP-адрес.
2.8. Нажмите Создать.
-
Подключите подсеть к облачному роутеру:
3.1. Откройте страницу роутера trino-migration-router.
3.2. Нажмите Подключить подсеть.
3.3. Выберите подсеть сети trino-migration-net.
3.4. Введите IP-адрес роутера — шлюз подсети, например
192.168.0.1. Если IP-адрес роутера совпадает со шлюзом подсети, устройства в подсети выходят в интернет без дополнительных маршрутов.3.5. Нажмите Подключить.
-
Скопируйте внешний IP-адрес роутера — с него Trino будет подключаться к исходному ClickHouse и к кластеру в другом пуле. Можно посмотреть на странице роутера.
2. Подготовить исходный ClickHouse
Trino подключается к исходному ClickHouse от имени отдельного пользователя с правами только на чтение — так миграция не изменит данные в источнике.
-
Подключитесь к исходному ClickHouse пользователем с правами на управление пользователями.
-
Создайте пользователя, которому разрешено подключаться только с внешнего IP-адреса облачного роутера, и выдайте ему права на чтение:
CREATE USER trino_reader IDENTIFIED WITH sha256_password BY '<password>' HOST IP '<router_ip>';GRANT SELECT ON analytics.* TO trino_reader;Укажите:
<password>— пароль пользователя;<router_ip>— внешний IP-адрес облачного роутера, который вы скопировали на шаге 1.
Если вы переносите несколько баз данных, выдайте привилегию SELECT на каждую. Если пользователи на сервере задаются в файле
users.xml, а не SQL-запросами, добавьте пользователя в этот файл и ограничьте адреса подключения в секцииnetworks. -
Убедитесь, что на сервере включен HTTPS-интерфейс ClickHouse: в конфигурации задан параметр
https_port(обычно 8443) и настроен TLS-сертификат. Trino подключается к ClickHouse через HTTP-интерфейс. -
В файрволе сервера или в группах безопасности облачного провайдера разрешите входящие подключения на HTTPS-порт ClickHouse с внешнего IP-адреса облачного роутера.
3. Подготовить целевой кластер ClickHouse
Создайте новый кластер в пуле ru-7 или используйте существующий кластер в другом пуле. Для подключения Trino используйте порт 8443 — HTTP-интерфейс ClickHouse с SSL. Подробнее о портах в инструкции Подключиться к кластеру ClickHouse.
Вариант 1. Создать кластер в пуле ru-7
-
Создайте кластер ClickHouse с именем ch-target. При создании кластера:
- выберите локацию — пул ru-7;
- в блоке Сеть выберите подсеть сети trino-migration-net — в ней будет и кластер Trino;
- в блоке Конфигурация групп нод выберите конфигурацию с размером диска с запасом относительно объема переносимых данных;
- в блоке Пароль пользователя-администратора введите пароль или нажмите Сгенерировать. Сохраните пароль — его нельзя будет посмотреть в панели управления.
-
Дождитесь, пока кластер будет создан.
-
Скопируйте приватный IP-адрес ноды. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения → вкладка группы нод.
Вариант 2. Использовать существующий кластер в другом пуле
Кластер в другом пуле не может находиться в одной подсети с кластером Trino, поэтому Trino подключается к нему через интернет по публичному IP-адресу. Публичные IP-адреса подключаются ко всем нодам шарда одновременно — для каждой ноды отдельный адрес. Подробнее в инструкции Публичный IP-адрес в кластере ClickHouse.
-
Подключите публичный IP-адрес к шарду кластера:
1.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные базы данных.
1.2. Откройте вкладку Активные.
1.3. Откройте страницу кластера → вкладка Настройки.
1.4. В карточке шарда в строке Публичный доступ нажмите кнопку подключения.
1.5. Если подсеть кластера соответствует требованиям, нажмите Подключить. Если не соответствует — выберите существующий облачный роутер или создайте новый и нажмите Подключить роутер и адрес.
-
Ограничьте входящий трафик к публичным IP-адресам: назначьте кластеру группу безопасности, которая разрешает входящие подключения на порт 8443 только с внешнего IP-адреса роутера trino-migration-router и с адресов ваших приложений. После назначения группы прервутся все активные сессии, которые не соответствуют ее правилам.
-
Скопируйте публичный IP-адрес ноды: страница кластера → вкладка Подключение → блок Адреса для подключения → вкладка группы нод.
Если существующий кластер находится в пуле ru-7, но в другой приватной подсети, публичный IP-адрес не нужен: подключите подсеть кластера к роутеру trino-migration-router и используйте приватный IP-адрес ноды. Если исходный ClickHouse — это тоже кластер облачных баз данных Selectel в другом пуле, подключите к нему публичный IP-адрес так же.
4. Создать кластер Trino с каталогами
Для миграции нужны два каталога с коннектором ClickHouse: ch_source — для исходного ClickHouse и ch_target — для целевого кластера. Каталоги можно добавить при создании кластера или после создания.
-
В панели управления в верхнем меню нажмите Продукты и выберите Trino.
-
Нажмите Создать кластер.
-
Введите имя кластера — trino-migration.
-
Выберите локацию — пул ru-7. После создания кластера локацию изменить нельзя.
-
Выберите версию Trino. После создания кластера версию изменить нельзя.
-
В блоке Конфигурация выберите конфигурации координатора и воркеров и количество воркеров. Подробнее в подразделе Конфигурация инструкции Создать кластер Trino.
-
В блоке Сеть:
7.1. В поле Подсеть выберите подсеть сети trino-migration-net. После создания кластера подсеть изменить нельзя.
7.2. Отметьте чекбокс Внешний доступ к графическому интерфейсу, чтобы подключаться к Trino со своего компьютера через интернет.
-
В блоке Пароль администратора введите пароль или нажмите Сгенерировать. Скопируйте и сохраните пароль — его нельзя будет посмотреть в панели управления, но можно изменить.
-
В блоке Каталоги добавьте каталоги ch_source и ch_target. Для каждого каталога:
9.1. Нажмите Добавить.
9.2. Введите имя каталога. Имя может содержать только строчные латинские буквы, цифры и нижнее подчеркивание, не более 63 символов.
9.3. Выберите тип коннектора — ClickHouse.
9.4. Введите параметры подключения из таблицы ниже.
9.5. Нажмите Добавить.
-
Проверьте цену кластера.
-
Нажмите Создать кластер.
Для каталога ch_target в примере используется пользователь-администратор admin. Вы можете создать для Trino отдельного пользователя SQL-запросами — подробнее в инструкции Управление пользователями ClickHouse.
5. Подключиться к кластеру Trino и проверить каталоги
К кластеру Trino подключается пользователь admin с паролем администратора, который вы задали при создании кластера. Подробнее о способах подключения в инструкции Подключиться к кластеру Trino.
Через Trino CLI
-
Откройте CLI.
-
Подключитесь к кластеру:
./trino --server https://<trino_address> --user admin --password
Укажите <trino_address> — адрес кластера Trino для подключения из интернета. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Trino → страница кластера → вкладка Подключение.
- Введите пароль администратора.
Через DBeaver
-
Откройте DBeaver.
-
В верхнем меню нажмите База данных → Новое соединение.
-
Выберите Trino и нажмите Далее.
-
В поле Хост введите
<trino_address>без https:// — адрес кластера Trino для подключения из интернета. -
В поле Порт введите
443. -
Введите имя пользователя — admin и пароль администратора.
-
Откройте вкладку Свойства драйвера и для свойства SSL укажите значение true.
-
Нажмите Тест соединения, затем Готово.
Проверьте каталоги
Выполните запросы в Trino CLI или в редакторе SQL DBeaver:
SHOW CATALOGS;
SHOW SCHEMAS FROM ch_source;
SHOW TABLES FROM ch_source.analytics;
SHOW SCHEMAS FROM ch_target;
В списке каталогов должны быть ch_source и ch_target, а в схеме ch_source.analytics — таблицы исходной базы данных.
Если запрос к каталогу завершается ошибкой подключения, проверьте, что подсеть кластера Trino подключена к облачному роутеру, а внешний IP-адрес роутера разрешен у пользователя trino_reader, в файрволе исходного сервера и — для варианта 2 — в группе безопасности целевого кластера.
6. Перенести данные
Trino создает таблицы ClickHouse только с движками Log и MergeTree и без части настроек исходной таблицы. Поэтому сначала создайте в целевом кластере таблицы с той же структурой, что в источнике, а затем перенесите в них данные. Нативные запросы ClickHouse к целевому кластеру выполняйте через процедуру system.execute — так не нужен отдельный доступ к кластеру.
-
Создайте базу данных в целевом кластере:
CALL ch_target.system.execute(query => 'CREATE DATABASE IF NOT EXISTS analytics'); -
Получите структуру таблицы: в
clickhouse-clientна исходном сервере выполните запрос:SHOW CREATE TABLE analytics.events; -
Создайте таблицу в целевом кластере — передайте результат предыдущего запроса в процедуру system.execute:
CALL ch_target.system.execute(query => 'CREATE TABLE analytics.events(event_date Date,event_time DateTime,user_id UInt64,event_type String)ENGINE = MergeTreePARTITION BY toYYYYMM(event_date)ORDER BY (event_type, event_time)');Если в структуре таблицы есть одинарные кавычки — например, в значениях DEFAULT или в типе Enum — удвойте их: ''. Удалите из структуры настройки, которых нет в целевом кластере, например
storage_policy. Если в шарде целевого кластера несколько нод, используйте реплицируемый движок ReplicatedMergeTree. -
Опционально: чтобы ускорить загрузку, отключите запись через временную таблицу:
SET SESSION ch_target.non_transactional_insert = true;По умолчанию Trino сначала записывает данные во временную таблицу и только потом переносит их в целевую. С этой настройкой данные записываются сразу в целевую таблицу, но при ошибке в ней останется часть строк — очистите таблицу запросом TRUNCATE TABLE ch_target.analytics.events и повторите перенос.
-
Перенесите данные:
INSERT INTO ch_target.analytics.eventsSELECT * FROM ch_source.analytics.events;Trino вернет количество записанных строк. Повторите шаги 2, 3 и 5 для каждой таблицы.
7. Проверить результат
-
Сравните количество строк в исходной и целевой таблицах:
SELECT(SELECT count(*) FROM ch_source.analytics.events) AS source_rows,(SELECT count(*) FROM ch_target.analytics.events) AS target_rows; -
Найдите дни, за которые количество строк не совпадает:
SELECT event_date, count(*) AS rows FROM ch_source.analytics.events GROUP BY event_dateEXCEPTSELECT event_date, count(*) AS rows FROM ch_target.analytics.events GROUP BY event_date;Пустой результат означает, что количество строк совпадает за все дни. Агрегация выполняется на стороне ClickHouse, поэтому запрос работает быстро даже на больших таблицах.
-
Сравните столбцы: выполните запрос SHOW COLUMNS FROM ch_target.analytics.events; и сверьте результат со структурой таблицы в исходном ClickHouse. Столбцы с типами, которые Trino не поддерживает, не видны в каталогах — сверяйте с выводом SHOW CREATE TABLE в источнике.
Ограничения
Trino переносит данные, но не все объекты базы данных и настройки таблиц.
- типы данных. Trino поддерживает часть типов ClickHouse: целые и дробные числа, Decimal, Bool, String, FixedString, Date, DateTime, Enum, UUID, IPv4 и IPv6. Столбцы других типов — например, Array, Map, Tuple и DateTime64 — Trino по умолчанию не видит, и SELECT * их не вернет. Если в таблице есть такие столбцы, перечислите в INSERT и SELECT только поддерживаемые столбцы — остальные получат значения по умолчанию. Подробнее в разделе Type mapping документации Trino. Чтобы перенести такие столбцы, используйте нативные средства ClickHouse, например табличную функцию remoteSecure;
- строки. Trino читает столбцы String как VARBINARY. На перенос это не влияет — в целевую таблицу записываются те же строки. Чтобы посмотреть строки в Trino в читаемом виде, используйте функцию from_utf8();
- объекты базы данных. Trino переносит только данные таблиц. Материализованные представления, словари, пользователей, роли и профили настроек создайте в целевом кластере вручную;
- шардирование. Пример рассчитан на целевой кластер с одним шардом: Trino записывает данные на ноду, адрес которой указан в каталоге. Для кластера из нескольких шардов записывайте данные в таблицу с движком Distributed;
- согласованность данных. Каждая таблица читается в свой момент времени. Остановите запись в исходный ClickHouse на время переноса или догрузите новые данные перед переключением приложения;
- таблицы с фоновым слиянием строк. В таблицах ReplacingMergeTree, CollapsingMergeTree и похожих количество строк в источнике и в целевом кластере может отличаться до завершения фоновых слияний;
- место на диске. При записи через временную таблицу на диске целевого кластера нужен запас примерно на объем переносимой таблицы;
- перенос через интернет. В варианте 2 скорость переноса зависит от канала между пулами. Трафик шифруется, но публичные IP-адреса кластера доступны из интернета — ограничьте доступ группой безопасности и отключите публичные IP-адреса после миграции, если они не нужны;
- Public preview. Облако для Trino предоставляется без SLA. Перед переносом критичных данных сделайте резервную копию исходных таблиц.
После миграции
-
Переключите приложение на целевой кластер — подробнее в инструкции Подключиться к кластеру ClickHouse.
-
В исходном ClickHouse удалите пользователя trino_reader запросом DROP USER trino_reader и закройте в файрволе доступ с IP-адреса облачного роутера.
-
Для варианта 2: если публичные IP-адреса больше не нужны, отключите их и удалите правило для роутера Trino из группы безопасности.
-
Если кластер Trino больше не нужен, удалите его или отключите внешний доступ. Если кластер остается для аналитики, удалите каталог ch_source.