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

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:

Сессии и тайм-ауты

Клиенты ZooKeeper устанавливают с кластером сессию. Каждая сессия имеет тайм-аут (обычно от 2 до 20 секунд). Если клиент не отправляет серверу heartbeat в течение этого времени, сессия считается завершённой, а все созданные в её рамках временные znodes удаляются. Это позволяет реализовывать механизмы обнаружения сбоев и автоматического освобождения ресурсов.

Наблюдатели (Watchers)

ZooKeeper предоставляет механизм уведомлений — watchers. Клиент может установить наблюдателя на znode и получать уведомления при изменении данных или структуры этого узла (например, при создании, удалении или изменении содержимого). Watcher срабатывает однократно, после чего его необходимо переустанавливать. Это позволяет строить системы, реагирующие на изменения конфигурации или состояния.

История

ZooKeeper был разработан в компании Yahoo! для решения проблем координации в распределённых системах. Первоначальная версия появилась в 2008 году. В 2010 году проект был передан в Apache Software Foundation, где получил статус инкубатора, а в 2011 году стал проектом верхнего уровня (Top-Level Project). Основные версии:

Применение

ZooKeeper используется в качестве центрального координатора в следующих системах:

Классификация

ZooKeeper можно классифицировать по следующим признакам:

Устройство и характеристики

Репликация

Данные в 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 имеет ряд недостатков:

В последние годы появились альтернативные решения, такие как etcd (разработанный компанией CoreOS, ныне часть CNCF) и Consul (разработанный компанией HashiCorp), которые предлагают схожий функционал, но с более современной архитектурой и лучшей поддержкой HTTP/REST API.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →