13. @doanduyhai#AlgosBigData
Algorithmesimplifié LogLog
1) Choisir une fonction de hachage H très distributive
2) Pour chaque élément observé (login, article_id, uuid …),
appliquer H
3) Convertir le hash en séquence binaire
4) Déduire des séquences binaires, la cardinalité
13
0111010010101…
0010010010001…
1010111001100…
…
14. @doanduyhai#AlgosBigData
Intuition LogLog
Équi-probabilité:
50% des séquences commencent par 0xxxxx
50% des séquences commencent par 1xxxxx
1/4 des séquences commencent par 00xxxxx
1/4 des séquences commencent par 01xxxxx
1/4 des séquences commencent par 10xxxxx
1/4 des séquences commencent par 11xxxxx
14
34. @doanduyhai#AlgosBigData
HyperLogLog, les maths
On remplace les xi dans la formule par Mi
34
H(Mi ) = b Mi
−1
i=1
b
∑( )
−1
On remplace les Mi dans la formule par 2max(ri)
H(Mi ) = b 2i
−max(ri )
i=1
b
∑
#
$
%
&
'
(
−1
35. @doanduyhai#AlgosBigData
HyperLogLog, les maths
On remplace dans la formule initiale n ≈ b・H(Mi)
35
n ≈ αbb2
2−max(ri )
i=1
b
∑
$
%
&
'
(
)
−1
n = cardinalité estimée
b = nb de buckets rang max dans
chaque bucket𝛼b = constante correctrice
50. @doanduyhai#AlgosBigData
Paxos phase 1: prepare
50
Le proposer choisit un nombre n (séquence toujours
croissante)
Il envoie prepare(n) à un quorumd’Acceptors
Proposer
/Leader
prepare(n)
Acceptor
51. @doanduyhai#AlgosBigData
Paxos phase 1: promise
51
Chaque acceptor, à la réception d’un prepare(n):
• s’il a déjà accepté un accept(m,valm) de la part d’un autre proposer
avec m ≤ n
☞ retourne promise(n,(m,valm))
Proposer
/Leader
Acceptor
promise(n,(m, valm))
52. @doanduyhai#AlgosBigData
Paxos phase 1: promise
52
Chaque acceptor, à la réception d’un prepare(n):
• s’il n’a accepté aucune proposition encore (accept(?,?)) ou s’il a
retourné une promesse avec m < n
☞ retourne promise(n, ∅) ET promet de ne plus accepter aucun
prepare(m) ou accept(m,?) avec m < n
Proposer
/Leader
Acceptor
promise(n,∅)
53. @doanduyhai#AlgosBigData
Paxos phase 1: promise
53
Chaque acceptor, à la réception d’un prepare(n):
• s’il a déjà fait une promesse/accepté une valeur avec m > n
☞ ignore la requête. Il peut renvoyer un Nack également
(optimisation)
Proposer
/Leader
Acceptor
Nack
54. @doanduyhai#AlgosBigData
Paxos phase 1: objectifs
54
Buts de la phase 1:
• découvrir toute proposition en cours pour la faire progresser
• bloquer toute ancienne proposition qui n’a pas abouti
55. @doanduyhai#AlgosBigData
Paxos phase 2: accept
55
Le leader reçoit plusieurs promise(n,(mi,vali)):
• si tous les couples (mi,vali) reçus sont vides (promise(∅, ∅)), le
leader peut envoyer accept(n,val) avec val de son choix
• extrait tous les couples (mi,vali) pour garder vali avec le mi le plus
grand ET envoie accept(n,valmax(mi)) au quorum d’acceptors
Proposer
/Leader
Acceptor
accept(n,valmax)
56. @doanduyhai#AlgosBigData
Paxos phase 2: accepted
56
Chaque acceptor à la réception d’un accept(n,val):
• s’il n’a fait aucune promesse avec m > n, retourne accepted()
• sinon, ignore la requête
Proposer
/Leader
Acceptor
accepted(n,val)
57. @doanduyhai#AlgosBigData
Paxos phase 2: learn
57
Chaque acceptor après avoir envoyé un accepted():
• envoie la valeur val choisie à une liste de learners (stockage
durable)
Le consensus est atteint et a pour valeur val !
Ceci définit un tour de Paxos
58. @doanduyhai#AlgosBigData
Limites du Paxos théorique
58
Une fois la valeur val choisie, on ne peut plus la modifier !
Besoin de faire un reset de val pour un autre tour de Paxos
Multi-Paxos
• plusieurs tours de Paxos en parallèle
• chaque serveur peut devenir tour à tour Proposer, Acceptor & Learner
Fast-Paxos, Egalitarian-Paxos etc …
59. @doanduyhai#AlgosBigData
Situations de conflits
59
Le dernier arrivé fait progresser une proposition "en cours"
a1
a2
a3
a4
a5
prepare(n1) promise(∅)
promise(∅)
promise(∅)
prepare(n1)
prepare(n1)
Légende
message reçu
message envoyé
accept(n1,a) prepare(n2)
prepare(n2)
prepare(n2)
promise(n2,(n1,a))
promise(∅)
promise(∅)
propose(n2,a)
propose(n2,a)
propose(n2,a)
accepted()
☠
☠
accept()
accept()
accept()