Raft en pratique
Progression
#Raft en pratique
Raft implémente un consensus répliqué autour d’un leader. Chaque serveur maintient un journal ordonné d’entrées de machine d’état. Les nœuds démarrent suiveurs ; lorsqu’ils ne reçoivent plus de heartbeats AppendEntries pendant un délai aléatoire, ils deviennent candidats, incrémentent le terme, et demandent les votes de leurs pairs. Le premier à réunir une majorité devient leader et envoie des heartbeats afin de rester élu.
La sécurité repose sur deux invariants complémentaires :
- Up-to-date voting : un serveur ne vote que pour un candidat dont le dernier couple (index, terme) est au moins aussi récent que le sien. Ainsi, un leader élu possède forcément toutes les entrées engagées.
- Majorité pour le commit : une entrée est engagée si elle se trouve dans un journal de leader et chez une majorité de serveurs. Toute future majorité contiendra donc cette entrée.
En combinant ces règles avec des timeouts aléatoires, Raft garantit un comportement déterministe même lors de partitions temporaires. Lorsqu’un leader actif est coupé du quorum, il ne peut plus engager de nouvelles entrées ; il redeviendra suiveur en découvrant un terme plus élevé.
#Animation : cycle d’élection et réplication
Nœud A
Suiveur
Toujours suiveur, journal à jour.
Nœud B
Suiveur
Heartbeat reçu juste avant la coupure.
Nœud C
Candidat
Timeout → devient candidat (terme 5).
Timeout et candidature
Le suiveur C ne reçoit plus de heartbeats. Il incrémente le terme et se déclare candidat, puis sollicite les votes de ses pairs.
Cette animation met en scène un cluster à trois nœuds. On observe la transition follower → candidate → leader, puis la réplication d’une commande et enfin la résilience face à une partition. Les couleurs de bordures signalent l’alignement des journaux. Cette visualisation permet de confirmer les deux garanties fondamentales : absence de divergence des entrées engagées, et capacité à faire progresser la machine d’état dès que le quorum est rétabli.
#Pas-à-pas : AppendEntries
Le leader inscrit la commande en mémoire persistante avant toute diffusion. Si le serveur tombe juste après, l’entrée sera rejouée au redémarrage.
1# Pseudo-code condensé pour AppendEntries côté suiveur2if term < currentTerm:3 return False4if log[prevLogIndex].term != prevLogTerm:5 delete_from(prevLogIndex)6 return False7append(entry)8if leaderCommit > commitIndex:9 commitIndex = min(leaderCommit, index_last_entry)10return True
#Sequencer : lecture et écriture synchrones
La latence perçue dépend du temps nécessaire pour obtenir la majorité. On peut optimiser via des pipelines (envoyer plusieurs entrées à la fois) et des groupes de commit. Les suiveurs diffusent ensuite l’état engagé à leurs clients locaux, offrant une lecture cohérente dès que le commit est confirmé.
#Bonnes pratiques de mise en œuvre
- Persistance : écrire le terme actuel, le vote accordé et les entrées de journal avant d’envoyer une réponse réseau.
- Timeouts avec jitter : randomiser les délais d’élection pour éviter les candidatures synchrones (généralement 150–300 ms).
- Snapshots : compacter le journal lorsque l’index engagé dépasse un seuil. Envoyer des snapshots permet aux nouveaux nœuds de rattraper rapidement l’état.
- Leadership transfert : avant maintenance, demander au leader de céder la main à un suiveur à jour (évite la coupure numérique).
- Observation : exposer les métriques
currentTerm
,commitIndex
,lastApplied
et la taille du journal pour diagnostiquer les décalages.
Les requêtes peuvent être rejouées si le leader bascule juste après avoir répondu mais avant que le client ne reçoive l’accusé. Utilisez des identifiants de commande ou un registre de déduplication côté application.
#Comparaison avec Paxos
- Raft sépare explicitement l’élection (RequestVote) et la réplication (AppendEntries), offrant une implémentation plus structurée.
- La machine d’état unique simplifie l’intégration applicative. Paxos multi-instance demande souvent une couche de log supplémentaire.
- Raft impose un leader unique ; Paxos permet un multi-leader mais complexifie la convergence. Le choix dépend du besoin en débit d’écriture et de la simplicité de supervision.