Apache ZooKeeper: как работают записи

Apache ZooKeeper - это своего рода высокодоступный хранилище данных для небольших объектов. Кластер ZooKeeper состоит из некоторых узлов, которые сохраняют весь набор данных в своей памяти. Набор данных называется "всегда согласованным", поэтому каждый node имеет одинаковые данные в каждый момент времени.

В соответствии с документацией и сообщения в блоге, каждый node в кластере может отвечать на чтение и принимать записи.

  • Считывание всегда выполняется локально с помощью node, поэтому связь с кластером не выполняется.
  • Записи пересылаются назначенному "Лидеру" node, который пересылает запрос на запись всем узлам и ждет их ответов. Если отвечает хотя бы половина узлов, запись считается успешной.

Вопрос: Почему для лидера достаточно ждать, пока половина узлов ответит? Если кто-то подключается к одному из узлов, которые не получили обновление, он получает устаревший результат (только локальный считывает локальное значение).

Ответы

Ответ 1

Для достижения высокой доступности для чтения Zookeeper гарантирует слабую согласованность над репликами: на чтение всегда может быть ответ клиентом node, и ответ, который может быть возвращен, может быть устаревшим (даже новая версия имеет было совершено через лидера).

Тогда ответственность пользователей заключается в том, чтобы решить, является ли ответ на чтение "устаревшим" или нет, поскольку не все приложения требуют актуальной информации. Таким образом, предоставляются следующие варианты:

1) Если вашему приложению не нужны обновленные значения для чтения, вы можете получить высокую доступность для чтения, запросив данные непосредственно у клиента.

2) Если вашему приложению требуются обновленные значения для чтения, вы должны использовать API-интерфейс "sync" перед запросом на чтение, чтобы синхронизировать клиентскую версию с лидером.

Итак, Zookeeper предоставляет настраиваемую гарантию согласованности, и пользователи могут выбирать баланс между доступностью и согласованностью.

Если вы хотите узнать больше о внутренних компонентах Zookeeper, я рекомендую этот документ: ZooKeeper: Координация бездействия для систем интернет-масштаба. Вышеупомянутая стратегия описана в разделе 4.4.