Всех приветствую! Недавно перед нашей командой DBA предстала задача по перемещению ансамбля ZooKeeper на другие сервера. Проблема оказалась в том, что в просторах интернета нет доступного руководства для ZooKeeper версии 3.6.2 и выше. Нашлось руководство для версии 3.4.5, но таким образом расширить и переместить наш ансамбль мы не решились.
Может появиться вопрос: Почему нельзя просто переместить файлы на другой сервер и запустить ансамбль там? Наш ансамбль хранит данные по слиянию и реплицированию данных кластера Clickhouse.
План работы
У нас имеется ансамбль из 3 инстансов, расположенных на 3 отдельных серверах, и нам предоставили другие 3 сервера для переезда. С целью поддержания кворума мы нашли 1 дополнительный временный сервер. Первым делом мы расширим кластер до 7 инстансов:
3 (id: 1, 2, 3) +1 (id: 4) + 3 (id: 5, 6, 7)
После расширения и синхронизации, выводим из ансамбля ненужные инстансы. Останутся только id: 5, 6, 7.
Расширение существующего ансамбля
В официальной документации описан метод расширения, но мы хотим это наглядно показать.
Наш ансамбль работает на CentOS 7 и состоит из 3 инстансов:
server.1=zk-1:2888:3888
server.2=zk-2:2888:3888
server.3=zk-3:2888:3888
Если у Вас нет в конфигурационном файле нет
reconfigEnabled=true
то, необходимо перезапустить Ваш ансамбль с данной строкой. Так же в файл $ZK_HOME/bin/zkEnv.sh можете добавить:
Dzookeeper.skipACL=yes
export SERVER_JVMFLAGS="$SERVER_JVMFLAGS -Dzookeeper.skipACL=yes"
данные строки понадобятся при выполнении динамической реконфигурации ансамбля.
После перезапуска ансамбля, мы можем приступать к расширению. Для этого подготовим все необходимое:
Загрузим архив с apache-zookeeper (в нашем случае apache-zookeeper-3.6.2-bin.tar.gz);
Распакуем и создадим пользователя ОС для ZooKeeper;
Создаем директорию для файлов ZooKeeper и файл myid, который будет идентификатором инстанса. У нас уже есть 3 инстанса
server.1=zk-1:2888:3888 server.2=zk-2:2888:3888 server.3=zk-3:2888:3888
. Для расширения мы планируем добавить еще 4 инстанса. Поэтому myid будут содержать числа 4, 5, 6, 7;Открываем порты в firewalld;
Создаем service файл.
После подготовки нам понадобится $ZK_HOME/bin/zkCli.sh
reconfig -add server.4=zk-4:2888:3888:participant;2181
Успешность выполнения можно проверить в $ZK_HOME/conf. Появится файл zoo.conf.dynamic.100000000 и соответствующая ссылка на данный файл в zoo.conf:
dynamicConfigFile=/home/zookeeper/apache-zookeeper-3.6.2-bin/conf/zoo.conf.dynamic.100000000
Цифра после zoo.conf.dynamic. будет отличаться. Далее запускаем инстанс ZooKeeper на сервере zk-4. Данный инстанс получит такие же конфигурационные файлы. Можно следить за ходом синхронизации в логах. Такую же операцию выполняем для серверов zk-5, zk-6, zk-7.
Вывод из ансамбля
Для вывода zk-1, zk-2, zk-3, zk-4 из ансамбля, воспользуемся тем же $ZK_HOME/bin/zkCli.sh
reconfig -remove 1
reconfig -remove 2
reconfig -remove 3
reconfig -remove 4
После выполнения, Вы так же увидите как поменяется файл zoo.conf.dynamic.XXXXXXX. Теперь можно выключить сервис ZooKeeper на серверах zk-1, zk-2, zk-3, zk-4. Не забудьте убрать из автозапуска.
Итого
Итого мы с помощью расширения новыми инстансами и выводом старых, переместили ансамбль из серверов zk-1, zk-2, zk-3 на сервера zk-5, zk-6, zk-7.
Дополнительно советую добавить в zoo.conf и открыть 7000 порт
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
Таким образом, у Вас будет возможность собирать метрики через Prometheus.