La elección de líder de Zookeeper tiene dos fases: una es la elección de líder al iniciar el servidor, y la otra es cuando el servidor líder se cae durante el funcionamiento. Antes de analizar el principio de elección, se presentan primero algunos parámetros importantes.
- ID de servidor (myid): cuanto mayor es el número, mayor es el peso en el algoritmo de elección.
- ID de transacción (zxid): cuanto mayor es el valor, más nuevos son los datos y mayor es el peso.
- Reloj lógico (epoch-logicalclock): el valor del reloj lógico es el mismo durante el mismo proceso de votación, y el valor aumenta después de cada votación.
Estado de elección:
- LOOKING: Estado de candidatura
- FOLLOWING: Estado de seguidor, sincroniza el estado del líder y participa en la votación.
- OBSERVING: Estado de observador, sincroniza el estado del líder y no participa en la votación.
- LEADING: Estado de líder
1、Elección de líder al iniciar el servidor
Cada nodo está en estado LOOKING al iniciarse, y a continuación comienza el proceso principal de elección. Aquí se toma como ejemplo un clúster de tres máquinas. Cuando se inicia la primera máquina server1, no se puede realizar la elección de líder; cuando se inicia la segunda máquina server2, las dos máquinas pueden comunicarse entre sí y entran en el proceso de elección de líder.
-
(1) Cada servidor emite un voto. Como es la situación inicial, tanto server1 como server2 se votan a sí mismos como servidor líder. Cada voto contiene el myid, zxid y epoch del servidor recomendado, representado por (myid, zxid). En este momento, el voto de server1 es (1,0), el voto de server2 es (2,0), y luego cada uno envía su voto a las otras máquinas del clúster.
-
(2) Recibir votos de cada servidor. Después de que cada servidor del clúster recibe un voto, primero juzga la validez del voto, por ejemplo, verifica si es de esta ronda de votación (epoch) y si proviene de un servidor en estado LOOKING.
-
(3) Procesar los votos respectivamente. Para cada voto, el servidor debe comparar los votos de otros servidores con su propio voto. Las reglas de comparación son las siguientes:
- a. Comparar primero el epoch
- b. Revisar el zxid; el servidor con mayor zxid tiene prioridad como líder.
- c. Si el zxid es el mismo, entonces se compara el myid; el servidor con mayor myid será el servidor líder.
-
(4) Contar los votos. Después de cada votación, el servidor cuenta la información de los votos para determinar si más de la mitad de las máquinas han recibido la misma información de voto. Tanto server1 como server2 cuentan que dos máquinas en el clúster han aceptado la información de voto (2,0). En este momento, se ha elegido a server2 como nodo líder.
-
(5) Cambiar el estado del servidor. Una vez que se determina el líder, cada servidor actualiza su propio estado en consecuencia. Si es un seguidor, cambia a FOLLOWING; si es un líder, cambia a LEADING. En este momento, server3 continúa iniciándose y directamente se une y cambia su estado a FOLLOWING.

2、Elección de líder durante el funcionamiento
Cuando el servidor líder del clúster se cae o no está disponible, todo el clúster no puede proporcionar servicios al exterior y entra en una nueva ronda de elección de líder.
- (1) Cambiar el estado. Después de que el líder se cae, los demás servidores que no son Observer cambian su propio estado de servidor a LOOKING.
- (2) Cada servidor emite un voto. Durante el funcionamiento, el zxid en cada servidor puede ser diferente.
- (3) Procesar los votos. Las reglas son las mismas que en el proceso de inicio.
- (4) Contar los votos. Igual que el proceso de inicio.
- (5) Cambiar el estado del servidor. Igual que el proceso de inicio.