Parâmetros do Raft
| Item | Valor |
|---|---|
| Intervalo de heartbeat | 500ms (cluster_heartbeat_ms) |
| Tempo para declarar não resposta | 2000ms (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ção | 1750–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íder | medido: 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ós | 3 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ó |
| Bootstrap | 500ms após a inicialização, todo nó se inicializa com a mesma membership — ignorado se estiver entrando em um cluster já inicializado |
| Armazenamento de log | em memória (volátil) — um nó reiniciado se recupera via replicação/snapshot |
| Detecção de expiração do lease | o líder verifica a cada 100ms e confirma (commit) o Expire via consenso |
Granularidade do timeout de wait | o timeout de espera (T) também é decidido no mesmo tick de 100ms — pode chegar com até 100ms de atraso |
| Aviso de troca de líder | quando 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 / T | Janela de detecção | Pior atraso ao matar o líder (medido) | Ambiente recomendado |
|---|---|---|---|
| 100ms / 600ms | 450–600ms | cerca de 0,9s | mesmo rack / mesma AZ, latência muito estável |
| 100ms / 1000ms | 750–1000ms | cerca de 1,2s | mesma AZ |
| 250ms / 2500ms | 1875–2500ms | cerca de 2,8s | múltiplas AZs |
| 500ms / 2000ms | 1750–2000ms | cerca de 2,4s | padrão — equilíbrio para múltiplas AZs |
| 500ms / 5000ms | 3750–5000ms | cerca de 5,3s | entre 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_msprecisa 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ós | Maioria | Falhas simultâneas toleradas |
|---|---|---|
| 2 | 2 | 0 — uma única falha para o cluster. Não é melhor que o modo single |
| 3 | 2 | 1 |
| 4 | 3 | 1 — igual a 3 nós, só custa mais |
| 5 | 3 | 2 |
Resumo do Comportamento em Falhas
| Situação | Comportamento |
|---|---|
| Requisição de cliente a um nó não-líder | M (endereço do líder), ou E no_leader se o líder for desconhecido |
| Falha do líder | novo 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íder | requisiçõ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 perdida | commits 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.