Entendiendo Raft: Algoritmo de Consenso para Sistemas Distribuidos
En un mundo cada vez más conectado, los sistemas distribuidos desempeñan un papel crucial en garantizar la disponibilidad, confiabilidad e integridad de los servicios. Sin embargo, coordinar y mantener la consistencia entre múltiples nodos en un ambiente distribuido es una tarea compleja. Es aquí donde entra Raft, un algoritmo de consenso diseñado para simplificar y hacer más comprensible el proceso de mantener la consistencia entre los nodos de un sistema distribuido.
La gran mayoría de los servicios distribuidos que forman un "mini clúster" utilizan alguna forma de coordinación. Lo más común es usar Zookeeper que está siendo reemplazado por Raft.
Herramientas como Vault, Kafka, Consul, ETCD, Splunk, RabbitMQ, bases de datos y muchas otras ya utilizan Raft.
¿Qué es Raft?
Raft es un algoritmo de consenso distribuido, concebido para facilitar la replicación consistente de datos entre los nodos de un sistema distribuido.
Raft simplifica el proceso de consenso dividiéndolo en tres partes principales:
- Elección de Líder: Uno de los nodos en el sistema es elegido como líder, siendo responsable de coordinar y controlar las operaciones de escritura en el sistema.
- Replicación de Logs: Todos los cambios en el estado del sistema son registrados en un log replicado en todos los nodos. El líder es responsable de replicar estos logs y garantizar que todos los nodos estén actualizados.
- Seguridad de la Elección: Raft utiliza un proceso de elección para garantizar que solo un líder sea elegido en cualquier momento. Si el líder falla, un nuevo líder es elegido para reemplazarlo.
Una lectura mucho más profunda sobre el asunto puede encontrarse en https://raft.github.io/raft.pdf.
Proceso de Elección
Al principio, todos los nodos están en un estado de elección. Cuando un nodo percibe que no hay líder activo, inicia una elección. El proceso de elección involucra varios estadios:
- Candidatura: El nodo candidato solicita votos de otros nodos. Un nodo solo puede votar por un candidato si aún no ha votado por otro candidato en la misma elección.
- Votación: Si un nodo aún no ha votado por un candidato en esta elección y considera al candidato legítimo, concede su voto al candidato.
- Elección de Líder: Un candidato gana la elección si recibe votos de la
mayoría
de los nodos. Una vez elegido, se convierte en el líder e inicia la replicación de logs.
Entra en el enlace https://raft.github.io/ y simula la parada de nodos y observa lo que sucede, cómo es una elección si el nodo líder se detiene. Es posible hacer clic en los servidores y hacer un stop o una simulación de timeout.
Sugerencias:
- Para el nodo líder y observa una nueva votación ocurriendo. Ve que todos los nodos intentan ser el líder, pero aquel que se promovió primero acaba convirtiéndose en el líder.
- Este clúster tiene 5 nodos siendo tolerante a dos fallas. Para al menos 2 nodos y ve el resultado.
- Para el tercer nodo (el líder) siendo que esta vez quédate con solo 2 nodos sin líder y ve qué pasa en la votación.
Quórum
En Raft, una decisión solo es considerada válida si la mayoría de los nodos está de acuerdo con ella. Este concepto es conocido como Quórum
. El Quórum es esencial para garantizar que las operaciones de escritura sean seguras y que el sistema permanezca consistente, incluso en caso de fallas de nodos.
Por ejemplo, si un clúster Raft tiene 5 nodos, una operación de escritura solo será considerada válida si al menos 3 nodos (la mayoría) están de acuerdo con ella. Esto significa que, incluso si un nodo falla o está inaccesible, el sistema aún podrá continuar operando siempre que la mayoría de los nodos esté funcionando correctamente.
La fórmula para el tamaño del quórum es QuorumSize=(NumNodes/2)+1
.
Para verificar la cantidad de fallas posibles tenemos la fórmula FailureTolerance = NumNodes - QuorumSize
o FailureTolerance = NumNodes - (NumNodes/2)+1
.
Número de Nodos | Tamaño de Quórum | Tolerancia a fallos |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 4 | 3 |
Podemos observar que el mínimo necesario para que sea posible tener una falla es 3. Para tener dos fallas es 5 y para tener tres fallas es 7. Cantidad de nodos como 2,4 y 6 pueden existir, pero no se aprovecha.
Cuanto mayor el número de nodos menor el rendimiento, ya que es necesaria la aprobación de la mayoría. Un sistema simple usaría 3 nodos, un sistema más complejo 5 y un sistema crítico 7. Por encima de eso el rendimiento comienza a disminuir considerablemente.
Vale la pena echar un vistazo a cómo funciona Raft explicado visualmente en el enlace https://thesecretlivesofdata.com/raft/