Как ZooKeeper обеспечивает последовательную согласованность - PullRequest
0 голосов
/ 25 июня 2018

В здесь кто-то сказал:

", даже если вы каждый раз читаете от другого последователя, вы никогда не будете см. версию 3 данных после просмотра версии 4. "

Итак, если у меня есть 3 узла кворума zookeeper, как показано ниже:

zk0 -- leader
zk1
zk2

Предположим, что в кворуме "3" есть значение, и у меня есть клиент, подключающийся к zk1, затем мой клиент отправляет запрос на запись (обновление "3" до "4"), а zk0 (лидер) пишет Значение затем впоследствии получил подтверждение от zk1. Мой клиент может видеть новый ("4"), потому что он подключается к zk1.

Теперь мой вопрос: если я переключу моего клиента с zk1 на zk2 (руководитель не получил подтверждения записи с zk2, поэтому zk2 находится за кворумом), я буду видеть значение как " 3 ", а не" 4 ". Это нарушает последовательную последовательность?

1 Ответ

0 голосов
/ 25 июня 2018

ZooKeeper использует специальный протокол атомарного обмена сообщениями под названием ZooKeeper Atomic Broadcast (ZAB) , который гарантирует, что локальные реплики в ансамбле (группы серверов Zookeeper) никогда не расходятся.

Протокол ZAB является атомарным, поэтому протокол гарантирует, что обновления будут либо успешными, либо неудачными.

В Zookeeper каждая запись проходит через лидера, а лидер генерирует идентификатор транзакции (называемый zxid ) и присваивает его этому запросу на запись.

Zxid - это длинное (64-битное) целое число, разделенное на две части:

  • эпоха
  • counter

Zxidпредставляет порядок, в котором записи применяются ко всем репликам. эпоха представляет изменения в лидерстве с течением времени.Эпохи относятся к периоду, в течение которого данный сервер осуществлял лидерство.В эпоху лидер транслирует предложения и идентифицирует каждое по счетчику.

Запись считается успешной, если лидер получает подтверждение от большинства.

zxid используется для синхронизации серверов и предотвращения описанного вами конфликта.

enter image description here

...