Выбор лидера в Zookeeper состоит из двух фаз: одна — выбор лидера при запуске сервера, а другая — когда сервер-лидер выходит из строя во время работы. Прежде чем анализировать принцип выборов, сначала представим несколько важных параметров.

  • Идентификатор сервера (myid): чем больше число, тем больше вес в алгоритме выборов.
  • Идентификатор транзакции (zxid): чем больше значение, тем новее данные и тем больше вес.
  • Логические часы (epoch-logicalclock): значения логических часов одинаковы в одном и том же раунде голосования, и значение увеличивается после завершения каждого голосования.

Статус выборов:

  • LOOKING: состояние предвыборной кампании
  • FOLLOWING: состояние последователя, синхронизирует состояние лидера, участвует в голосовании.
  • OBSERVING: состояние наблюдателя, синхронизирует состояние лидера, не участвует в голосовании.
  • LEADING: состояние лидера

1. Выборы лидера при запуске сервера

Когда каждый узел запускается, он находится в состоянии LOOKING (наблюдения), после чего начинается основной процесс выборов. Здесь мы рассмотрим в качестве примера кластер, состоящий из трёх машин. Когда запускается первый сервер, server1, выборы лидера не могут быть выполнены. Когда запускается второй сервер, server2, эти две машины могут взаимодействовать друг с другом и вступают в процесс выборов лидера.

  • (1) Каждый сервер отправляет свой голос. Поскольку это начальная ситуация, server1 и server2 оба голосуют за себя как за сервер-лидер. Каждый голос содержит myid, zxid и epoch рекомендуемого сервера, представленные в виде (myid, zxid). В это время голос server1 равен (1,0), голос server2 равен (2,0), после чего каждый отправляет свой голос другим машинам в кластере.

  • (2) Получение голосов от каждого сервера. После того как каждый сервер в кластере получает голос, он сначала проверяет корректность голоса, например, проверяет, является ли он голосом текущего раунда (epoch) и исходит ли он от сервера в состоянии LOOKING.

  • (3) Обработка голосов по отдельности. Для каждого голоса сервер должен сравнить голоса других серверов со своим голосом. Правила сравнения следующие:

    • a. Сначала сравнивается epoch.
    • b. Проверяется zxid. Сервер с большим zxid предпочтительнее в качестве лидера.
    • c. Если zxid одинаков, сравните myid. Сервер с большим myid становится сервером-лидером.
  • (4) Подсчет голосов. После каждого голосования сервер подсчитывает информацию о голосовании и определяет, получили ли более половины машин одинаковую информацию о голосовании. И server1, и server2 определяют, что две машины в кластере приняли голос (2,0), поэтому server2 был выбран в качестве узла-лидера.

  • (5) Изменение статуса сервера. Как только лидер определен, каждый сервер соответствующим образом обновляет свой статус. Если он является follower, он переходит в FOLLOWING; если он является лидером, он переходит в LEADING. В это время server3 запускается и сразу присоединяется, меняя свой статус на FOLLOWING.

2. Выборы лидера во время работы

Когда сервер-лидер в кластере аварийно завершает работу или становится недоступным, весь кластер не может предоставлять услуги извне и вступает в новый раунд выборов лидера.

  • (1) Изменение статуса. После падения лидера другие серверы, не являющиеся Observer, меняют свой статус сервера на LOOKING.
  • (2) Каждый сервер отправляет голос. Во время работы zxid на каждом сервере может отличаться.
  • (3) Обработка голосов. Правила такие же, как в процессе запуска.
  • (4) Подсчет голосов. Так же, как в процессе запуска.
  • (5) Изменение статуса сервера. Так же, как в процессе запуска.