Что такое Apache ZooKeeper и для чего он используется в распределенных системах?

«Что такое Apache ZooKeeper и для чего он используется в распределенных системах?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Apache ZooKeeper — это высокодоступный сервис для координации распределенных приложений. Он предоставляет централизованное хранилище конфигурационной информации, механизмы синхронизации и именования.

Ключевые абстракции и особенности:

  • Иерархическое пространство имен: Данные хранятся в виде дерева znodes, аналогичного структуре файловой системы.
  • Типы узлов:
    • Persistent — существуют до явного удаления.
    • Ephemeral — удаляются при отключении клиентской сессии (для реализации блокировок и обнаружения живых узлов).
    • Sequential — к имени автоматически добавляется монотонно возрастающий номер (для реализации очередей).
  • Гарантии: Линейная запись, атомарность операций, надежность, своевременность.
  • Watches: Клиенты могут подписываться на уведомления об изменениях в конкретных znode.
  • Архитектура: Кластер (ансамбль) из нечетного числа серверов, работающих по консенсусному протоколу Zab. Клиент подключается к любому серверу.

Пример использования для хранения конфигурации (Java API):

ZooKeeper zk = new ZooKeeper("zk-server:2181", 2000, null);

// Создание узла с конфигурацией
String configPath = "/app/config";
String configData = "{ "maxConnections": 100 }";
zk.create(configPath, configData.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

// Чтение конфигурации с подпиской на изменения (watch)
byte[] data = zk.getData(configPath, event -> {
    if (event.getType() == Event.EventType.NodeDataChanged) {
        System.out.println("Конфигурация обновлена!");
        // Перечитать данные
    }
}, null);

Типичные сценарии использования: сервис обнаружения (Service Discovery), централизованное управление конфигурацией, распределенные блокировки, выбор лидера (leader election). Является критическим компонентом таких систем, как Apache Kafka, Apache Hadoop, Apache HBase.