Установка Zookeeper и настройка кластера на Rocky Linux
Используемые термины: Zookeeper, Linux.
В данной инструкции мы рассмотрим установку Zookeeper, выполним настройку его запуска в качестве сервиса и соберем кластер из трех нод. Предположим, что у нас 3 сервера с адресами:
- 192.168.1.10
- 192.168.1.20
- 192.168.1.30
Разобьем процесс на этапы — предварительная настройка, установка и запуск, настройка кластера.
Готовим систему к работе
Устанавливаем и настраиваем Zookeeper
Установка приложения
Настройка
Создание юнита в systemd
Настройка кластера
Подготовка системы
На всех трех нодах выполняем следующие действия.
1. Настройка времени
Нам важно, чтобы на нодах нашего кластера было одинаковое время. Для этого установим утилиту chrony:
yum install chrony
Запустим ее и разрешим автозапуск:
systemctl enable chronyd --now
2. Установка OpenJava
Zookeeper разработан на Java, поэтому выполним установку:
yum install java-11-openjdk
Смотрим версию openjdk:
java -version
Мы должны увидеть что-то на подобие:
openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)
Идем дальше.
3. Настройка безопасности
Для корректной работы приложения нам нужно отключить SELinux и открыть порты в брандмауэре. Рассмотрим процессы по очереди.
Отключаем SELinux.
Выполним 2 команды:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
Настройка брандмауэра.
Для работы Zookeeper требуется открыть порты:
- 2181 — для клиентских подключений.
- 2888 — репликация данных между нодами кластера.
- 3888 — выбор лидера между нодами кластера.
Для открытия портов вводим:
firewall-cmd --permanent --add-port={2181,2888,3888}/tcp
Применяем настройки:
firewall-cmd --reload
4. Установка дополнительных пакетов
Для корректной загрузки и распаковки архива, нам нужно установить некоторые утилиты и обновить корневые сертификаты. Это делается командами:
yum install ca-certificates wget tar nc
update-ca-trust
* где:
- ca-certificates — набор корневых сертификатов.
- wget — утилита для загрузки файлов по сети.
- tar — утилита для работы с архивами.
- nc — сетевая утилита, которая считывает и записывает данные из командной строки. Мы ее будем использовать для отправки команд в zookeeper.
Переходим к установке Zookeeper.
Установка, настройка и запуск Zookeeper
Установку с настройкой также будем делать на всех серверах. Так как в репозитории данного программного продукта нет, мы должны будем скачать архив релиза с сайта разработчика и распаковать его на сервере. Запуск приложения будет настроен с использованием systemd.
Установка
Как было сказано выше, установка выполняется путем распаковки архива, скачанного с официального сайта. Переходим на страницу загрузки Zookeeper. Кликаем по ссылке для перехода к последней версии Zookeeper:
Копируем ссылку для загрузки архива tar gz:
Используя скопированную ссылку, загружаем архив на все три сервера:
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
Создаем каталог для размещения zookeeper:
mkdir /opt/zookeeper
Распаковываем скачанный архив:
tar zxvf apache-zookeeper-*-bin.tar.gz -C /opt/zookeeper --strip-components=1
Настройка
Создаем дополнительные каталоги для логов и данных:
mkdir -p /opt/zookeeper/data /var/log/zookeeper
Создаем конфигурационный файл:
vi /opt/zookeeper/conf/zoo.cfg
tickTime = 2000
maxSessionTimeout = 50000
syncLimit = 5
initLimit = 300
autopurge.purgeInterval = 1
autopurge.snapRetainCount = 5
snapCount = 200000
clientPort = 2181
maxClientCnxns = 100
4lw.commands.whitelist=stat
dataDir = /opt/zookeeper/data
dataLogDir = /var/log/zookeeper
* где:
- tickTime — длина тика в миллисекундах. Тик является базовой единицей времени в Zookeeper, относительно которого ведутся другие расчеты.
- maxSessionTimeout — время в миллисекундах, отведенное для взаимодействия сервера с клиентом.
- syncLimit — время в тиках, в течение которого подключенные клиенты должны синхронизировать данные. При превышении этого времени, клиент будет отброшен.
- initLimit — количество времени в тиках, которое отведено на подключение к серверу и выполнение синхронизации с ним.
- autopurge.purgeInterval — указываем интервал в часах для автоматической чистки.
- autopurge.snapRetainCount — количество последних снимков, которые нужно сохранить при выполнении автоматической чистки.
snapCount — количество записей в журнале транзакций, после которого будет запущен снимок с обнулением журнала. - clientPort — порт, на котором наше приложение будет слушать запросы клиентов.
- maxClientCnxns — число одновременных соединений, которое может сделать клиент.
- 4lw.commands.whitelist — список разрешенных команд через запятую. Данные команды можно будет отправить через telnet. В данном примере это команда для отображения статуса работы приложения.
- dataDir — путь для хранения снимков журналов базы данных.
- dataLogDir — путь, по которому zookeeper будет хранить журналы транзакций. Если не указан, то храниться будет в dataDir.
Настройка запуска
После установки приложения, настроим его запуск в качестве сервиса.
Создаем служебную учетную запись, под которой будет работать zookeeper:
useradd -r -c 'Zookeeper service' zookeeper
Зададим владельцем созданного пользователя для всех каталогов, которые мы создали:
chown -R zookeeper:zookeeper /opt/zookeeper /var/log/zookeeper
Создаем файл для юнита в systemd:
vi /etc/systemd/system/zookeeper.service
[Unit]
Description=ZooKeeper Service
Documentation=https://zookeeper.apache.org/
Requires=network.target
After=network.target
[Service]
Type=forking
User=zookeeper
Group=zookeeper
WorkingDirectory=/opt/zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
ExecReload=/opt/zookeeperbin/zkServer.sh restart
TimeoutSec=30
Restart=on-failure
[Install]
WantedBy=default.target
Перечитываем конфигурацию systemd:
systemctl daemon-reload
Разрешаем автозапуск и стразу стартуем сервис:
systemctl enable zookeeper --now
Проверяем, что сервис запустился:
systemctl status zookeeper
Также можно убедиться, что приложение слушает на порту 2181:
ss -tunlp | grep :2181
Мы должны увидеть что-то на подобие:
tcp LISTEN 0 50 *:2181 *:* users:(("java",pid=2945,fd=51))
Настройка кластера
И так, мы установили и запустили приложение, но сейчас оно работает отдельно на наших серверах. Сделаем кластер.
На всех серверах открываем конфигурационный файл:
vi /opt/zookeeper/conf/zoo.cfg
Добавим строку:
...
dynamicConfigFile=/opt/zookeeper/conf/zoo.cfg.dynamic
* dynamicConfigFile указывает путь до динамического файла конфигурации, в котором могут меняться параметры "на лету".
Теперь создадим файл динамической конфигурации:
vi /opt/zookeeper/conf/zoo.cfg.dynamic
server.1=192.168.1.10:2888:3888
server.2=192.168.1.20:2888:3888
server.3=192.168.1.30:2888:3888
* как и говорилось в начале, у нас в кластере будет три сервера. В данном файле мы их перечисляем с присваиванием порядковых номеров.
Теперь на каждом сервере создаем свой файл со своим порядковым номером.
а) на сервере 1:
vi /opt/zookeeper/data/myid
1
б) на сервере 2:
vi /opt/zookeeper/data/myid
2
в) на сервере 3:
vi /opt/zookeeper/data/myid
3
Настройка завершена.
Перезапускаем наш сервис на всех серверах:
systemctl restart zookeeper
Для проверки состояния кластера вводим команды на всех нодах:
echo "stat" | nc localhost 2181
На двух из них мы должны увидеть:
...
Mode: follower
...
На одной:
...
Mode: leader
...