Actuellement en test : le code GitHub sera ouvert une fois terminé.

Paramètres Raft

ÉlémentValeur
Intervalle de battement de cœur500 ms (cluster_heartbeat_ms)
Délai de constat d'absence de réponse2000 ms (cluster_election_timeout_ms) — si le battement de cœur manque pendant ce délai, le leader est considéré comme mort
Fenêtre réelle de démarrage de l'élection1750-2000 ms — tirée au hasard sur chaque nœud pour éviter des candidatures simultanées (split vote). Le pire cas correspond exactement au délai de constat configuré
Arrêt côté client lors d'une panne du leadermesuré : délai de constat + 0,3-0,5 s (environ 2,3-2,5 s avec les valeurs par défaut) — détection plus une redirection
Nombre de nœuds3 ou 5 (imposé au chargement de la configuration — tout autre nombre refuse de démarrer)
ID de nœudsa position (cluster_self) dans la liste cluster_peers — c'est pourquoi l'ordre de la liste doit être identique sur chaque nœud
Bootstrap500 ms après le démarrage, chaque nœud s'initialise avec le même membership — ignoré si le nœud rejoint un cluster déjà initialisé
Stockage du journalen mémoire (volatile) — un nœud redémarré récupère via la réplication ou un snapshot
Détection d'expiration de leasele leader vérifie toutes les 100 ms et valide Expire via consensus
Granularité du timeout waitle timeout d'attente (T) est aussi décidé sur ce même cycle de 100 ms — il peut arriver avec jusqu'à 100 ms de retard
Avis de changement de leaderquand le leader change, un L est envoyé immédiatement à tous les clients connectés

Choisir le battement de cœur et le délai de constat

Les deux valeurs se règlent dans la configuration via cluster_heartbeat_ms et cluster_election_timeout_ms. Le délai de constat (T) correspond exactement au temps pendant lequel le service est à l'arrêt quand le leader tombe ; à l'inverse, une valeur trop courte fait juger mort un leader bien vivant et provoque des élections inutiles.

battement / TFenêtre de détectionPire latence à la mort du leader (mesurée)Environnement recommandé
100 ms / 600 ms450-600 msenviron 0,9 smême baie / même AZ, latence très stable
100 ms / 1000 ms750-1000 msenviron 1,2 smême AZ
250 ms / 2500 ms1875-2500 msenviron 2,8 splusieurs AZ
500 ms / 2000 ms1750-2000 msenviron 2,4 spar défaut — équilibre pour plusieurs AZ
500 ms / 5000 ms3750-5000 msenviron 5,3 sinter-régions, latence très fluctuante
  • La latence en fonctionnement normal n'est pas affectée par ces valeurs (la p50 mesurée ne change pas) — elles ne déterminent que le temps de rétablissement en cas de panne.
  • La chute d'un suiveur n'a d'impact sur les clients avec aucune de ces valeurs. Les latences ci-dessus ne surviennent que lorsque le leader tombe.
  • Contraintes : cluster_election_timeout_ms doit valoir au moins 600 ms et au moins 4× le battement de cœur. (Il a été mesuré qu'un seul retard d'ordonnancement sous charge peut avaler deux battements entiers.)

Pourquoi 3 ou 5 nœuds

Un commit nécessite une majorité. Une configuration à nombre pair n'ajoute que du coût sans améliorer la tolérance aux pannes, le serveur la refuse donc.

Nombre de nœudsMajoritéPannes simultanées tolérées
220 — une seule panne arrête le cluster. Pas mieux que le mode simple
321
431 — identique à 3 nœuds, juste plus coûteux
532

Résumé du comportement en cas de panne

SituationComportement
Requête client vers un nœud non-leaderM (adresse du leader), ou E no_leader si le leader est inconnu
Panne du leadernouveau leader élu dans le délai de constat configuré (1750-2000 ms par défaut). Les requêtes pendant cette fenêtre reçoivent E no_leader → le client réessaie
Pendant le changement de leaderles requêtes d'acquisition en attente sont purgées avec M/E no_leader, et le client réessaie auprès du nouveau leader
Redémarrage d'un nœuddémarre avec un état vide → rattrape via la réplication du journal ou le snapshot d'un pair
Perte de la majoritéles commits deviennent impossibles → les écritures s'arrêtent (sécurité avant tout), reprise automatique une fois la majorité restaurée

Terminologie

  • Quorum — plus de la moitié de tous les nœuds (2 sur 3, ou 3 sur 5). Comme toute décision nécessite l'accord du quorum, deux groupes partitionnés ne peuvent jamais valider des décisions contradictoires en même temps.
  • Timeout d'élection (election timeout) — le temps qu'un suiveur attend sans battement de cœur avant de conclure que le leader est mort et de démarrer une élection. Randomisé par nœud pour réduire les candidatures simultanées.