---
marp: true
paginate: true
author: Clément Contet, Laurent Fainsin
math: katex
---
# The RAFT Consensus Algorithm
![bg right:60%](https://raft.github.io/logo/solo.svg)
---
# Consensus
> Consensus algorithms allow a collection of machines to work as a coherent group that can survive the failures of some of its members. – RAFT authors
- Accord sur l'état du système (image système unique et partagée)
- Réparation (réplication) autonome en cas de défaillance d'un serveur
- Une minorité de serveurs HS: pas de problème
- La majorité des serveurs HS: perte de disponibilité, maintien de la cohérence
- La clé pour construire des systèmes de stockage cohérents
---
# Organisation typique des state machine replication
![bg 95%](https://ongardie.net/static/coreosfest/slides/rsm.svg)
---
# Paxos (Paxos Made Simple. Leslie Lamport, ACM SIGACT News, 2001.)
![bg 100%](figs/paxos.jpg)
---
# Le problème avec Paxos
Paxos domine le marché depuis ~25 ans (Leslie Lamport, 1989)
- Difficile à comprendre
- Difficile à implémenter
> The dirty little secret of the NSDI community is that at most five people really, truly understand every part of Paxos ;-). – [NSDI](https://www.usenix.org/conference/nsdi23) reviewer
> There are significant gaps between the description of the Paxos algorithm and the needs of a real-world system…the final system will be based on an unproven protocol. – [Chubby](https://research.google/pubs/pub27897/) authors
---
# Une autre proposition : RAFT
## Prendre des décisions de conception fondées sur la compréhensibilité
- Décomposition du problème
- Minimiser l'espace des états
- Traiter plusieurs problèmes avec un seul mécanisme
- Éliminer les cas particuliers
- Minimiser le non-déterminisme
- Maximiser la cohérence
---
# Décomposition du problème
1. Élection d'un leader (mandat)
- Sélectionner un serveur qui sera le leader
- Détecter les pannes, choisir un nouveau leader
2. Réplication des logs (fonctionnement normal)
- Le leader accepte les commandes des clients et les ajoute à son journal
- Le leader réplique son journal aux autres serveurs (écrase les incohérences)
3. Sécurité
- Maintenir la cohérence des journaux
- Seuls les serveurs dont les journaux sont à jour peuvent devenir des leaders
---
# Minimiser l'espace des états
![bg 90%](https://oracleblog.org/wp-content/uploads/2018/10/QQ%E6%88%AA%E5%9B%BE20181001142911.png)
---
# Mandats
![bg 100%](https://oracleblog.org/wp-content/uploads/2018/10/WX20181002-112612@2x.png)
---
# Élection du leader
![bg 70%](figs/leader-election.png)
---
# Correction des élections
- Sécurité: autoriser au maximum un gagnant par mandat
- Chaque serveur ne donne qu'un seul vote par mandat (persistant sur disque)
- Majorité requise pour gagner l'élection
![](figs/election-correctness.png)
- Vivacité: un candidat doit finir par gagner
- Délais d'expiration des élections aléatoire dans $[T, 2T]$ (e.g. 150-300 ms)
- Le serveur gagne l'élection en dépassant le délai d'attente avant les autres
- Fonctionne bien si $T_{\text{diffusion}} \ll T \ll \text{MTBF}$
- Approche aléatoire plus simple que les autres comme le ranking
---
# Démo interactive
---
# Structure des journaux
![bg 100%](figs/log-structure.png)
---
# Incohérences des journaux
![bg 65%](figs/log-inconsistencies.png)
---
# Propriété de correspondance des journaux
![bg 90%](figs/log-matching-property.png)
---
# Réparation des journaux par correspondance
![bg 95%](figs/log-consistency-check.png)
---
# Changement de composition du cluster
![bg 80%](figs/cluster-change.png)
---
# De nombreuses implémentations
| Name | Primary Authors | Language | License |
| :------------- | :------------------------------------------------ | :--------- | :--------- |
| etcd/raft | Blake Mizerany, Xiang Li and Yicheng Qin (CoreOS) | Go | Apache 2.0 |
| go-raft | Ben Johnson (Sky) and Xiang Li (CMU, CoreOS) | Go | MIT |
| hashicorp/raft | Armon Dadgar (hashicorp) | Go | MPL-2.0 |
| copycat | Jordan Halterman | Java | Apache2 |
| LogCabin | Diego Ongaro (Stanford, Scale Computing) | C++ | ISC |
| akka-raft | Konrad Malawski | Scala | Apache2 |
| kanaka/raft.js | Joel Martin | Javascript | MPL-2.0 |
---
# Quel degré de hasard est nécessaire pour éviter les votes non concluants ?
![bg 90%](https://ongardie.net/static/coreosfest/slides/timeoutcdf.svg)
---
# Étude: Raft est-il plus simple que Paxos ?
![bg 70%](https://ongardie.net/static/coreosfest/slides/studyscatter.svg)
![bg 90%](https://ongardie.net/static/coreosfest/slides/survey.svg)