Выбор лидера в 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) Изменение статуса сервера. Так же, как в процессе запуска.