Установка и настройка Apache ZooKeeper на Debian 10 (одиночный узел)

Apache ZooKeeper — это бесплатный и открытый сервис для распределённых систем, который упрощает управление большим набором узлов. Он централизует хранение конфигурации, сервисы именования и групповой информации. ZooKeeper написан на Java и позволяет разработчикам сосредоточиться на функциональности приложения, не заботясь о распределённой природе соединений. Чаще всего ZooKeeper используется в сценариях с доминирующим числом чтений по сравнению с записями.
Ключевые возможности: синхронизация, упорядоченные сообщения, сериализация, надёжность и быстрый ответ, механизмы блокировок и автоматического восстановления после сбоев.
Зачем этот гид
Цель — получить рабочий одиночный узел ZooKeeper на Debian 10 для разработки и тестирования. Для production-кластера используйте минимум три узла и дополнительные настройки отказоустойчивости.
Важно: одиночный узел не даёт отказоустойчивости. Он полезен для разработки, CI и тестов.
Сопутствующие термины
- ZooKeeper: координатор состояния и конфигурации для распределённых приложений.
- tickTime: базовая единица времени внутри ZooKeeper в миллисекундах.
- dataDir: папка для данных состояния ZooKeeper.
Требования
- Сервер с Debian 10, минимум 2 ГБ ОЗУ.
- Доступ под root или пользователь с правами sudo.
Шаг 1 — Обновите систему
Перед установкой рекомендуем обновить пакеты:
apt-get update -y
apt-get upgrade -yПосле обновлений перезагрузите систему, если это требуется.
Шаг 2 — Установка Java
ZooKeeper написан на Java, поэтому потребуется JDK. В репозиториях Debian 10 доступен default-jdk:
apt-get install default-jdk -yПроверьте версию Java:
java --versionОжидаемый результат похож на:
openjdk 11.0.5 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Debian-1deb10u1, mixed mode, sharing)Шаг 3 — Создайте системного пользователя для ZooKeeper
Рекомендуется запускать сервис под отдельным непривилегированным пользователем:
useradd zookeeper -m
usermod --shell /bin/bash zookeeper
passwd zookeeper
usermod -aG sudo zookeeperПользователь будет владельцем установки и данных ZooKeeper.
Шаг 4 — Загрузка и распаковка ZooKeeper
Перейдите в /opt и скачайте архив с официального архива Apache. В примере использован релиз 3.5.6:
cd /opt
wget https://archive.apache.org/dist/zookeeper/stable/apache-zookeeper-3.5.6-bin.tar.gzРаспакуйте и переименуйте директорию:
tar -xvzf apache-zookeeper-3.5.6-bin.tar.gz
mv apache-zookeeper-3.5.6-bin zookeeper
chown -R zookeeper:zookeeper /opt/zookeeperСоздайте каталог для хранения данных ZooKeeper и назначьте владельца:
mkdir -p /data/zookeeper
chown -R zookeeper:zookeeper /data/zookeeperПримечание: в production данные можно хранить на отдельном диске или файловой системе с резервированием.
Шаг 5 — Конфигурация ZooKeeper
Все конфигурационные файлы находятся в /opt/zookeeper/conf/. Создайте основной конфиг:
nano /opt/zookeeper/conf/zoo.cfgДобавьте следующие строки:
tickTime=2500
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=80Объяснение параметров:
- tickTime: длительность тика в миллисекундах. Влияет на таймауты слейв-лейдер синхронизации.
- dataDir: папка для данных состояния и журналов.
- clientPort: порт для подключений клиентов (по умолчанию 2181).
- maxClientCnxns: максимальное количество одновременных подключений от одного клиента.
Примечание: эти параметры подходят для тестовой среды. Для production измените tickTime, память JVM и параметры журналирования.
Шаг 6 — Запуск и тестирование ZooKeeper
Запустите сервер вручную для первичной проверки:
/opt/zookeeper/bin/zkServer.sh startОжидаемый вывод:
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTEDПодключитесь клиентом к локальному серверу:
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181После подключения вы увидите приглашение вида:
[zk: 127.0.0.1:2181(CONNECTED) 0]Выполните help для списка команд клиента:
[zk: 127.0.0.1:2181(CONNECTED) 0] helpПосле тестирования выйдите:
[zk: 127.0.0.1:2181(CONNECTED) 0] quitОстановите сервер:
/opt/zookeeper/bin/zkServer.sh stopОжидаемый вывод при остановке:
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPEDШаг 7 — Создание systemd-сервиса
Чтобы управлять ZooKeeper через systemd, создайте сервисный файл:
nano /etc/systemd/system/zookeeper.serviceВставьте следующее:
[Unit]
Description=Zookeeper Daemon
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/zookeeper
User=zookeeper
Group=zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg
ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg
TimeoutSec=30
Restart=on-failure
[Install]
WantedBy=default.targetПерезагрузите демона systemd и включите автозапуск:
systemctl daemon-reload
systemctl start zookeeper
systemctl enable zookeeperПроверьте статус:
systemctl status zookeeperПример ожидаемого фрагмента лога:
? zookeeper.service - Zookeeper Daemon
Loaded: loaded (/etc/systemd/system/zookeeper.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2019-12-29 15:12:39 UTC; 8min ago
Docs: http://zookeeper.apache.org
Process: 9229 ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg (code=exited, status=0/SUCCESS)
Main PID: 9245 (java)
Tasks: 29 (limit: 2359)
Memory: 49.7M
CGroup: /system.slice/zookeeper.service
??9245 java -Dzookeeper.log.dir=/opt/zookeeper/bin/../logs -Dzookeeper.log.file=zookeeper-zookeeper-server-debian10.log -Dzookeeper.
Dec 29 15:12:38 debian10 systemd[1]: Starting Zookeeper Daemon...
Dec 29 15:12:38 debian10 zkServer.sh[9229]: /usr/bin/java
Dec 29 15:12:38 debian10 zkServer.sh[9229]: ZooKeeper JMX enabled by default
Dec 29 15:12:38 debian10 zkServer.sh[9229]: Using config: /opt/zookeeper/conf/zoo.cfg
Dec 29 15:12:39 debian10 zkServer.sh[9229]: Starting zookeeper ... STARTED
Dec 29 15:12:39 debian10 systemd[1]: Started Zookeeper Daemon.Безопасность и hardening
- Права доступа: держите /opt/zookeeper и /data/zookeeper доступными только пользователю zookeeper.
- Сетевой доступ: закройте порт 2181 снаружи, если к ZooKeeper подключаются только локальные сервисы. Пример правила ufw:
ufw allow from 10.0.0.0/8 to any port 2181 proto tcp
ufw deny 2181/tcp- JVM: задайте параметры JVM в переменных окружения запуска, если требуется ограничение памяти и GC:
export JVMFLAGS="-Xms512m -Xmx1g"- Аутентификация и ACL: используйте систему ACL ZooKeeper для ограничения операций записи.
- Логи и мониторинг: включите JMX и интегрируйте с системой мониторинга для отслеживания состояния кворума и латентности.
Переход к production
Минимальные рекомендации для production:
- Разверните кластер из нечётного числа узлов (3, 5 и т.д.).
- Разнесите узлы по разным отказоустойчивым зонам.
- Настройте бэкапы каталога dataDir и журналов транзакций.
- Настройте мониторинг SLI/SLO: доступность, задержка чтения/записи, нагрузка GC.
Отладка и распространённые проблемы
- ZooKeeper не стартует
- Проверьте права на /opt/zookeeper и /data/zookeeper.
- Посмотрите логи в /opt/zookeeper/logs или в systemd journal: journalctl -u zookeeper
- Клиент не может подключиться
- Убедитесь, что порт 2181 слушает: ss -ltnp | grep 2181
- Проверяйте firewall/iptables
- Высокая нагрузка на GC
- Уменьшите heap или настройте GC-флаги JVM.
- Потеря кворума в кластере
- Проверьте сетевое соединение между узлами и настройки сервера в zoo.cfg.
Когда одиночный узел недостаточен
- Когда нужна высокая доступность и отсутствие единой точки отказа — одиночный узел не подходит.
- Для важных рабочих нагрузок требуйте минимум 3 узла, распределённых по разным хостам.
Альтернативы и интеграции
- Etcd: лёгкая key-value хранилище с интеграцией в Kubernetes.
- Consul: комбинирует сервис-дискавери и KV-хранилище.
Выбор зависит от требований по согласованности, экосистеме и интеграции.
Быстрый чеклист перед релизом
- Установлен и проверен Java.
- Пользователь zookeeper создан.
- dataDir настроен и имеет правильные права.
- Конфигурация zoo.cfg соответствует окружению.
- Сервис systemd создан и включён.
- Мониторинг и бэкапы настроены.
Рекомендации по обновлению версии ZooKeeper
Мини-методология:
- Подготовьте резервную копию dataDir и логов.
- Тестируйте обновление на staging-кластере.
- Если у вас кластер — обновляйте узлы по одному, проверяя восстановление кворума.
- После обновления проверьте логи и метрики.
Краткий глоссарий
- tickTime: единица времени ZooKeeper.
- dataDir: директория для хранения состояния.
- clientPort: порт для клиентских подключений.
Заключение
Вы успешно установили и запустили одиночный узел Apache ZooKeeper на Debian 10. Этот сценарий пригоден для разработки и тестов. Для production используйте кластер из нескольких узлов и дополнительные меры безопасности и мониторинга.
Важно: если потребуется — помогу адаптировать конфигурацию под кластерную установку, добавить TLS/JMX или интеграцию с системой мониторинга.
Критерии приёмки
- ZooKeeper запускается и отвечает на клиентские команды на 127.0.0.1:2181.
- Каталог dataDir доступен и принадлежит пользователю zookeeper.
- Сервис systemd стартует и включён для автозапуска.
Вспомогательные команды
- Просмотр логов systemd: journalctl -u zookeeper -f
- Проверка порта: ss -ltnp | grep 2181
- Проверка клиентом: /opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
Важно
Для production избегайте одиночных узлов. Планируйте кластер из минимум трёх узлов и настройте резервирование данных и мониторинг.
Краткое резюме
- Установите Java, создайте пользователя, скачайте и распакуйте ZooKeeper.
- Настройте zoo.cfg и dataDir.
- Управляйте сервисом через systemd.
- Настройте безопасность и мониторинг перед выводом в production.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента