ZooKeeper
ZooKeeper — это распределённая система с открытым исходным кодом для централизованного хранения конфигурационной информации, координации и синхронизации процессов в распределённых приложениях. Относится к классу сервисов координации и управления конфигурациями (coordination services). Обеспечивает согласованность данных, высокую доступность и отказоустойчивость за счёт репликации и использования алгоритма консенсуса ZAB (ZooKeeper Atomic Broadcast). ZooKeeper является проектом Apache Software Foundation и широко применяется в экосистеме Apache Hadoop, Apache Kafka, Apache HBase и других системах.
Архитектура и принципы работы
ZooKeeper построен по модели ведущий-ведомый (leader-follower). Кластер состоит из нескольких серверов (обычно нечётное количество, например, 3, 5 или 7), один из которых выбирается лидером. Лидер обрабатывает все операции записи, а ведомые серверы реплицируют данные и обслуживают запросы на чтение. Для обеспечения консенсуса используется протокол ZAB, гарантирующий, что все операции записи применяются в одном порядке на всех узлах кластера.
Модель данных
ZooKeeper хранит данные в виде иерархического пространства имён, напоминающего файловую систему. Каждый узел в этой иерархии называется znode. Znode может содержать как данные (обычно небольшого размера, до 1 МБ), так и дочерние узлы. Существуют два типа znodes:
- Persistent (постоянные) — существуют до тех пор, пока не будут явно удалены.
- Ephemeral (временные) — создаются сессией клиента и автоматически удаляются при её завершении.
- Sequential (последовательные) — к имени узла добавляется монотонно возрастающий номер, что позволяет создавать уникальные имена.
Сессии и тайм-ауты
Клиенты ZooKeeper устанавливают с кластером сессию. Каждая сессия имеет тайм-аут (обычно от 2 до 20 секунд). Если клиент не отправляет серверу heartbeat в течение этого времени, сессия считается завершённой, а все созданные в её рамках временные znodes удаляются. Это позволяет реализовывать механизмы обнаружения сбоев и автоматического освобождения ресурсов.
Наблюдатели (Watchers)
ZooKeeper предоставляет механизм уведомлений — watchers. Клиент может установить наблюдателя на znode и получать уведомления при изменении данных или структуры этого узла (например, при создании, удалении или изменении содержимого). Watcher срабатывает однократно, после чего его необходимо переустанавливать. Это позволяет строить системы, реагирующие на изменения конфигурации или состояния.
История
ZooKeeper был разработан в компании Yahoo! для решения проблем координации в распределённых системах. Первоначальная версия появилась в 2008 году. В 2010 году проект был передан в Apache Software Foundation, где получил статус инкубатора, а в 2011 году стал проектом верхнего уровня (Top-Level Project). Основные версии:
- ZooKeeper 3.4.x (2011) — стабильная версия, долгое время использовавшаяся в промышленной эксплуатации.
- ZooKeeper 3.5.x (2019) — добавлена поддержка динамической реконфигурации кластера, улучшена производительность, введён протокол TTL для znodes.
- ZooKeeper 3.6.x (2020) — улучшена безопасность, добавлена поддержка SSL/TLS, улучшена работа с большими кластерами.
- ZooKeeper 3.7.x (2021) — исправления ошибок, улучшение производительности.
- ZooKeeper 3.8.x (2022) — поддержка Java 17, улучшение механизма наблюдателей.
Применение
ZooKeeper используется в качестве центрального координатора в следующих системах:
- Apache Hadoop — для управления конфигурациями и координации работы NameNode и ResourceManager.
- Apache Kafka — для хранения метаданных о топиках, партициях и брокерах, а также для выбора контроллера кластера.
- Apache HBase — для управления регионами и координации работы RegionServer.
- Apache Solr — для координации работы кластера и хранения конфигураций.
- Apache Spark — для управления конфигурациями и координации работы драйвера и исполнителей.
- Apache Flink — для координации работы JobManager.
- Presto — для координации работы кластера.
- Neo4j — для координации работы кластера в режиме высокой доступности.
- Redis — для управления конфигурациями в кластерных развёртываниях.
Классификация
ZooKeeper можно классифицировать по следующим признакам:
- По типу системы — распределённая система координации.
- По модели данных — иерархическое пространство имён.
- По протоколу консенсуса — ZAB (ZooKeeper Atomic Broadcast).
- По языку реализации — Java (основная реализация), также существуют клиентские библиотеки на C, Python, Go, Ruby, Node.js, PHP, Scala, C#.
- По лицензии — Apache License 2.0.
Устройство и характеристики
Репликация
Данные в ZooKeeper реплицируются на все серверы кластера. Это обеспечивает высокую доступность: если один сервер выходит из строя, запросы могут обслуживаться другими серверами. Для обеспечения консенсуса используется протокол ZAB, который гарантирует, что все операции записи выполняются в одном порядке на всех узлах.
Производительность
ZooKeeper оптимизирован для операций чтения, которые могут обслуживаться любым сервером кластера. Операции записи обрабатываются только лидером, что ограничивает пропускную способность записи. В типичных конфигурациях ZooKeeper может обрабатывать десятки тысяч операций записи в секунду и сотни тысяч операций чтения.
Отказоустойчивость
Кластер ZooKeeper может продолжать работу при выходе из строя менее половины серверов. Например, кластер из 5 серверов может пережить отказ 2 серверов. При выборе нового лидера кластер временно недоступен для записи (обычно на несколько секунд).
Примеры использования
Пример 1: Координация в Apache Kafka
В Apache Kafka ZooKeeper используется для хранения метаданных: список брокеров, конфигурации топиков, информация о партициях и их лидерах. При запуске брокера он регистрируется в ZooKeeper, создавая временный znode. При выходе брокера из строя его znode удаляется, и Kafka автоматически перераспределяет партиции.
Пример 2: Управление конфигурациями
ZooKeeper может использоваться для хранения конфигурационных файлов распределённых приложений. Клиенты устанавливают watcher на соответствующий znode и получают уведомления при изменении конфигурации, что позволяет динамически обновлять настройки без перезапуска приложений.
Пример 3: Выбор лидера
ZooKeeper предоставляет механизм для выбора лидера в распределённой системе. Клиенты создают временные последовательные znodes, и тот, кто создал znode с наименьшим номером, становится лидером. При выходе лидера из строя его znode удаляется, и следующий клиент в очереди становится новым лидером.
Интересные факты
- Название ZooKeeper происходит от того, что система управляет «зоопарком» распределённых процессов.
- ZooKeeper не предназначен для хранения больших объёмов данных — максимальный размер znode составляет 1 МБ.
- В ZooKeeper используется протокол ZAB, который является модификацией алгоритма Paxos, адаптированной для работы с очередями операций.
- Существует альтернативная реализация ZooKeeper на языке Go — go-zookeeper.
- ZooKeeper входит в состав многих дистрибутивов Hadoop, таких как Cloudera, Hortonworks, MapR.
Критика
Несмотря на широкое распространение, ZooKeeper имеет ряд недостатков:
- Сложность администрирования — настройка и обслуживание кластера требуют специальных знаний.
- Ограниченная производительность записи — из-за того, что все операции записи обрабатываются лидером, пропускная способность записи ограничена.
- Проблемы с масштабированием — при увеличении количества серверов производительность записи не увеличивается, а может даже снижаться из-за накладных расходов на репликацию.
- Отсутствие поддержки мульти-мастер репликации — ZooKeeper не поддерживает одновременную запись на нескольких серверах.
- Зависимость от Java — основная реализация требует Java Runtime Environment, что может быть неудобно в некоторых окружениях.
В последние годы появились альтернативные решения, такие как etcd (разработанный компанией CoreOS, ныне часть CNCF) и Consul (разработанный компанией HashiCorp), которые предлагают схожий функционал, но с более современной архитектурой и лучшей поддержкой HTTP/REST API.
Источники
- Apache ZooKeeper Documentation. Apache Software Foundation.
- Hunt, P., Konar, M., Junqueira, F. P., & Reed, B. (2010). ZooKeeper: Wait-free coordination for internet-scale systems. In Proceedings of the 2010 USENIX Annual Technical Conference.
- Junqueira, F. P., & Reed, B. (2013). ZooKeeper: Distributed Process Coordination. O'Reilly Media.
- Apache ZooKeeper Wiki. Apache Software Foundation.
- «ZooKeeper: A Distributed Coordination Service for Distributed Applications». Yahoo! Research.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →