Миграция данных в Managed Service for ClickHouse

Чтобы перенести вашу базу данных в сервис Managed Service for ClickHouse, нужно непосредственно перенести данные, закрыть старую базу данных на запись и перенести нагрузку на кластер БД в Яндекс.Облаке.

Перенести данные в кластер Managed Service for ClickHouse можно с помощью Apache ZooKeeper и стандартной утилиты clickhouse-copier.

Переносить данные на промежуточную виртуальную машину в Compute Cloud нужно, если:

  • К кластеру Managed Service for ClickHouse нет доступа из интернета.
  • Сетевое оборудование или соединение с ClickHouse-кластером в Облаке не обладают достаточной надежностью.
  • Нет среды, в которой можно запустить clickhouse-copier.

Этапы миграции:

  1. Подготовьтесь к миграции.
  2. Установите Zookeeper.
  3. Создайте кластер Managed Service for ClickHouse.
  4. Создайте задачу для clickhouse-copier.
  5. Добавьте задачу для clickhouse-copier в Zookeeper.
  6. Запустите clickhouse-copier.

Подготовьтесь к миграции

  1. Версии ПО удовлетворяют условиям:

    • Версии ClickHouse в обоих кластерах должны совпадать.
    • Версия clickhouse-copier должна быть не ниже версии ClickHouse в кластере Managed Service for ClickHouse.
    • Версия ZooKeeper — не ниже 3.4.10.
  2. Проверьте, что кластер-источник готов к миграции:

    • Включен SSL для шифрования трафика.
    • Нагрузка на базу или шард, с которого будут копироваться данные, не создаст проблем.
    • У clickhouse-copier есть доступ к базе данных, и используемый аккаунт имеет доступ только на чтение.
  3. Если вы используете для миграции виртуальную машину в Облаке:

    • ВМ следует создавать в той же облачной сети, что и кластер Managed Service for ClickHouse.
    • Вычислительную мощность ВМ стоит выбирать исходя из объема переносимых данных.

Установите Zookeeper

Чтобы скопировать данные, достаточно запустить один узел ZooKeeper.

  1. Установите Java Runtime Environment:

    $ sudo apt-get install default-jre
    
  2. Добавьте пользователя, от имени которого будет запускаться Zookeeper:

    $ sudo adduser hadoop
    
  3. Создайте каталоги для данных ZooKeeper:

    $ sudo mkdir -p /var/data/zookeeper
    $ sudo chown -R hadoop:hadoop /var/data
    
  4. Установите ZooKeeper в режиме одного узла:

    1. Скачайте дистрибутив, например, версии 3.4.13:

      $ cd /opt
      $ sudo wget http://apache.is.co.za/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
      $ sudo tar -xvf zookeeper-3.4.13.tar.gz
      $ sudo chown hadoop:hadoop -R  zookeeper-3.4.13
      
    2. Переключитесь на созданного ранее пользователя для запуска ZooKeeper:

      $ su hadoop
      
    3. Создайте файл /opt/zookeeper-3.4.13/conf/zoo.cfg со следующим содержимым:

      tickTime=2000
      dataDir=/var/data/zookeeper
      clientPort=2181
      
    4. Мастер-узел должен иметь уникальный идентификатор. Чтобы задать его, создайте файл /var/data/zookeeper/myid с этим идентификатором в качестве содержимого (например, «1»).

  5. Запустить ZooKeeper для отладки можно так:

    $ bash /opt/zookeeper-3.4.13/bin/zkServer.sh start-foreground
    
  6. Чтобы запустить ZooKeeper в обычном режиме:

     $ bash /opt/zookeeper-3.4.13/bin/zkServer.sh start
    

Создайте кластер Managed Service for ClickHouse

Убедитесь, что вычислительная мощность и размер хранилища кластера соответствуют среде, в которой развернуты уже имеющиеся базы данных, и создайте кластер.

Создайте задачу для clickhouse-copier

Чтобы запустить clickhouse-copier с помощью ZooKeeper, нужно подготовить:

  • конфигурационный файл для Zookeeper (config.xml);
  • файл описания задачи (cp-task.xml).

Инструкция по использованию clickhouse-copier приведена в документации ClickHouse.

Подготовьте конфигурационный файл ZooKeeper

В конфигурационном файле (config.xml) нужно указать:

  • В элементе <zookeeper> — адрес хоста, на котором установлен ZooKeeper.
  • В элементе <caConfig> — путь к сертификату для подключения к Managed Service for ClickHouse.

Скачать сертификат можно по адресу https://storage.yandexcloud.net/cloud-certs/CA.pem.

Пример конфигурации:

<yandex>
  <zookeeper>
    <node>
      <host>127.0.0.1</host>
      <port>2181</port>
    </node>
  </zookeeper>

  <logger>
    <level>trace</level>
    <log>log.log</log>
    <errorlog>log.err.log</errorlog>
    <size>never</size>
  </logger>

  <openSSL>
    <client>
      <loadDefaultCAFile>true</loadDefaultCAFile>
      <caConfig>CA.pem</caConfig>
      <cacheSessions>true</cacheSessions>
      <disableProtocols>sslv2,sslv3</disableProtocols>
      <preferServerCiphers>true</preferServerCiphers>
      <invalidCertificateHandler>
        <name>RejectCertificateHandler</name>
      </invalidCertificateHandler>
    </client>
  </openSSL>
</yandex>

Опишите задачу

Пример описания задачи переноса данных (cp-task.xml):

<yandex>
    <tcp_port_secure>9440</tcp_port_secure> <!-- опционально -->
    <remote_servers>
        <source_cluster>
            <shard>
                <internal_replication>false</internal_replication>
                    <replica>
                        <host>your-clickhouse-server.com</host>
                        <port>9440</port>
                        <user>your-user</user>
                        <password>password</password>
                        <secure>1</secure>
                    </replica>
            </shard>
        </source_cluster>

        <destination_cluster>
               <shard>
                <internal_replication>false</internal_replication>
                    <replica>
                        <host>your-cloud-clickhouse.mdb.cloud.yandex.net</host>
                        <port>9440</port>
                        <user>your-user</user>
                        <password>password</password>
                        <secure>1</secure>
                    </replica>
               </shard>
        </destination_cluster>
    </remote_servers>

    <max_workers>2</max_workers>

    <settings_pull>
        <readonly>1</readonly>
    </settings_pull>

    <settings_push>
        <readonly>0</readonly>
    </settings_push>

    <settings>
        <connect_timeout>3</connect_timeout>
        <insert_distributed_sync>1</insert_distributed_sync>
    </settings>

    <tables>
        <table_hits>
            <cluster_pull>source_cluster</cluster_pull>
    	    <database_pull>your-db</database_pull>
            <table_pull>your-table</table_pull>

            <cluster_push>destination_cluster</cluster_push>
            <database_push>your-db</database_push>
            <table_push>your-table</table_push>

            <engine>
                <!-- Описание движка таблицы, такое же как в процедуре CREATE TABLE
                в кластере-источнике. Для существующей таблицы описание можно
                получить запросом SHOW CREATE table_name -->
	            ENGINE = MergeTree() PARTITION BY Year ORDER BY (Year, FlightDate) SETTINGS index_granularity=8192
	        </engine>

    	    <sharding_key>jumpConsistentHash(intHash64(Year), 2)</sharding_key>

            <enabled_partitions>
                <partition>'2017'</partition>
	        </enabled_partitions>
        </table_hits>
    </tables>
</yandex>

Добавьте задачу для clickhouse-copier в Zookeeper

Чтобы добавить задачу в ZooKeeper, выполните следующие команды:

/opt/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 rmr /cp-task.xml/description
/opt/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 rmr /cp-task.xml/task_active_workers
/opt/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 rmr /cp-task.xml

fc=$(cat ./cp-task.xml)
/opt/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 create /cp-task.xml ""
/opt/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 create /cp-task.xml/description "$fc"

Запустите clickhouse-copier

Важная информация

Если вы не создали каталоги, которые указываете в значении флага --base-dir или для сохранения файлов с логами, clickhouse-copier может не запуститься.

Запустить copier можно с помощью следующей команды (чтобы запустить в режиме демона добавьте флаг --daemon):

$ clickhouse-copier
  --config ./config.xml \
  --task-path ./cp-task.xml \
  --base-dir ./clickhouse \
  --log-level debug

После завершения операции обязательно проверьте логи, чтобы убедиться, что копирование завершилось успешно.