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.
0Term atual
Líder
5/5Nós vivos
0Entradas commitadas
follower candidate leader down
Regra (cluster de N=5)Valor
Maioria (quórum) ⌊N/2⌋+13
Falhas toleradas ⌊(N-1)/2⌋2
Líderes simultâneos por term0 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

type Entry struct { Term int; Cmd string }

type Raft struct {
    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 { return false }
    if r.votedFor == -1 || r.votedFor == cand {
        r.votedFor = cand
        return true
    }
    return false
}

// 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.