#DevoxxFR#DevoxxFR
Finalement, c’est quoi un
système distribué ?
William Montaz & Guillaume Arnaud
voyages-sncf.com
@willymontaz @guillarnaud
#DevoxxFR#DevoxxFR
#DevoxxFR#DevoxxFR
De la théorie à la pratique
Un peu de théorie
Les consensus distribués
#DevoxxFR#DevoxxFR 4
Une brève histoire du
temps...
#DevoxxFR
Disposant d’une ressource de calcul, de stockage infinie et infaillible
Accessible instantanément
Et si on disposait d’un système...
Capable de savoir dans quel ordre exact ont été réalisées ses actions
De nombreux travaux et plus
modestement cette présentation
seraient caduques !
#DevoxxFR
Disposant d’une ressource de calcul, de stockage infinie et infaillible
Accessible instantanément
Et si on disposait d’un système...
Capable de savoir dans quel ordre exact ont été réalisées ses actions
> Besoin de système distribué !
#DevoxxFR
En 2 min nous
avons trouvé la
balise !
Vous rigolez,
j’attends
depuis 10 ans
!!!
Tout est relatif
#DevoxxFR
Pas synchronisés
Hardware différent
Variations de tensions
Impuretés des matériaux
Effets relativistes (!)
Horloge vs Cycle CPU
#DevoxxFR
Disposant d’une ressource de calcul, de stockage infinie et infaillible
Accessible instantanément
Et si on disposait d’un système...
Capable de savoir dans quel ordre exact ont été réalisées ses actions
#DevoxxFR
Disposant d’une ressource de calcul, de stockage infinie et infaillible
Accessible instantanément
Et si on disposait d’un système...
Capable de savoir dans quel ordre exact ont été réalisées ses actions
#DevoxxFR
Communication
#DevoxxFR
PARIS LA LUNE
Intrication quantique
#DevoxxFR
LA LUNEPARIS
Intrication quantique
#DevoxxFR
Disposant d’une ressource de calcul, de stockage infinie et infaillible
Accessible instantanément
Et si on disposait d’un système...
Capable de savoir dans quel ordre exact ont été réalisées ses actions
#DevoxxFR
Disposant d’une ressource de calcul, de stockage infinie et infaillible
Accessible instantanément
Et si on disposait d’un système...
Capable de savoir dans quel ordre exact ont été réalisées ses actions
#DevoxxFR
Plus de ressources
Plus résilient
Plus proche
Un système distribué
#DevoxxFR
Histoire cohérente et anticipable
Définir la notion de simultanéité des événements
Et l’écoulement du temps
Un système distribué
#DevoxxFR
cores d’un CPU
transaction financière
mise à jour d’un wall facebook
Un besoin d’échelle
#DevoxxFR#DevoxxFR
ACID
NoSQL
Eventually Consistent
Consistent Hashing
Preferred ReplicaLeader Election
Raft
PAXOS
2 phase commit
FLP Impossibility
Strong serializable
Linearizable
Leader Election
Master-slave
Active-passive
Leader Election
Zookeeper
Cassandra
MongoDB
CouchBase
Redis
Kafka
Consul
Riak
Partition tolerance
PostGreSQL
Oracle
MySQL
RabbitMQ
ActiveMQ
1
#DevoxxFR#DevoxxFR
Un peu de théorie
Les modèles de cohérence
Les pannes
CAP
#DevoxxFR#DevoxxFR
Les modèles de
cohérence
#DevoxxFR#DevoxxFR
SexyRobot
@Bender
Et mon c...l c’est du téflon ?
13:27 - 5 avril 2017
20thGuy
@Fry
@Bender et le mien c’est du slurm ?
13:27 - 5 avril 2017
LonelyLobster42
@Zoidberg
@Bender ce téflon est à MOI !!
13:27 - 5 avril 2017
?
Lrrr voit-il le slurm de Fry s’afficher en premier ?
a. OUI
b. NON
c. JE NE SAIS PAS
#DevoxxFR#DevoxxFR
SexyRobot
@Bender
Et mon c...l c’est du téflon ?
13:27 - 5 avril 2017
20thGuy
@Fry
@Bender et le mien c’est du slurm ?
13:27 - 5 avril 2017
LonelyLobster42
@Zoidberg
@Bender ce téflon est à MOI !!
13:27 - 5 avril 2017
?
Fry voit-il son slurm s’afficher avant celui de Zoidberg ?
a. OUI
b. NON
c. JE NE SAIS PAS
#DevoxxFR#DevoxxFR
Etant donné des écritures concurrentes dans un système,
qu’a-t-on le droit d’y lire à un instant T ?
#DevoxxFR#DevoxxFR
a = 2
b = 3
c = a + b
if(c == 5) {
d = 6
}
w(a,2)
w(b,3)
add(c,a,b)
r(c)=5
Histoire décrite Execution
PROGRAMME PIPELINE CORE
w(d,6)
#DevoxxFR#DevoxxFR
Linéarisable
opération atomique
“comme si” une par une
opération terminée = visible par tous
opération non terminée = non visible
#DevoxxFR#DevoxxFR
a = 2
b = 3
c = a + b
if(c == 5) {
d = 6
}
Histoire décrite
w(b,3)
w(a,2)
add(c,a,b)
r(c)=5
Execution
PROGRAMME PIPELINE CORE
w(d,6)
#DevoxxFR#DevoxxFR
Histoire décrite
w(a,2)
w(b,3)
add(c,a,b)
r(c)=5
Execution
PROGRAMME PIPELINE COREa = 2
b = 3
c = a + b
if(c == 5) {
d = 6
}
w(d,6)
#DevoxxFR#DevoxxFR
Quelques exemples
Un programme avec des volatiles/locks partout
Une base de données ACID
Un relevé bancaire
Un forum de discussion
#DevoxxFR#DevoxxFR
A-t-on toujours besoin d’une garantie aussi forte ?
pauses
attente de validation
attente de propagation
#DevoxxFR#DevoxxFR
SexyRobot
@Bender
Vente massive de téflon, niark niark… #teflon
13:27 - 5 avril 2017
20thGuy
@Fry
Cargaison de téflon, contact @Bender #teflon
13:27 - 5 avril 2017
? Lrrr voit-il que le message de Fry était préparé ?
a. OUI
b. NON
c. JE NE SAIS PAS
#DevoxxFR#DevoxxFR
RobotStar
@Calculon
Nouvelle saison des électrodes de l’amour #tesla
13:27 - 5 avril 2017
SexyRobot
@Bender
@Calculon :) :) :) segmentation fault ! #tesla
13:27 - 5 avril 2017
Fry et Zapp consultent slurm en même temps
sur deux planètes différentes
voient-ils le slurm de Bender s’afficher en même
temps ?
? ?
#DevoxxFR#DevoxxFR
a = 2
b = 3
c = a + b
if(c == 5) {
d = 6
}
Histoire décrite
w(b,3)
w(a,2)
add(c,a,b)
r(c)=5
Execution
PROGRAMME PIPELINE CORE
w(d,6)
.
.
.
.
.
.
#DevoxxFR#DevoxxFR
Sequentially consistent
opération atomique
“comme si” une par une
opération terminée = peut être visible plus tard
opération non terminée = peut être visible
#DevoxxFR#DevoxxFR
Quelques exemples :
pipeline d’instructions CPU
les caches de nos machines
Les posts Facebook
#DevoxxFR#DevoxxFR
SexyRobot
@Bender
@Fry et mon c...l c’est du téflon ?
13:27 - 5 avril 2017
EyeOfTheBeholder
@Leila
@Zapp dans tes rêves ! #looser #chum
13:27 - 5 avril 2017
? Lrrr voit-il le slurm de Bender avant celui de Leila ?
20thGuy
@Fry
1,2,3,4,6...zut #math
13:27 - 5 avril 2017
VoulezVousCoucher
@Zapp
Chambre 210 Couloir 5 #beaugosse
13:27 - 5 avril 2017
#DevoxxFR#DevoxxFR
Causally Consistent
Sequentially consistent seulement dans un certain
scope
#DevoxxFR#DevoxxFR
Serializable
Strong serializable
Eventually Consistent
Read-your-writes
...
Linearizable
Sequentially consistent
Causally consistent
Rappel
#DevoxxFR#DevoxxFR
Les pannes
#DevoxxFR#DevoxxFR
Compromission des messages
Non-transmission d’information
Arrêt d’un serveur fail-stop failure
byzantine failure
#DevoxxFR#DevoxxFR
1. The network is reliable
2. Latency is zero
3. Bandwidth is infinite
4. The network is secure
5. Topology doesn’t change
6. There is on administrator
7. Transport cost is zero
8. The network is homogeneous
1994 - L. Peter Deutsch
Fallacies of distributed
computing
#DevoxxFR
Problème des deux généraux
1975 - E. A. Akkoyunlu, K. Ekanadham, R. V. Huber
mardi
8h
#DevoxxFR#DevoxxFR
#DevoxxFR#DevoxxFR
OK
mardi
8h
#DevoxxFR#DevoxxFR
#DevoxxFR
Généraux Byzantins
à l’attaque!
fuyons!fuyons!fuyons!fuyons...
fuyons!fuyons!à l’attaque!
#DevoxxFR#DevoxxFR
FLP impossibility
“Impossibility of Distributed Consensus with One
Faulty Process”
FISCHER - LYNCH - PATERSON - 1985
#DevoxxFR#DevoxxFR
NOS OUTILS MATHÉMATIQUES
La modélisation et les ensembles
La preuve par l’absurde
La preuve par récurrence
#DevoxxFR#DevoxxFR
LE MODÈLE ASYNCHRONE
Aucune limite de temps pour recevoir, processer,
répondre à un message
Pas de distinction entre un process en panne et un
process lent
#DevoxxFR#DevoxxFR
LE CONSENSUS
Terminaison
Certains process finissent par se mettre d’accord
Entente
Ils se sont mis d’accord sur la même valeur
Validité
La valeur était proposée par un des process du système
#DevoxxFR#DevoxxFR
0 1 0 0 1 0
MULTISET
(m1,p3) (m1,p4)
(m2,p4)
(m1,p1)
receive(p1) = E(m1,p1)
ou receive(𝜽)
P1 P2 P3 P4 P5 P6
#DevoxxFR#DevoxxFR
1 1 0 0 1 0
MULTISET
(m1,p3) (m1,p4)
(m2,p4)
send(m1,p2)
send(m2,p3)
(m1,p2)
(m2,p3)
P1 P2 P3 P4 P5 P6
#DevoxxFR#DevoxxFR
Exemple
3 process
Consensus
Si deux process savent qu’ils ont la même valeur, ils
décident cette valeur
#DevoxxFR#DevoxxFR
0 1 0
MULTISET
P1 P2 P3
receive(𝜽)
CONFIGURATION INITIALE
C0
#DevoxxFR#DevoxxFR
0 1 0
MULTISET
P1 P2 P3
(m1,p2) (m1,p3)
send
CONFIGURATION INITIALE
C0
#DevoxxFR#DevoxxFR
0 1 0
MULTISET
P1 P2 P3
(m1,p2) (m1,p3)
receive
CONFIGURATION C1
#DevoxxFR#DevoxxFR
0 1 0
MULTISET
P1 P2 P3
(m1,p3)
send nothing
CONFIGURATION C1
#DevoxxFR#DevoxxFR
CONFIGURATION C2
0 1 0
MULTISET
P1 P2 P3
(m1,p3)
receive
#DevoxxFR#DevoxxFR
0 1 [0]
MULTISET
P1 P2 P3
(m1,p3)
send
CONFIGURATION C2
#DevoxxFR#DevoxxFR
CONFIGURATION C3
0 1 [0]
MULTISET
P1 P2 P3
(m1,p3)
receive
#DevoxxFR#DevoxxFR
[0] 1 [0]
MULTISET
P1 P2 P3
P1 et P3 ont décidé 0
CONFIGURATION C4
#DevoxxFR#DevoxxFR
C0
[ E1 , E2 , E3 ] => AGENDA
[ E’1 , E’2 , E’3 ] => AUTRE AGENDA
univalente
0-valente
univalente
1-valente
C1
E1(p)
C2
E2(p’) E3(p’’)
C’0 C’1 C’2
E’1(p) E’2(p’) E’3(p’’)
#DevoxxFR#DevoxxFR
Nos hypothèses
Modèle asynchrone
Réseau fiable
Consensus possible (seulement sur certains process suffisant)
Consensus possible avec une seule panne
#DevoxxFR#DevoxxFR
Quelque soit le nombre de process (>=2)
Quelque soit l’algorithme de consensus utilisé
Ce que l’on veut démontrer
Il existe des situations qui empêchent le consensus d’aboutir
#DevoxxFR#DevoxxFR
premier lemme
DES AGENDAS DISJOINTS SONT COMMUTATIFS
#DevoxxFR#DevoxxFR
C0 C’1
A2
A1
C0 C1
A1
C2
A2
Si les ensembles des process dans A1 et dans A2 sont disjoints,
on peut intervertir A1 et A2
et obtenir la même configuration résultante
#DevoxxFR#DevoxxFR
second lemme
IL EXISTE DES CONFIGURATIONS INITIALES POUR
LESQUELLES LE RÉSULTAT DU CONSENSUS EST
INDÉTERMINÉ
=
IL EXISTE DES CONFIGURATIONS INITIALES BIVALENTES
#DevoxxFR#DevoxxFR
Prétendons qu’il n’en existe pas !
#DevoxxFR#DevoxxFR
C00
C01
C02
C04
C06C03
C05 C07
[ 0 , 0 , 0 ]
[ 1 , 0 , 0 ]
[ 0 , 1 , 0 ]
[ 0 , 0 , 1 ]
[ 1 , 1 , 0 ]
[ 0 , 1 , 1 ]
[ 1 , 0 , 1 ] [ 1 , 1 , 1 ]
#DevoxxFR#DevoxxFR
C0
status(p) ≠
E3(p’’’≠p)
DECIDE 0
E3(p’’’≠p)
DECIDE 1
C0
p
p
E1(p’≠p)
p
E2(p’’≠p)
p
p
E1(p’≠p)
p
E2(p’’≠p)
p
Identiques sauf p
Devraient être
identiques !!
#DevoxxFR#DevoxxFR
Il existe donc des configurations initiales
bivalentes
L’affirmation “il n’existe que des configurations
initiales 0-valentes ou 1-valentes” est donc fausse
#DevoxxFR#DevoxxFR
troisième lemme
SOIT UNE CONFIGURATION BIVALENTE,
SOIT UN ÉVÉNEMENT APPLICABLE SUR CETTE CONFIGURATION,
APRÈS L’APPLICATION DE CET ÉVÉNEMENT SUR UNE DES CONFIGURATIONS
SUBSÉQUENTES,
ON POURRA ATTEINDRE UNE NOUVELLE CONFIGURATION BIVALENTE
#DevoxxFR#DevoxxFR
E APPLIQUÉE NON APPLIQUÉ
C
BIVALENTE
IL EXISTE UNE
CONFIGURATION BIVALENTE
DANS CET ENSEMBLE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C
BIVALENTE
E APPLIQUÉ
PAS DE BIVALENTE
SUPPOSONS QU’IL N’EN
EXISTE PAS !
#DevoxxFR#DevoxxFR
E NON APPLIQUE
C
E APPLIQUÉ
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C
E APPLIQUÉ
E0
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C
E APPLIQUÉ
E0
F0
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C
E APPLIQUÉ
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C
E APPLIQUÉ
E0
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C
E APPLIQUÉ
F0
E0
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C
E APPLIQUÉ
F0
F0
F1
F1
F1
F1
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C1
C0
E APPLIQUÉ
C0
C1
C1
C1
F0
F0
F1
F1
F1
F1
PAS DE BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C1
C0
E APPLIQUÉ
F0
F1
E(p)
E(p)
E’(p’)
si p’ != p
E’(p’)
PAS DE BIVALENTE
F1 change
d’avis, donc
bivalente
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C1
C0
E APPLIQUÉ
F0
F1
E(p)
E(p)
E’(p)
si p’ = p
E0
E1
E(p)
E(p)
mais U est univalente
CONTRADICTION !
E’(p)
PAS DE
BIVALENTE
U
non p
≠p
U change d’avis,
donc bivalente
non p
A
A
A
#DevoxxFR#DevoxxFR
SOIT UNE CONFIGURATION BIVALENTE,
SOIT UN ÉVÉNEMENT APPLICABLE SUR CETTE CONFIGURATION,
APRÈS L’APPLICATION DE CET ÉVÉNEMENT SUR UNE DES
CONFIGURATIONS SUBSÉQUENTE,
ON POURRA ATTEINDRE UNE NOUVELLE CONFIGURATION
BIVALENTE
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C0
BIVALENTE
E APPLIQUÉ
lemme 2
#DevoxxFR#DevoxxFR
E NON APPLIQUÉ
C0
BIVALENTE
E APPLIQUÉ
C1
BIVALENTE
lemme 3
#DevoxxFR#DevoxxFR
Et on recommence avec C1...
#DevoxxFR#DevoxxFR
Quelque soit le nombre de processeurs (>=2)
Quelque soit l’algorithme de consensus utilisé
Ce que l’on voulait démontrer
Il existe des situations qui empêchent le consensus d’aboutir
On vient d’en créer une !
#DevoxxFR#DevoxxFR
Théorème CAP
#DevoxxFR#DevoxxFR
A
Availability
CConsistency P Partition Tolerance
linéarilité
un noeud qui
n’est pas en
échec doit
répondre
on peut avoir
des partitions
réseaux
#DevoxxFR#DevoxxFR
A
C P
base de données
relationnelles
Mysql, Postgres,
Oracle
#DevoxxFR#DevoxxFR
A
C P
haute disponibilité
Cassandra,
DynamoDB,
CouchDB
#DevoxxFR#DevoxxFR
A
C P
Intégrité
Zookeeper, Consul, Etcd
#DevoxxFR#DevoxxFR
Certains modèles idéaux ne permettent pas d’aboutir à un consensus
Des modélisations avec des contraintes plus fortes permettent d’adresser
certains types de problèmes
Il n’y a pas de modélisation ultime
Il n’y a que des compromis
Il est possible de composer des modèles à différentes échelles
#DevoxxFR#DevoxxFR
LES CONSENSUS
DISTRIBUÉS
2 Phase-Commit
Paxos
Raft
Spanner
#DevoxxFR
Consensus distribué
A
B?
A
B?
A
B
B
B
B
#DevoxxFR#DevoxxFR 9
Moi aussi, je veux
faire des consensus
distribués !
#DevoxxFR#DevoxxFR 9
à quel taux les banques se prêtent de l’argent ?
#DevoxxFR#DevoxxFR 1
1.2% 1.4% 1.2%5.6%
1.4% 1.4% 1.2% 0.1%
#DevoxxFR#DevoxxFR 1
1.2% 1.4% 1.2%5.6%
1.4% 1.4% 1.2% 0.1%
1.3% !
#DevoxxFR#DevoxxFR
2 Phase-Commit
#DevoxxFR
2 Phase-Commit
coordinateur
C propose C vote C commit ou
rollback
C
#DevoxxFR
2 Phase-Commit
C C
crash
C
attend le
commit
propose commit
#DevoxxFR
2 Phase-Commit
C
état ?
C
C
C
C
C
commit commit
#DevoxxFR#DevoxxFR
Paxos
#DevoxxFR#DevoxxFR
Leslie Lamport
Lamport timestamp
Paxos
LateX
...
1989: première description de Paxos
1998: The Part-Time Parliament
2001: Paxos Made Simple
#DevoxxFR#DevoxxFR
P A L
proposer acceptor learner
p(n)=v
proposal
#DevoxxFR#DevoxxFR
1 1
p(1)
2
3
p’(1)
2
1 1
2
3
p’(1)
2
p(1)
p(1) ?
p’(1) ?
#DevoxxFR#DevoxxFR
1 1
p(1)
2
3
p(2)
2
1 1
2
3
p(2)
2
p(1)
p(1)
p(2)
1 1
2
3
p(2)
2
p(1)
p(2)
quorumunicité ordre
promesse
#DevoxxFR#DevoxxFR
1
1
1
2
3
2
2
1 1
2
3
2
2
1
2
1 1
2
3
2
2
2
2
1
1
2
2
3
2
2
prepare promesse accepte accepté
#DevoxxFR#DevoxxFR
1
1
1
2
3
2
2
prepare
1
1
2
3
2
2
1
1
promesse
1
1
1
2
3
2
2
accepte
prepare
1
1
1
1
2
3
2
1
2
accepté
promesse
2
1
rejette 1
1
1
3
2
3
2
2
prepare
accepte
1
2
2
1
1
2
3
2
2
3
3
3
2
promesse
rejette 2
1
1
3
2
3
2
2
1
2
2
1
prenons un seul proposer !
etc...
#DevoxxFR
Multi-Paxos
P
A
1
A
A P
A
A
1
A
1
1
prepare promesse
initialisation (1 fois)
accepte accepté
P
A
n
A
A P
A
A
n
A
n
n
itération (n fois)
#DevoxxFR
Les non-dits
Election: comment élire un leader
Snapshot: prendre une photo des états
Reconfiguration: comment gérer l’ajout ou la suppression d’un noeud
#DevoxxFR#DevoxxFR
Raft
Diego Ongaro et John Ousterhout - In Search of an Understandable Consensus Algorithm
#DevoxxFR
Raft vs Paxos
#DevoxxFR
Raft vs Paxos
MASTER
RAFT
#DevoxxFR
Raft vs Paxos
MASTER
PAXOS
#DevoxxFR
Raft vs Paxos
#DevoxxFR
Raft vs Paxos
#DevoxxFR
Apports
L’algorithme se base sur un leader fort
Il propose un algorithme d’élection du leader
Il propose une implémentation pour le stockage de séries de propositions (multi-paxos) et la
réplication des informations entre les noeuds du cluster
#DevoxxFR
Replicated State Machine
https://raft.github.io/raft.pdf
#DevoxxFR
Raft: termes
https://raft.github.io/raft.pdf
#DevoxxFR
Raft: élection
https://raft.github.io/raft.pdf
#DevoxxFR
Journalisation
#DevoxxFR
Followers
1 1 1 4 4 5 5 6 6 6
1 1 1 4 4 5 5 6 6
1 1 1 4
1 1 1 4 4 5 5 6 6 6 6
1 1 1 4 4 4 4
1 1 1 2 2 2 3 3 3 3
leader
term 7
followers
a
b
c
d
e
7
#DevoxxFR
http://github.raft.io
Démo
#DevoxxFR#DevoxxFR
Spanner
#DevoxxFR
NewSQL: distribué mais transactionnel, SQL, ACID
Disponibilité: 99,999%
Cloud: disponible que sur Cloud Spanner
Spanner
#DevoxxFR
TrueTime
NTP
(Network Time Protocol)
TrueTime
(Spanner)
précision ≈ x10 ms ≈ 6 ms
#DevoxxFR
API TrueTime
méthode résultat
TT.Now() TTinterval:[earliest, latest]
TT.After(t) true si t < TT.Now()
TT.Before(t) true si t > TT.Now()
#DevoxxFR
Temps logique
1 1 1 4 4 5 5 6 6
1 1 1 4 4 5 5 6 6
1 1 1 4 4 5 5 6 6
synchronisation
par messages
noeud 1
noeud 2
noeud 3
#DevoxxFR
Temps réel
1 1 1 4 4 5 5 6 6
1 1 1 4 4 5 5 6 6
1 1 1 4 4 5 5 6 6
noeud 1
noeud 2
noeud 3
synchronisation
des montres !
#DevoxxFR#DevoxxFR
leaderleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
choisit
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
prepare
prepare
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
prepare
paxos
prepare
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
t1 t3
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
ts=max(t1,t3,now)
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
commit(ts)
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
wait(2*ε)
site 1 site 2 site 3
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
site 1 site 2 site 3
wait(2*ε)
TT.now() > ts > t1 TT.now() > ts > t2
#DevoxxFR#DevoxxFR
coordinateurleader
rep rep rep rep
leader
rep rep
client
commit(ts)
commit(ts)
commit(ts)
site 1 site 2 site 3
#DevoxxFR#DevoxxFR
C + P
systèmes distribués vérifiant C+P: zookeeper (paxos), consul (raft), etcd (raft),
base NewSQL (cockroachdb)
cas d’utilisation: garder un état (topologie, offset, status, annuaire …) cohérent
sur plusieurs noeuds
contre-indication: A+P, haute disponibilité, performance
#DevoxxFR#DevoxxFR
DE LA THÉORIE A LA
PRATIQUE
Elasticité
Equilibre
Compromis
Simplicité
#DevoxxFR#DevoxxFR
causes d’incidents
sur Spanner
#DevoxxFR#DevoxxFR
% disponibilité (les n 9) temps d’indisponibilité annuel
90% 36.5 jours
99% 3.65 jours
99,9% 8.76 heures
99,99% 52.6 min
99,999% 5.26 min
99,9999% 31.5 s
#DevoxxFR#DevoxxFR 1
Elasticité
Equilibre
Compromis
Simplicité
#DevoxxFR#DevoxxFR
Elasticité
#DevoxxFR
Mais pourquoi donc ?
index: éviter les locks, indexation plus rapide, performance
ram: par ex. limitation sur les VMs
cpu: par ex. réservation des cpus
réseau: partage du débit
#DevoxxFR
Horizontal vs Vertical
#DevoxxFR
Virtualisation
hyperviseur
disque / réseau
serveur
virtualisation
serveur
virtualisation
serveur
virtualisation
serveur
virtualisation
hyperviseur
serveur
virtualisation
hyperviseur
serveur
virtualisation
serveur
virtualisation
serveur
virtualisation
ré-équilibrage ?
I/O
#DevoxxFR
Virtualisation
redis redis redis redis redis
master master master master master
redis redis redis redis redis
redis redis redis redis redis
résilient à 2
noeuds en
échec
#DevoxxFR
Physique
serveur
disque / réseau
application
serveur
application
serveur
orchestrateur ?
I/O
application
disque / réseau
application
disque / réseau
application
application
application
disque / réseau
#DevoxxFR
Détection
unicast ring gossipmulticast
#DevoxxFR#DevoxxFR
Equilibre
#DevoxxFR
1
Hashing
1
4
16
2
2
5
17
0
3
6
18
1 mod 3 = 1
4 mod 3 = 1
16 mod 3 = 1
2 mod 3 = 2
5 mod 3 = 2
17 mod 3 = 2
3 mod 3 = 0
6 mod 3 = 0
18 mod 3 = 0
#DevoxxFR
1
Hashing
1
4
16
2
2
5
17
0
3
6
18
1 mod 2 = 1
16 mod 2 = 0
3 mod 2 = 1
6 mod 3 = 0
18 mod 3 = 0
4 mod 2 = 0
2 mod 2 = 0
5 mod 2 = 1
17 mod 2 = 1
#DevoxxFR
Consistent Hashing
A, B, C, D, E sont les noeuds
physiques.
L’index de l’objet le positionne sur le
cercle (hash(k)=index de 0 à 2^32).
A
B
CD
E
on choisit le noeud suivant le
plus proche
A
B
CD
E
#DevoxxFR
Consistent Hashing
suppression du noeud E
A
B
CD
E
A prend les objets de E
A
B
CD
E
#DevoxxFR
Consistent Hashing
A
B
CD
E
A E B
C B D C
E D
A
A B
C D
E
#DevoxxFR
Consistent Hashing
A
B
CD
E
A E B
C B D C
E D
A
A B
C D
E
#DevoxxFR
Consistent Hashing
A
B
CD
E
A E B
C B D C
E D
A
A B
C D
E
#DevoxxFR
Consistent Hashing
A
B
CD
E
A E B
C B D C
E D
A
A B
C D
E
#DevoxxFR
Consistent Hashing
A
B
CD
E
A E B
C B D C
E D
A
A B
C D
E
#DevoxxFR
Virtual Nodes
#DevoxxFR
Virtual Nodes
#DevoxxFR
Virtual Nodes
[org.infinispan.CLUSTER] (remote-thread--p7-t233) ISPN000310: Starting cluster-wide rebalance for cache authorization,
topology CacheTopology{id=11, rebalanceId=5, currentCH=DefaultConsistentHash{ns=80, owners = (3)[KCKVSCBABE12: 26+54,
KCKVSCOLDE12: 27+53, KCKVSCOLDE11: 27+53]}, pendingCH=DefaultConsistentHash{ns=80, owners = (4)[KCKVSCBABE12: 20+60,
KCKVSCOLDE12: 20+60, KCKVSCOLDE11: 20+60, KCKVSCBABE11: 20+60]}, unionCH=null, actualMembers=[KCKVSCBABE12, KCKVSCOLDE12,
KCKVSCOLDE11, KCKVSCBABE11]}
#DevoxxFR
Leader Preferred
A B C
réplication
leader leader
leader
chaque serveur A,B,C est le leader d’une partition et contient deux réplications
#DevoxxFR
Leader Preferred
A B C
leader
leader
Crash de A, B devient leader de 2 partitions
crash
réplication
#DevoxxFR
Leader Preferred
A B C
leader
leader
réplication
A revient mais ne redevient pas automatiquement un leader
réplication
#DevoxxFR
Split & Balance
chunk
chunk
chunk
chunk
chunk
chunk
chunk
chunk
chunk
Shard A
(replica set)
a:0...100
a:100...200
a:200...300
Shard B
(replica set)
Shard C
(replica set)
b:300...400
b:400...500
b:500...600
c:600...700
c:700...800
c:800...900
#DevoxxFR
Split & Balance
écritures
split
#DevoxxFR
Split & Balance
Shard A
(replica set)
Shard B
(replica set)
Shard C
(replica set)
#DevoxxFR#DevoxxFR
Compromis
#DevoxxFR
Split Brain
partition
réseau
interdire les écritures
(et les lectures?)
site 1
site 2
#DevoxxFR
Multisite
site 2site 1
réplication asynchrone inter-site
#DevoxxFR
Multisite
S
A
M
site 2
SS
site 1
site 3
write concern = 3
replication
asynchrone
crash
#DevoxxFR
Multisite
S
A
M
site 2
SS
site 1
site 3
write concern = 2
partition
#DevoxxFR
Multisite
M
A
M
site 2
SS
site 1
site 3
write concern = 2
partition
écritures validées
rollback ! S
oups!
#DevoxxFR#DevoxxFR
Simplicité
#DevoxxFR
Network of Brokers
updateClientClusters=true
rebalanceClientClusters=true
updateClusterClientsOnRemove=tru
e
serveur A
serveur C
serveur D
serveur B
producteur consommateur
#DevoxxFR
Master/Slave
lock
lock
crash
base de données fichier
lock
send/receive
message
#DevoxxFR
Silo
site 2site 1
kafka
consumer
application application
S S M S A
mongo
site 3
1
2
4
5
3
filtre
#DevoxxFR
faire du neuf avec du vieux: mcrouter (memcached), mysql+paxos
Back to Basics
optimisations applicatives: performance, compression
soigner son driver: attention à ne pas casser la résilience ou la scalabilité
#DevoxxFR
pour briller en société
http://highscalability.com/
https://blog.acolyer.org/
https://jepsen.io/
http://the-paper-trail.org/
https://landing.google.com/sre/book/index.html
#DevoxxFR#DevoxxFR

Finalement, c’est quoi un système distribué ?

Notes de l'éditeur

  • #3 un peu de teasing… pour notre présentation on va devoir faire besoin d’un vaisseau spatial, d’un extraterrestre de militaires d’un banquier byzantin du créateur de LateX (prononcé Latek)
  • #4 la session va se découper en 3 parties à peu près équivalentes. la fin de la première partie va pas mal faire bosser vos méninges donc on fera une petite pause.
  • #6 Transition La ligne un n’existe pas, nous avons besoin de système distribué
  • #9 Expliquer le GPS, système distribué incluant les devices sur Terre
  • #11 Transition on pourrait se donner une référence unique qui transmet à tout le monde le tick, donc tout le monde aurait une notion commune du temps
  • #12 il n’est pas rare que les messages arrivent désordonnés => d’où la nécessité de réordonner pour TCP
  • #18 notion de transparence de mobilité : déplacement de ressources de panne de localité d’échelle (augmentation de la taille du système)
  • #21 Intro: en tant que développeur quand on commence à remplacer une base relationnelle ou de cache mono instance par système équivalent distribué, on a une vision un peu naïve qu’il s’agit juste de juxtaposer des instances entre elles, d’ajouter quelques uri dans le driver et le système s’occupera du reste. Puis quand vient les premiers tests techniques, des besoins transactionnels ou des contentions de ressources, la petite musique s’emballe et on se retrouve avec un certain nombre de contraintes qu’on avait pas anticipé et dont on a du mal à comprendre la complexité. Tout ça a pourtant été théorisée depuis longtemps.
  • #26 Qu’est-ce qui nous assure que w(b) = 3 ne vient pas s’intercaler avec l’instruction w(a) = 2 ? Qu’aucune opération ne vient changer a et b lors de l’addition ? Une garantie forte du processeur !
  • #27 Le système donne l’impression de faire des opérations instantanées séparées par des pauses faire l’analogie avec l’écriture et notre vision du temps avec la conjugaison
  • #30 transition avec un tel modèle, il est aisé de raisonner mais….
  • #31 car par exemple on voit qu’il faut imposer des pauses dans le système, attendre visibilité par tout le monde attendre validation (comme une transaction), attendre propagation
  • #35 Pour les deux derniers points, à condition de ne pas rompre le “comme si” une par une
  • #41 non-transmission d’information ? message qui n’arrive jamais ? FLP ? l’arrêt d’un serveur est l’erreur la plus courante et celle dont va le plus parler dans le cadre des consensus byzantine failure est une façon élégante de dire qu’un serveur envoie n’importe quoi
  • #42 on ne rentrera pas dans les détails mais ce qu’il faut retenir c’est que le réseau n’est pas votre ami et qu’il ne faut prendre aucune hypothèse sur sa fiabilité.
  • #43 1975 - E. A. Akkoyunlu, K. Ekanadham, R. V. Huber En 1975, 3 chercheurs posaient un problème d’apparence simple mais qui pourtant n’a aucune solution. Imaginons 3 vallées avec une armée de bonhommes verts au milieu, et deux armées rivales, les bonhommes rouges, qui veulent attaquer les verts. On voit que si elle part seule, une armée rouge se fera battre car elle est en sous-nombre. Il faut donc qu’ils arrivent à se coordonner. …
  • #44 seulement l’armée verte peut, de temps en temps, intercepter des messages. comment chaque armée rouge peut être sûr que l’autre a bien reçu le message de l’autre ?
  • #45 si l’acquittement est intercepté, la première armée ne saura pas que la deuxième a bien reçu son premier message, et peut décider de ne pas attaquer alors que la deuxième si. ça ne marche pas quelque soit le nombre d’aller-retour qu’on fait.
  • #47 ne pas trop étaler, juste dire qu’on prend en compte encore plus de problèmes
  • #51 DERNIER POINT éviter les solutions triviales et valeurs sorties de nulle part
  • #52 dire “CECI EST UNE CONFIGURATION” ORDRE MESSAGES PAS IMPORTANT ON APELLE ASSEZ DE FOIS RECEIVE POUR COUVRIR
  • #53 dire “LE MODELE NE S’INTERESSE PAS AU CONSENSUS LUI-MEME”
  • #54 Le but n’est pas de trouver un mécanisme de consensus solide, c’est l’enjeu de la deuxième partie du talk :)
  • #63 PARLER DES ECHECS
  • #71 DECIDE POSSIBLE AVEC UN PROCESS EN PANNE
  • #76 IL NE CONTIENT PAS DE BIVALENTE QU’EST E QU’IL CONTIENT ?
  • #89 on autorise ainsi jamais le système à prendre de décision même très rapidement, dès le début
  • #91 transition ? au début des années 2000, Eric Brewer va énoncer une conjecture qui sera ensuite prouvée, qui est devenu très populaire avec l’arrivée de bases NoSQL.
  • #103 http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/ Paper Trail - Consensus protocols two phase commit - http://bit.ly/2mhfmnQ
  • #104 http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/
  • #105 http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/
  • #106 http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/
  • #107 Leslie Lamport - Paxos made simple - 01 nov 2001 - http://bit.ly/2mJebcM
  • #113 un cas de non terminaison
  • #114 multipaxos & fast paxos
  • #115 multipaxos & fast paxos
  • #116 Raft a été conçu pour dans le cadre d’un PhD afin de rendre compréhensible Paxos d’un point de vue pédagogique => statistiques http://bit.ly/2nJNXI8
  • #122 http://github.raft.io + compact snapshot
  • #123 l’algorithme de consensus valide ou non l’écriture dans les logs les logs sont stockés sur disque en fonction de la journalisation, la machine à état est modifiée le module consensus assure la sécurité du résultat, la disponibilité 2n+1, l’indépendance vis à vis du temps, une sous partie majoritaire peut répondre les logs doivent être répliqués
  • #124 l’algorithme de consensus valide ou non l’écriture dans les logs les logs sont stockés sur disque en fonction de la journalisation, la machine à état est modifiée la configuration = 1 log les logs doivent être répliqués
  • #125 l’algorithme de consensus valide ou non l’écriture dans les logs les logs sont stockés sur disque en fonction de la journalisation, la machine à état est modifiée les logs doivent être répliqués
  • #126  chaque couleur -> changement de terme un nouveau leader doit contenir tous les commits (vs Viewstamped Replication) un follower peut ne pas contenir tous les commits ou avoir des données non commitées When the leader at the top comes to power, it is possible that any of scenarios (a–f) could occur in follower logs. Each box represents one log entry; the number in the box is its term. A follower may be missing entries (a–b), may have extra uncommitted entries (c–d), or both (e–f). For example, scenario (f) could occur if that server was the leader for term 2, added several entries to its log, then crashed before committing any of them; it restarted quickly, became leader for term 3, and added a few more entries to its log; before any of the entries in either term 2 or term 3 were committed, the server crashed again and remained down for several terms.
  • #127  chaque couleur -> changement de terme un nouveau leader doit contenir tous les commits (vs Viewstamped Replication) un follower peut ne pas contenir tous les commits ou avoir des données non commitées When the leader at the top comes to power, it is possible that any of scenarios (a–f) could occur in follower logs. Each box represents one log entry; the number in the box is its term. A follower may be missing entries (a–b), may have extra uncommitted entries (c–d), or both (e–f). For example, scenario (f) could occur if that server was the leader for term 2, added several entries to its log, then crashed before committing any of them; it restarted quickly, became leader for term 3, and added a few more entries to its log; before any of the entries in either term 2 or term 3 were committed, the server crashed again and remained down for several terms.
  • #128 http://github.raft.io
  • #130 Raft a été conçu pour dans le cadre d’un PhD afin de rendre compréhensible Paxos d’un point de vue pédagogique => statistiques Spanner: Google’s Globally-Distributed Database - http://bit.ly/2mO9HSh
  • #134 parker lewis
  • #147 https://static.googleusercontent.com/media/research.google.com/fr/pubs/archive/45855.pdf
  • #149 http://www.foregen.org/science_of_regeneration https://motherboard.vice.com/en_us/article/australian-scientists-think-salamander-like-human-limb-regeneration-is-possible
  • #151 quizz ? pourquoi scaler horizontalement
  • #152 commidity hardware fusion io etc...
  • #156 multicast, point to point,
  • #172 ex du failback/failover
  • #178 TODO : 6 noeuds parfois moins bien que 5 noeuds (cf exemple SRE google)
  • #183 network of brokers
  • #184 cohérence, simple problème: scalabilité,nfs
  • #185 exercice défaut: écriture intersite au niveau consumer, écriture idempotent, messages bloqués
  • #186 http://bit.ly/2mNTelk
  • #187 références http://highscalability.com/ https://blog.acolyer.org/ https://aphyr.com/ http://the-paper-trail.org/