Camada Zero · 29 · Consenso & Eleição de Líder (Raft)
Como cinco máquinas que falham e se desconectam concordam numa única verdade? Raft resolve isso com eleição por maioria. Roda uma eleição aqui embaixo, derruba o líder, parte a rede, e olha o cluster reconvergir sem nunca aceitar dois líderes ao mesmo tempo.
O visualizador é interativo e fica muito melhor numa tela grande. Abra no desktop pra rodar e ver o custo acontecer. A teoria, o código em Go e o Desafio seguem aqui embaixo, dá pra ler tranquilo no celular.
0Term atual
—Líder
5/5Nós vivos
0Entradas commitadas
followercandidateleaderdown
Regra (cluster de N=5)
Valor
Maioria (quórum) ⌊N/2⌋+1
3
Falhas toleradas ⌊(N-1)/2⌋
2
Líderes simultâneos por term
0 ou 1
Raft elege um líder único por term. Só commita uma entrada quando a maioria dos nós confirma. Como duas maiorias sempre se cruzam em pelo menos um nó, é impossível dois líderes commitarem coisas diferentes no mesmo term. É isso que mata o split-brain. Roda em produção no etcd (control plane do Kubernetes), Consul, CockroachDB e no Kafka moderno (KRaft).
Estado de um nó Raft em Go
typeEntrystruct { Term int; Cmd string }
typeRaftstruct {
currentTerm int// relógio lógico, sempre cresce
votedFor int// em quem votei neste term (-1 = ninguém)
log []Entry // entradas replicadas
state string// follower | candidate | leader
}
// Candidato pede voto. Concede se o term dele não é antigo// e eu ainda não votei neste term.func (r *Raft) RequestVote(term, cand int) bool {
if term < r.currentTerm { returnfalse }
if term > r.currentTerm { r.currentTerm = term; r.votedFor = -1 } // term novo: zera o votoif r.votedFor == -1 || r.votedFor == cand {
r.votedFor = cand
returntrue
}
returnfalse
}
// Líder replica entradas e serve de heartbeat.func (r *Raft) AppendEntries(term int, e []Entry) bool
🧠 Desafio — Consenso & Raft
Mexe no cluster aqui de cima antes de responder (elege, derruba o líder, parte a rede). As duas últimas são de reflexão: escreve a sua e só então revela o modelo.