Выбор лидера в ZooKeeper
|
ПРИМЕЧАНИЕ
Концепции и основные компоненты ZooKeeper описаны в статье Архитектура ZooKeeper. |
ZooKeeper — централизованный сервис, использующийся для хранения информации о конфигурации сервисов.
Атомарная система обмена сообщениями, лежащая в основе ZooKeeper, основана на принципах алгоритма консенсуса.
Алгоритм консенсуса — совокупность принципов и правил, благодаря которым все участвующие в кластере узлы (ноды) автоматически приходят к консенсусу о текущем состоянии сети.
ZooKeeper реализует один из протоколов алгоритма консенсуса — ZAB (ZooKeeper Atomic BroadCast).
Протокол алгоритма консенсуса
Протокол ZAB гарантирует, что репликация ZooKeeper выполняется по порядку, а также отвечает за выбор ведущих узлов и восстановление любых отказавших узлов.
Ниже описаны основные положения ZAB.
Обмен сообщениями
В части обмена сообщениями ZAB использует следующие понятия:
-
Пакет (packet) — последовательность байтов, отправляемых по каналу FIFO.
-
Сообщение (message) — последовательность байтов, которая будет атомарно транслироваться на все серверы ZooKeeper. Сообщение помещается в предложение и согласовывается до того, как оно будет доставлено.
-
Предложение (proposal) — единица согласования. Предложения согласовываются путем обмена пакетами при наличии кворума серверов ZooKeeper.
Ниже показана модель обмена сообщениями, основанная на согласовании предложений, принятая в ZooKeeper.
Для связи с репликами при согласовании предложений используется модель, в которой для каждой новой записи требуется не менее трех транзакций: предложение (propose), подтверждение (ack) и фиксация (commit).
Принципы доставки сообщений
Протокол ZAB предполагает создание каналов FIFO (в каждой сессии сервер исполняет запросы клиента поочередно в порядке поступления) типа "точка-точка" между серверами. Для связи используется протокол TCP, обеспечивая следующие свойства:
-
Надежная доставка — если сообщение
mдоставляется одним сервером, оно в конечном итоге будет доставлено всеми серверами. -
Общий заказ — если сообщение
aдоставлено до сообщенияbодним сервером, тоaбудет доставлено доbвсеми серверами. Если сообщенияaиbдоставлены, то либоaбудет доставлено раньшеb, либоbбудет доставлено раньшеa. -
Причинный порядок — если сообщение
bотправляется после того, как сообщениеaбыло доставлено отправителемb, сообщениеaдолжно быть заказано доb. Если отправитель отправляетcпосле отправкиb,cдолжно быть заказано послеb. -
Заказанная доставка — данные доставляются в том же порядке, в котором они были отправлены, и сообщение
mдоставляется только после того, как все сообщения, отправленные доm, были доставлены. Следствием этого является то, что если сообщениеmпотеряно, все сообщения послеmбудут потеряны. -
Нет сообщения после закрытия — как только канал FIFO закрыт, от него не будут приниматься никакие сообщения.
Использование тайм-аутов обеспечивает достижения консенсуса при наличии сбоев.
Эпоха контроллера
Каждый кластер имеет один ведущий узел (Leader), а остальные узлы являются последователями (Follower).
Ниже приведена общая последовательность выбора лидера.
-
От сервера поступает предложение (propose) новой эпохи и каждому предложению присваивается свой zxid.
-
Каждый узел подтверждает (ack) предложение только в том случае, если он не знает ни одного другого лидера с более высоким номером эпохи в составе zxid, или, если эпоха такая же, с более высоким счетчиком транзакции. Прежде чем лидер будет выбран, он должен собрать голоса от кворума узлов. Кворумы для определения лидера должны иметь размер
(n/2+1), гдеn— количество серверов, составляющих сервис ZooKeeper. -
После подтверждения кворума новый лидер совершает (commit) создание новой эпохи и устанавливает следующий zxid для использования.
-
Последователь зафиксирует становление новой эпохи.
Ниже описаны все фазы эпохи контроллера.
Каждая эпоха состоит из трех фаз, и каждый узел может находиться в одной из этих трех фаз в любой момент времени:
-
Leader election — фаза выбора лидера по текущим конфигурациям кворума. В любой момент времени может быть не более одного лидера. Окончание фазы наступает после подтверждения новой эпохи всем последователями.
-
Synchronization — фаза синхронизации, во время которой новый лидер синхронизирует имеющиеся реплики с предыдущей эпохой и со всеми последователями (followers) как лидер. Окончание фазы наступает после того, как кворум последователей признал, что они синхронизированы с лидером.
-
Broadcast — фаза трансляции, нормальный режим работы, при котором лидер продолжает предлагать новые клиентские запросы. Окончание фазы наступает после сбоя лидера.