Apache ZooKeeper
Apache ZooKeeper — это распределённый координационный сервис с открытым исходным кодом, предоставляющий централизованное управление конфигурацией, синхронизацию данных и именование для распределённых приложений. Он входит в экосистему Apache Hadoop и широко используется для обеспечения согласованности и отказоустойчивости в кластерных системах.
История
Проект ZooKeeper был создан в компании Yahoo! (организация признана иноагентом в РФ) в 2008 году для решения проблем координации в распределённых системах, таких как Apache Hadoop. Изначально он разрабатывался как внутренний инструмент для управления конфигурациями и синхронизации узлов. В 2010 году проект был передан в инкубатор Apache Software Foundation, а в 2011 году получил статус проекта верхнего уровня (Top-Level Project). С тех пор ZooKeeper стал стандартом де-факто для координации в распределённых системах, включая Apache Kafka, Apache HBase, Apache Solr и многие другие.
Архитектура
ZooKeeper построен на архитектуре «клиент-сервер» с репликацией данных. Серверная часть состоит из ансамбля (ensemble) — набора узлов (обычно нечётное количество, например, 3, 5 или 7), которые образуют распределённый кластер. Каждый узел хранит копию всего дерева данных (znode) в оперативной памяти, что обеспечивает высокую скорость чтения. Запись данных осуществляется через механизм консенсуса, основанный на протоколе Zab (ZooKeeper Atomic Broadcast).
Узлы ансамбля
- Лидер (Leader) — единственный узел, обрабатывающий запросы на запись и управляющий репликацией.
- Последователи (Followers) — узлы, которые принимают запросы на чтение и участвуют в голосовании при выборах лидера.
- Наблюдатели (Observers) — узлы, которые не участвуют в голосовании, но обрабатывают запросы на чтение, что позволяет масштабировать систему без увеличения задержек записи.
Протокол Zab
Zab (ZooKeeper Atomic Broadcast) — это протокол, обеспечивающий атомарную доставку сообщений и согласованность данных в кластере. Он состоит из двух фаз:
- Выборы лидера — при старте кластера или сбое лидера узлы выбирают нового лидера через голосование.
- Атомарная трансляция — лидер последовательно применяет изменения к своему состоянию и рассылает их последователям, которые подтверждают получение.
Модель данных
ZooKeeper использует иерархическую модель данных, напоминающую файловую систему. Основной элемент — znode (ZooKeeper node), который может хранить как данные (до 1 МБ), так и метаданные. Znode имеют уникальный путь, например /config/database.
Типы znode
- Persistent (постоянные) — существуют до явного удаления.
- Ephemeral (временные) — автоматически удаляются при завершении сессии клиента, который их создал.
- Sequential (последовательные) — к имени znode добавляется монотонно возрастающий номер, что позволяет создавать уникальные имена.
Watcher (наблюдатели)
ZooKeeper поддерживает механизм watcher — клиент может подписаться на изменения определённого znode (изменение данных, создание, удаление). При наступлении события сервер отправляет уведомление клиенту, что позволяет реализовать реактивные системы без постоянного опроса (polling).
Применение
ZooKeeper используется в качестве базового координационного сервиса для многих распределённых систем:
Управление конфигурацией
ZooKeeper хранит централизованные конфигурации для кластеров. При изменении конфигурации все узлы получают уведомления через watcher и обновляют свои настройки. Пример: Apache HBase использует ZooKeeper для хранения метаданных о регионах таблиц.
Синхронизация распределённых блокировок
С помощью эфемерных znode и последовательных номеров ZooKeeper реализует распределённые блокировки (distributed locks), которые гарантируют, что только один процесс выполняет критическую секцию. Это используется в системах обработки данных, таких как Apache Kafka, для управления партициями.
Выбор лидера (Leader Election)
В распределённых системах часто требуется выбрать один узел для выполнения координирующих задач. ZooKeeper предоставляет встроенный механизм выбора лидера через эфемерные znode. Например, в Apache Kafka ZooKeeper используется для выбора контроллера брокера.
Именование и обнаружение сервисов
ZooKeeper может выступать в роли реестра сервисов (service registry). Клиенты регистрируют свои адреса в виде znode, а другие клиенты находят их через watcher. Это альтернатива DNS для динамических кластеров.
Примеры использования
Apache Kafka
В Apache Kafka ZooKeeper используется для хранения метаданных о брокерах, топиках и партициях, а также для выбора контроллера кластера. Однако, начиная с версии 2.8, Kafka постепенно переходит на собственный протокол KRaft, снижая зависимость от ZooKeeper.
Apache HBase
HBase использует ZooKeeper для координации RegionServer, хранения метаданных таблиц и управления репликацией. ZooKeeper также отслеживает состояние узлов HBase через эфемерные znode.
Apache Solr
SolrCloud использует ZooKeeper для хранения конфигураций коллекций, управления шардами и обнаружения узлов. ZooKeeper обеспечивает согласованность данных при добавлении или удалении узлов.
Производительность и ограничения
ZooKeeper оптимизирован для операций чтения, которые могут выполняться на любом узле ансамбля. Запись, напротив, требует подтверждения от большинства узлов, что увеличивает задержку. Основные ограничения:
- Размер данных — znode не могут хранить более 1 МБ данных, что ограничивает использование ZooKeeper как хранилища больших объёмов.
- Скорость записи — из-за консенсуса Zab пропускная способность записи составляет несколько тысяч операций в секунду на кластер.
- Сложность настройки — для обеспечения отказоустойчивости требуется нечётное количество узлов (обычно 3 или 5), что увеличивает затраты на инфраструктуру.
Критика и альтернативы
ZooKeeper критикуется за сложность управления и ограниченную производительность записи. В качестве альтернатив используются:
- etcd — распределённое хранилище ключ-значение на основе протокола Raft, часто применяемое в Kubernetes.
- Consul — сервис с поддержкой DNS, проверок здоровья и хранения конфигураций.
- Apache Curator — библиотека-обёртка над ZooKeeper, упрощающая реализацию распределённых блокировок и выборов лидера.
Интересные факты
- Название ZooKeeper (смотритель зоопарка) символизирует роль сервиса в управлении «зоопарком» распределённых приложений.
- ZooKeeper используется в проектах с открытым исходным кодом, таких как Apache Hadoop, Apache Spark, Apache Storm, Apache Flume, а также в коммерческих продуктах, включая Cloudera и Hortonworks.
- В 2019 году ZooKeeper получил поддержку TLS для шифрования трафика между клиентами и серверами, что повысило безопасность в корпоративных средах.
Источники
- Apache ZooKeeper Documentation, официальная документация проекта.
- «ZooKeeper: Wait-free Coordination for Internet-scale Systems» — статья разработчиков Yahoo! (2010).
- «Zab: High-performance broadcast for primary-backup systems» — описание протокола Zab.
- Книга «ZooKeeper: Distributed Process Coordination» (Flavio Junqueira, Benjamin Reed, 2013).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →