Выбор лидера в 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).

Для гарантии общего порядка предложений используется идентификатор транзакции ZooKeeper - zxid.

Zxid состоит из двух частей: номера эпохи и счетчика транзанкции.

Zxid является 64-битным числом — старшие 32 бита для номера эпохи и младшие 32 бита для счетчика транзакции.

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

Ниже приведена общая последовательность выбора лидера.

Выбор лидера в ZooKeeper
Выбор лидера в ZooKeeper
Выбор лидера в ZooKeeper
Выбор лидера в ZooKeeper
  1. От сервера поступает предложение (propose) новой эпохи и каждому предложению присваивается свой zxid.

  2. Каждый узел подтверждает (ack) предложение только в том случае, если он не знает ни одного другого лидера с более высоким номером эпохи в составе zxid, или, если эпоха такая же, с более высоким счетчиком транзакции. Прежде чем лидер будет выбран, он должен собрать голоса от кворума узлов. Кворумы для определения лидера должны иметь размер (n/2+1), где n — количество серверов, составляющих сервис ZooKeeper.

  3. После подтверждения кворума новый лидер совершает (commit) создание новой эпохи и устанавливает следующий zxid для использования.

  4. Последователь зафиксирует становление новой эпохи.

Ниже описаны все фазы эпохи контроллера.

Эпоха контроллера
Эпоха контроллера
Эпоха контроллера
Эпоха контроллера

Каждая эпоха состоит из трех фаз, и каждый узел может находиться в одной из этих трех фаз в любой момент времени:

  • Leader election — фаза выбора лидера по текущим конфигурациям кворума. В любой момент времени может быть не более одного лидера. Окончание фазы наступает после подтверждения новой эпохи всем последователями.

  • Synchronization — фаза синхронизации, во время которой новый лидер синхронизирует имеющиеся реплики с предыдущей эпохой и со всеми последователями (followers) как лидер. Окончание фазы наступает после того, как кворум последователей признал, что они синхронизированы с лидером.

  • Broadcast — фаза трансляции, нормальный режим работы, при котором лидер продолжает предлагать новые клиентские запросы. Окончание фазы наступает после сбоя лидера.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней