Открыть сервис

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) — это протокол, обеспечивающий атомарную доставку сообщений и согласованность данных в кластере. Он состоит из двух фаз:

  1. Выборы лидера — при старте кластера или сбое лидера узлы выбирают нового лидера через голосование.
  2. Атомарная трансляция — лидер последовательно применяет изменения к своему состоянию и рассылает их последователям, которые подтверждают получение.

Модель данных

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 →