# ALGOREP: Raft
# Overview
:::info
**Goal**
Replicate logs (commands) in a set of servers
:::
- On va avoir des indexs
- Des informations qu'on va mettre sur chaque index/ligne
:::success
On veut que tout le monde ait le meme log
:::
:::info
**Overview**
Once all servers agree for a log entry, all server can run it $\Rightarrow$ All server will then compute the same value (replication)
:::
:::danger
C'est exactement le projet
:::
## Limitations and restrictions
:::danger
On veut elire un chef a la majorite
:::
## Comparaison avec Paxos
- Paxos est de l'approche distribuee
- Raft non, il y a un leader et tout le monde communique avec le chef
- Avantage: une machine est chef que pendant un laps de temps
## Summary
1. Election
2. Operation normal
3. Coherence de l'algo
4. Problemes qu'on peut avoir
# Server state
3 roles:
- Leader
- Follower
- Candidate
Chaque server commence follower:
![](https://i.imgur.com/5xrXUel.png)
![](https://i.imgur.com/BdDbjfG.png)
![](https://i.imgur.com/UNq0Img.png)
![](https://i.imgur.com/TPKx5fz.png)
![](https://i.imgur.com/efPuOpM.png)
## Time divided into Terms
- On va faire par epoch
- On veut un chef par epoch
:::warning
En fonction des processus qui meurent et naissent, on peut avoir de l'info obsolete
:::
Raft est un algo pessimiste qui va passer son temps a nettoyer.
## Heartbeats
:::info
Leader can send heartbeat to keep authority
:::
## Leader changes
![](https://i.imgur.com/VTCis8I.png)
- Chacune des cases est remplie avec des actions
- L'info stockee sur $S_1$ a la premiere ligne du log a ete calculee pendant la $1^{ere}$ epoch
:::warning
Ensuite viennent les complications
:::
Le log est stable sur les 2 premieres colonnes
*Mais apres ?*
> L'information de $S_4$ n'a pas ete propagee
:::danger
Il faut faire attention a l'information locale et celle connue par tout le monde
:::
:::success
On ecrit l'information locale quand elle est acceptee par tout le monde
:::
## Election basics
- Increment current term
- Change to Candidate state
- Vote for self
- Send RequestVote RPCs to all other servers, retry until either
1. Receive votes from majority of servers
- Become leader
- Send AppendEntries heartbeats to all other servers
3. Receive RPC from valid leader
- Return to follower state
5. No-one wins election (election timeout elapses)
- Increment term, start new election
## Properties of the election
Safety: allow one winner per term
- Each server gives out only one vote per term
- 2 different candidates can't accumulate majorities in same term
Liveness: some candidate must eventually win
## How to replicate log entries ?
:::info
On veut un log coherent par rapport aux differents serveurs
:::
On a:
- Des entrees
- Avec des commandes
- Le terms
- Des indexs
# Normal operations
L'algorithme commence a tourner.
- Le client envoie une commande au leader
- Le leader prend la commande et le met dans son log
- Le leader envoie `AppendEntries` RPCs aux followers
- Une fois que l'entree est prise
- Leader passes command to its state machine, returns result to client
- I Leader notifies followers of committed entries in subsequent AppendEntries RPCs
- Followers pass committed commands to their state machines
- Crashed/slow followers ? ⇒ Leader retries RPCs until they succeed
## Example 1
![](https://i.imgur.com/cwXb5HK.png)
- $S_4$ et $S_5$ sont en retard
- Vu qu'il sont en retard, si on declenche une nouvelle epoch ils ne peuvent pas etre chef
*Quel probleme peut-on avoir ?*
> Ca peut accentuer les gens en avance et en retard en fonction des epochs
> On va avoir des sous-systemes qui vont se creer avec des logs pas coherents
## Example 2
![](https://i.imgur.com/XiSkn7w.png)
On a un truc bizarre, $S_5$ n'a pas d'epoch 2. On a une divergence.
Pour l'epoch 5, $S_5$ peut etre elu car il a un log long, mais pas coherent avec celui des autres. Il va donc demander des rollabacks jusqu'au dernier point d'intersection.
# New commitment rules
For a leader to decide an entry is committed :
- Must be stored on a majority of servers
- At least one new entry from leader’s term must also be stored on majority of servers
![](https://i.imgur.com/nEFB4YT.png)
## Client protocol
![](https://i.imgur.com/bu62zdo.png)