Atualmente em testes: o código do GitHub será aberto quando concluído.

Parâmetros do Raft

ItemValor
Intervalo de heartbeat500ms (cluster_heartbeat_ms)
Tempo para declarar não resposta2000ms (cluster_election_timeout_ms) — se o heartbeat ficar ausente por esse tempo, o líder é dado como morto
Janela real de início da eleição1750–2000ms — sorteada aleatoriamente em cada nó para evitar candidatos simultâneos (split vote). O pior caso é exatamente o tempo de não resposta configurado
Parada do cliente na falha do lídermedido: tempo de não resposta + 0,3–0,5s (cerca de 2,3–2,5s nos valores padrão) — detecção mais um redirecionamento
Número de nós3 ou 5 (aplicado no carregamento da configuração — qualquer outro valor recusa iniciar)
ID do nósua posição (cluster_self) na lista cluster_peers — por isso a ordem da lista deve ser idêntica em todo nó
Bootstrap500ms após a inicialização, todo nó se inicializa com a mesma membership — ignorado se estiver entrando em um cluster já inicializado
Armazenamento de logem memória (volátil) — um nó reiniciado se recupera via replicação/snapshot
Detecção de expiração do leaseo líder verifica a cada 100ms e confirma (commit) o Expire via consenso
Granularidade do timeout de waito timeout de espera (T) também é decidido no mesmo tick de 100ms — pode chegar com até 100ms de atraso
Aviso de troca de líderquando o líder muda, um L é enviado imediatamente a todos os clientes conectados

Como Escolher o Heartbeat e o Tempo de Não Resposta

Ambos os valores são ajustados na configuração por cluster_heartbeat_ms e cluster_election_timeout_ms. O tempo de não resposta (T) é exatamente o tempo em que o serviço fica parado quando o líder falha; por outro lado, um valor curto demais faz um líder vivo ser julgado morto, provocando eleições desnecessárias.

heartbeat / TJanela de detecçãoPior atraso ao matar o líder (medido)Ambiente recomendado
100ms / 600ms450–600mscerca de 0,9smesmo rack / mesma AZ, latência muito estável
100ms / 1000ms750–1000mscerca de 1,2smesma AZ
250ms / 2500ms1875–2500mscerca de 2,8smúltiplas AZs
500ms / 2000ms1750–2000mscerca de 2,4spadrão — equilíbrio para múltiplas AZs
500ms / 5000ms3750–5000mscerca de 5,3sentre regiões, latência com grandes oscilações
  • A latência em operação normal não é afetada por esses valores (a p50 medida não muda) — eles determinam apenas o tempo de recuperação em caso de falha.
  • A queda de um seguidor não afeta os clientes com nenhum dos valores. Os atrasos acima só ocorrem quando o líder cai.
  • Restrições: cluster_election_timeout_ms precisa ser de no mínimo 600ms e pelo menos 4× o heartbeat. (Foi medido que um único atraso de escalonamento sob carga consegue engolir dois heartbeats inteiros.)

Por Que 3 ou 5 Nós

Um commit precisa de uma maioria. Uma configuração com número par de nós apenas aumenta o custo sem aumentar a tolerância a falhas, então o servidor a recusa.

Número de nósMaioriaFalhas simultâneas toleradas
220 — uma única falha para o cluster. Não é melhor que o modo single
321
431 — igual a 3 nós, só custa mais
532

Resumo do Comportamento em Falhas

SituaçãoComportamento
Requisição de cliente a um nó não-líderM (endereço do líder), ou E no_leader se o líder for desconhecido
Falha do lídernovo líder eleito dentro do tempo de não resposta configurado (1750–2000ms por padrão). Requisições durante essa janela recebem E no_leader → o cliente tenta novamente
No meio de uma troca de líderrequisições de aquisição pendentes são limpas com M/E no_leader, e o cliente tenta novamente contra o novo líder
Reinício de nóinicia com estado vazio → se atualiza via replicação de log/snapshot de um par
Maioria perdidacommits se tornam impossíveis → escritas param (segurança em primeiro lugar), retomando automaticamente assim que a maioria é restaurada

Terminologia

  • Quorum — mais da metade de todos os nós (2 de 3, ou 3 de 5). Como qualquer decisão exige o acordo do quorum, dois grupos particionados nunca conseguem confirmar decisões conflitantes ao mesmo tempo.
  • Timeout de eleição — por quanto tempo um seguidor espera sem um heartbeat antes de concluir que o líder morreu e iniciar uma eleição. Randomizado por nó para reduzir candidaturas simultâneas.