Skip to main content

Entendendo o Raft: Algoritmo de Consenso para Sistemas Distribuídos

· 4 min read
David Puziol Prata
DevOps at @ Encora

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.

alt text

alt text

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ósQuorum SizeTolerância a falha
110
220
321
431
532
642
743

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/