Entendendo o Raft: Algoritmo de Consenso para Sistemas Distribuídos
Em um mundo cada vez mais conectado, os sistemas distribuídos desempenham um papel crucial em garantir a disponibilidade, confiabilidade e integridade dos serviços. No entanto, coordenar e manter a consistência entre múltiplos nós em um ambiente distribuído é uma tarefa complexa. É aqui que entra o Raft, um algoritmo de consenso projetado para simplificar e tornar mais compreensível o processo de manter a consistência entre os nós de um sistema distribuído.
A grande maioria dos serviços distribuidos que formam um "mini cluster" utilizam alguma forma de coordenação. O mais comum é usar o Zookeper que vem sendo substituído pelo Raft.
Ferramentas como Vault, Kafka, Consul, ETCD, Splunk, RabbitMQ, databases e muitas outras já utilizam o Raft.
O que é Raft?
O Raft é um algoritmo de consenso distribuído, concebido para facilitar a replicação consistente de dados entre os nós de um sistema distribuído.
O Raft simplifica o processo de consenso dividindo-o em três partes principais:
- Eleição de Líder: Um dos nós no sistema é eleito como líder, sendo responsável por coordenar e controlar as operações de escrita no sistema.
- Replicação de Logs: Todas as mudanças no estado do sistema são registradas em um log replicado em todos os nós. O líder é responsável por replicar esses logs e garantir que todos os nós estejam atualizados.
- Segurança da Eleição: O Raft utiliza um processo de eleição para garantir que apenas um líder seja eleito a qualquer momento. Se o líder falhar, um novo líder é eleito para substituí-lo.
Uma leitura muito mais aprofundada sobre o assunto pode ser encontrada em https://raft.github.io/raft.pdf.
Processo de Eleição
No início, todos os nós estão em um estado de eleição. Quando um nó percebe que não há líder ativo, inicia uma eleição. O processo de eleição envolve vários estágios:
- Candidatura: O nó candidato solicita votos de outros nós. Um nó só pode votar em um candidato se ainda não tiver votado em outro candidato na mesma eleição.
- Votação: Se um nó ainda não votou em um candidato nesta eleição e considera o candidato legítimo, concede seu voto ao candidato.
- Eleição de Líder: Um candidato ganha a eleição se receber votos da
maioria
dos nós. Uma vez eleito, ele se torna o líder e inicia a replicação de logs.
Entre no link https://raft.github.io/ e simule parada de nós e observando o que acontece, como é uma eleição caso o nó lider pare. É possível clicar nos servers e fazer um stop ou uma simualção de timeout.
Sugestões:
- Pare o nó lider e observe uma nova votação acontecendo. Veja que todos os nós se tentam ser o lider, mas aquele que se promoveu primeiro acaba virando o lider.
- Esse cluster possui 5 nós sendo tolerante a duas falhas. Pare pelo menos 2 nós e veja o resultado.
- Pare o terceiro nó (O líder) sendo que dessa vez fique com somente 2 nós sem lider e veja o que acontece na votação.
Quorum
No Raft, uma decisão só é considerada válida se a maioria dos nós concordar com ela. Esse conceito é conhecido como Quorum
. O Quorum é essencial para garantir que as operações de escrita sejam seguras e que o sistema permaneça consistente, mesmo em caso de falhas de nós.
Por exemplo, se um cluster Raft tiver 5 nós, uma operação de escrita só será considerada válida se pelo menos 3 nós (a maioria) concordarem com ela. Isso significa que, mesmo se um nó falhar ou estiver inacessível, o sistema ainda poderá continuar operando desde que a maioria dos nós esteja funcionando corretamente.
A fórmula para o tamanhos do quorum é QuorumSize=(NumNodes/2)+1
.
Para conferir a quantidade de falhas possíveis temos a fórmula FairuleTolerance = NumNodes - QuorumSize
ou FairuleTolerance = NumNodes - (NumNodes/2)+1
.
Número de Nós | Quorum Size | Tolerância a falha |
---|---|---|
1 | 1 | 0 |
2 | 2 | 0 |
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 4 | 3 |
Podemos observar que o mínimo necessário para que seja possível ter uma falha é 3. Para ter duas falhas é 5 e para ter três falhas é 7. Quantidade de nodes como 2,4 e 6 podem existir, mas não é aproveitado.
Quanto maior o número de nós menor a performance, uma vez que é necessária a aprovação da maioria. Uma sistema simples usaria 3 nós, uma sistema mais complexo 5 e um sistema crítico 7. Acima disso a performance começa a diminuir consideravelmente.
Vale a pena dar uma olhada como funciona o Raft explicado visualmente no link https://thesecretlivesofdata.com/raft/