Ответ
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.