# ALGOREP: Consensus is possible ! Paxos # A Word on Paxos > "On va abandonner les systemes distribues c'est trop chiant" > Lamport: a prouve accidentellement que ca marche *Est-ce que Paxos c'est dur ?* > Ca depend des gens :::info On veut arriver au consensus mais pas gagner ::: > Comme si tous les candidats a la presidentielle veulent que quelqu'un soit elu # Intuition *On veut aller manger, tout le monde a faim et on a pas de chef. On peut discuter que un a un.* > Des gens ont une idee initiale et des gens vont suivre *Qu'est-ce qu'il peut arriver ?* > Soit aucune idee n'est acceptee > Soit on arrive pas a avoir une majorite ("Tu veux manger quoi ?" "M'en fou") ## Problem: Split votes Consider 5 processes: - P1, P2 accepts $\color{red}{red}$ - P3, P4 accepts $\color{blue}{blue}$ - P5 accepts $\color{green}{green}$ *Comment on fait ?* > P5 rejoint un des groupes et tout le monde rejoint la majorite ? > Comment P5 connait l'etat des autres ? :::success On va les faire fight en 1v1 gare du nord ::: > On a rouge et noir > On va envoyer un message a tous > Avec le delai de propagation des messages, on va dire oui a noir ou oui a rouge > Si noir arrive en premier, noir sera choisi, sinon rouge le sera > Si on a propose noir et qu'on dit oui a rouge, alors on transmet le message comme quoi on propose rouge maintenant ## Example ![](https://i.imgur.com/9PSVmby.png) # Paxos ## Basic Paxos 2 phases 1. On va envoyer des messages `Prepare` - "Je vais bloquer toutes les anciennes propositions" 2. `Broadcast accept` - "J'accepte ta valeur" ## Conceptual Roles in Paxos - Proposer - Acceptors - Learners: learn the outcome ## Overview ### Phase 1 1. $[Proposer]$ Choose a proposal number $n$ 2. $[Proposer]$ Broadcast `prepare(n)` to all servers 3. $[Acceptor]$ Response to `prepare(n)` - if $n\gt minProposal$ then $minProposal=n$ - Return (accepted_proposal, accepted_value) 4. $[Proposer]$ When responses received from majority - if any accepted_value returned, replace value by accepted value for highest accepted_proposal ### Phase 2 1. $[Proposer]$ Broadcast `accept(n, value)` to all servers 2. $[Acceptor]$ Response to accept(n, value) - if $n \ge minProposal$ then accepted proposal = min proposal = n, accepted value = value - Return (min proposal) 4. $[Proposer]$ When responses received from majority - Any objection $(result \gt n)$ ? restart - Otherwise, value is chosen ## Example 2 ![](https://i.imgur.com/SXVd9js.png) ## Example 3 ![](https://i.imgur.com/Jp77Dyc.png) ## Liveness :::danger Competing processes can livelock ! ::: ![](https://i.imgur.com/h2c628e.png) > Les processus se battent pour avoir le dernier de la majorite ## Solutions :::success Randomized delays before restarting ::: # Multi-Paxos :::info Create a replicated log :::