Перейти к основному содержимому

Перенести данные из 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.

В инструкции используются имена из примера — замените их на свои:

РесурсИмя в примере
Приватная сетьtrino-migration-net
Облачный роутерtrino-migration-router
Кластер облачных баз данных ClickHousech-target
Кластер Trinotrino-migration
Каталог Trino для исходного ClickHousech_source
Каталог Trino для целевого кластераch_target
Пользователь исходного ClickHousetrino_reader
База данных и таблица для переносаanalytics.events

Шаги миграции

  1. Настройте сеть.

  2. Подготовьте исходный ClickHouse.

  3. Подготовьте целевой кластер ClickHouse.

  4. Создайте кластер Trino с каталогами.

  5. Подключитесь к кластеру Trino и проверьте каталоги.

  6. Перенесите данные.

  7. Проверьте результат.

1. Настроить сеть

Кластер Trino подключается к приватной подсети. Чтобы Trino мог подключиться к исходному ClickHouse и к кластеру в другом пуле через интернет, подключите подсеть к облачному роутеру с доступом в интернет. Подробнее в подразделе Настроить доступ в интернет через облачный роутер.

  1. Создайте приватную сеть:

    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. Создайте облачный роутер с подключением к интернету:

    2.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные серверы.

    2.2. Перейдите в раздел Сеть → вкладка Облачные роутеры.

    2.3. Нажмите Создать роутер.

    2.4. Выберите локацию — пул ru-7.

    2.5. Выберите тип роутера.

    2.6. Введите имя роутера — trino-migration-router.

    2.7. Отметьте чекбокс Подключить роутер к интернету — для роутера будет выделен внешний IP-адрес.

    2.8. Нажмите Создать.

  3. Подключите подсеть к облачному роутеру:

    3.1. Откройте страницу роутера trino-migration-router.

    3.2. Нажмите Подключить подсеть.

    3.3. Выберите подсеть сети trino-migration-net.

    3.4. Введите IP-адрес роутера — шлюз подсети, например 192.168.0.1. Если IP-адрес роутера совпадает со шлюзом подсети, устройства в подсети выходят в интернет без дополнительных маршрутов.

    3.5. Нажмите Подключить.

  4. Скопируйте внешний IP-адрес роутера — с него Trino будет подключаться к исходному ClickHouse и к кластеру в другом пуле. Можно посмотреть на странице роутера.

2. Подготовить исходный ClickHouse

Trino подключается к исходному ClickHouse от имени отдельного пользователя с правами только на чтение — так миграция не изменит данные в источнике.

  1. Подключитесь к исходному ClickHouse пользователем с правами на управление пользователями.

  2. Создайте пользователя, которому разрешено подключаться только с внешнего 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.

  3. Убедитесь, что на сервере включен HTTPS-интерфейс ClickHouse: в конфигурации задан параметр https_port (обычно 8443) и настроен TLS-сертификат. Trino подключается к ClickHouse через HTTP-интерфейс.

  4. В файрволе сервера или в группах безопасности облачного провайдера разрешите входящие подключения на HTTPS-порт ClickHouse с внешнего IP-адреса облачного роутера.

3. Подготовить целевой кластер ClickHouse

Создайте новый кластер в пуле ru-7 или используйте существующий кластер в другом пуле. Для подключения Trino используйте порт 8443 — HTTP-интерфейс ClickHouse с SSL. Подробнее о портах в инструкции Подключиться к кластеру ClickHouse.

Вариант 1. Создать кластер в пуле ru-7

  1. Создайте кластер ClickHouse с именем ch-target. При создании кластера:

    • выберите локацию — пул ru-7;
    • в блоке Сеть выберите подсеть сети trino-migration-net — в ней будет и кластер Trino;
    • в блоке Конфигурация групп нод выберите конфигурацию с размером диска с запасом относительно объема переносимых данных;
    • в блоке Пароль пользователя-администратора введите пароль или нажмите Сгенерировать. Сохраните пароль — его нельзя будет посмотреть в панели управления.
  2. Дождитесь, пока кластер будет создан.

  3. Скопируйте приватный IP-адрес ноды. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Облачные базы данных → вкладка Активные → страница кластера → вкладка Подключение → блок Адреса для подключения → вкладка группы нод.

Вариант 2. Использовать существующий кластер в другом пуле

Кластер в другом пуле не может находиться в одной подсети с кластером Trino, поэтому Trino подключается к нему через интернет по публичному IP-адресу. Публичные IP-адреса подключаются ко всем нодам шарда одновременно — для каждой ноды отдельный адрес. Подробнее в инструкции Публичный IP-адрес в кластере ClickHouse.

  1. Подключите публичный IP-адрес к шарду кластера:

    1.1. В панели управления в верхнем меню нажмите Продукты и выберите Облачные базы данных.

    1.2. Откройте вкладку Активные.

    1.3. Откройте страницу кластера → вкладка Настройки.

    1.4. В карточке шарда в строке Публичный доступ нажмите кнопку подключения.

    1.5. Если подсеть кластера соответствует требованиям, нажмите Подключить. Если не соответствует — выберите существующий облачный роутер или создайте новый и нажмите Подключить роутер и адрес.

  2. Ограничьте входящий трафик к публичным IP-адресам: назначьте кластеру группу безопасности, которая разрешает входящие подключения на порт 8443 только с внешнего IP-адреса роутера trino-migration-router и с адресов ваших приложений. После назначения группы прервутся все активные сессии, которые не соответствуют ее правилам.

  3. Скопируйте публичный IP-адрес ноды: страница кластера → вкладка Подключение → блок Адреса для подключения → вкладка группы нод.

    Если существующий кластер находится в пуле ru-7, но в другой приватной подсети, публичный IP-адрес не нужен: подключите подсеть кластера к роутеру trino-migration-router и используйте приватный IP-адрес ноды. Если исходный ClickHouse — это тоже кластер облачных баз данных Selectel в другом пуле, подключите к нему публичный IP-адрес так же.

4. Создать кластер Trino с каталогами

Для миграции нужны два каталога с коннектором ClickHouse: ch_source — для исходного ClickHouse и ch_target — для целевого кластера. Каталоги можно добавить при создании кластера или после создания.

  1. В панели управления в верхнем меню нажмите Продукты и выберите Trino.

  2. Нажмите Создать кластер.

  3. Введите имя кластера — trino-migration.

  4. Выберите локацию — пул ru-7. После создания кластера локацию изменить нельзя.

  5. Выберите версию Trino. После создания кластера версию изменить нельзя.

  6. В блоке Конфигурация выберите конфигурации координатора и воркеров и количество воркеров. Подробнее в подразделе Конфигурация инструкции Создать кластер Trino.

  7. В блоке Сеть:

    7.1. В поле Подсеть выберите подсеть сети trino-migration-net. После создания кластера подсеть изменить нельзя.

    7.2. Отметьте чекбокс Внешний доступ к графическому интерфейсу, чтобы подключаться к Trino со своего компьютера через интернет.

  8. В блоке Пароль администратора введите пароль или нажмите Сгенерировать. Скопируйте и сохраните пароль — его нельзя будет посмотреть в панели управления, но можно изменить.

  9. В блоке Каталоги добавьте каталоги ch_source и ch_target. Для каждого каталога:

    9.1. Нажмите Добавить.

    9.2. Введите имя каталога. Имя может содержать только строчные латинские буквы, цифры и нижнее подчеркивание, не более 63 символов.

    9.3. Выберите тип коннектора — ClickHouse.

    9.4. Введите параметры подключения из таблицы ниже.

    9.5. Нажмите Добавить.

  10. Проверьте цену кластера.

  11. Нажмите Создать кластер.

ПараметрКаталог ch_sourceКаталог ch_target
DNS-адрес или IP-адреспубличный адрес исходного ClickHouseвариант 1 — приватный IP-адрес ноды кластера ch-target; вариант 2 — публичный IP-адрес ноды
ПортHTTPS-порт исходного ClickHouse, обычно 8443 8443
Имя базы данныхбаза данных исходного ClickHouse, например default default
Имя пользователя trino_reader admin
Парольпароль пользователя trino_reader пароль пользователя-администратора кластера

Для каталога ch_target в примере используется пользователь-администратор admin. Вы можете создать для Trino отдельного пользователя SQL-запросами — подробнее в инструкции Управление пользователями ClickHouse.

5. Подключиться к кластеру Trino и проверить каталоги

К кластеру Trino подключается пользователь admin с паролем администратора, который вы задали при создании кластера. Подробнее о способах подключения в инструкции Подключиться к кластеру Trino.

Через Trino CLI

  1. Откройте CLI.

  2. Подключитесь к кластеру:

./trino --server https://<trino_address> --user admin --password

Укажите <trino_address> — адрес кластера Trino для подключения из интернета. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты → Trino → страница кластера → вкладка Подключение.

  1. Введите пароль администратора.

Через DBeaver

  1. Откройте DBeaver.

  2. В верхнем меню нажмите База данных → Новое соединение.

  3. Выберите Trino и нажмите Далее.

  4. В поле Хост введите <trino_address> без https:// — адрес кластера Trino для подключения из интернета.

  5. В поле Порт введите 443.

  6. Введите имя пользователя — admin и пароль администратора.

  7. Откройте вкладку Свойства драйвера и для свойства SSL укажите значение true.

  8. Нажмите Тест соединения, затем Готово.

Проверьте каталоги

Выполните запросы в 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 — так не нужен отдельный доступ к кластеру.

  1. Создайте базу данных в целевом кластере:

    CALL ch_target.system.execute(query => 'CREATE DATABASE IF NOT EXISTS analytics');
  2. Получите структуру таблицы: в clickhouse-client на исходном сервере выполните запрос:

    SHOW CREATE TABLE analytics.events;
  3. Создайте таблицу в целевом кластере — передайте результат предыдущего запроса в процедуру 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 = MergeTree
    PARTITION BY toYYYYMM(event_date)
    ORDER BY (event_type, event_time)
    ');

    Если в структуре таблицы есть одинарные кавычки — например, в значениях DEFAULT или в типе Enum — удвойте их: ''. Удалите из структуры настройки, которых нет в целевом кластере, например storage_policy. Если в шарде целевого кластера несколько нод, используйте реплицируемый движок ReplicatedMergeTree.

  4. Опционально: чтобы ускорить загрузку, отключите запись через временную таблицу:

    SET SESSION ch_target.non_transactional_insert = true;

    По умолчанию Trino сначала записывает данные во временную таблицу и только потом переносит их в целевую. С этой настройкой данные записываются сразу в целевую таблицу, но при ошибке в ней останется часть строк — очистите таблицу запросом TRUNCATE TABLE ch_target.analytics.events и повторите перенос.

  5. Перенесите данные:

    INSERT INTO ch_target.analytics.events
    SELECT * FROM ch_source.analytics.events;

    Trino вернет количество записанных строк. Повторите шаги 2, 3 и 5 для каждой таблицы.

7. Проверить результат

  1. Сравните количество строк в исходной и целевой таблицах:

    SELECT
    (SELECT count(*) FROM ch_source.analytics.events) AS source_rows,
    (SELECT count(*) FROM ch_target.analytics.events) AS target_rows;
  2. Найдите дни, за которые количество строк не совпадает:

    SELECT event_date, count(*) AS rows FROM ch_source.analytics.events GROUP BY event_date
    EXCEPT
    SELECT event_date, count(*) AS rows FROM ch_target.analytics.events GROUP BY event_date;

    Пустой результат означает, что количество строк совпадает за все дни. Агрегация выполняется на стороне ClickHouse, поэтому запрос работает быстро даже на больших таблицах.

  3. Сравните столбцы: выполните запрос 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. Перед переносом критичных данных сделайте резервную копию исходных таблиц.

После миграции

  1. Переключите приложение на целевой кластер — подробнее в инструкции Подключиться к кластеру ClickHouse.

  2. В исходном ClickHouse удалите пользователя trino_reader запросом DROP USER trino_reader и закройте в файрволе доступ с IP-адреса облачного роутера.

  3. Для варианта 2: если публичные IP-адреса больше не нужны, отключите их и удалите правило для роутера Trino из группы безопасности.

  4. Если кластер Trino больше не нужен, удалите его или отключите внешний доступ. Если кластер остается для аналитики, удалите каталог ch_source.