2. #DevoxxFR
Un peu de moi
Duy Hai DOAN
Evangéliste technique & consultant Apache Cassandra
• talks, meetups, confs
• projet open-source (Achilles, Apache Zeppelin)
• Des questions sur Apache Cassandra/Apache Zeppelin ?
☞ duy_hai.doan@datastax.com
☞ @doanduyhai
2
3. #DevoxxFR
Datastax
• Fondé en Avril 2010
• Plus gros pourvoyeur de contributeur à Apache Cassandra™
• Bureaux européens à Londres, Paris et Berlin
• Datastax Enterprise = OSS Cassandra + fonctionnalités+++
3
5. #DevoxxFR
Le défi
5
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
6. #DevoxxFR
Le défi
6
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
7. #DevoxxFR
Le défi
7
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
8. #DevoxxFR
Le défi
8
Dans un système distribué,
définir les conditions suffisantes à respecter
pour garantir la convergence des données
potentiellement désynchronisées
9. #DevoxxFR
CRDT
9
Conflict-free Replicated Data Types
Définit les conditions suffisantes pour un système
"strong eventually consistent"
Autorise une disponibilité extrême, N-1 nœuds en panne
sur N nœuds au total
10. #DevoxxFR 10
Types de CRDT
À état: Convergent Replicated Data Types (CvRDT)
Par fonction: Commutative Replicated Data Types (CmRDT)
11. #DevoxxFR
CvRDT: conditions d’application
11
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
12. #DevoxxFR
CvRDT: conditions d’application
12
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
13. #DevoxxFR
CvRDT: conditions d’application
13
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
Ensemble d’éléments partiellement ordonnés
ayant un borne supérieure (merci Wikipedia)
14. #DevoxxFR
CvRDT: conditions d’application
14
Tous les réplicas sont connectés (en général)
Échange d’état au moins 1 fois, sur un médium ponctuellement
fiable
L’ensemble des états forme un demi-treillis borné
Tous les changements d’état transitionnent vers un nouvel état en
suivant l’ordre partiel
16. #DevoxxFR
CvRDT: définition
16
A join semilattice (or just semilattice hereafter) is a partial order ≤v
equipped with a least upper bound (LUB) ⊔v, defined as follows:
Definition 2.4 m = x ⊔v y is a least upper bound of {x, y} under ≤v iff
x ≤v m and
y ≤v m and
there is no m′ ≤v m such that x ≤v m′ and y ≤v m′
It follows from the definition that ⊔v is: commutative: x ⊔v y =v y ⊔v x;
idempotent: x ⊔v x =v x; and associative: (x⊔v y)⊔v z =v x⊔v (y⊔v z).
18. #DevoxxFR
CvRDT: exemple G-Set
18
Payload
Set S, initial value S := { }
Query(e)
e ∈ S ?
Update
add(e): S := S ∪ {e}
Merge(S’)
S := S ∪ S’
relation d’ordre ≤v = ∈
opérateur ⊔v = ∪
l’union ensembliste ∪ est
commutative, associative et
idempotente
19. #DevoxxFR
relation d’ordre ≤v = ∈
opérateur ⊔v = ∪
l’union ensembliste ∪ est
commutative, associative et
idempotente
CvRDT: exemple G-Set
19
Payload
Set S, valeur initiale S := { }
Query(e)
e ∈ S ?
Update
add(e): S := S ∪ {e}
Merge(S’)
S := S ∪ S’
Problème: comment
gérer les suppressions
d’éléments dans
le Set ?
20. #DevoxxFR
CvRDT: 2P-Set
20
Payload
Set A, R initial value A := { } , R := { }
Query(e)
(e ∈ A) ∧ (e ∉ R) ?
Update
add(e): A := A ∪ {e}, remove(e): R := R ∪ {e}
Merge(A’, R’)
A := A ∪ A’, R := R ∪ R’
27. #DevoxxFR
Cassandra LWW
Et si t1 == t2 ? (précision timestamp à la ms)
Les DELETE sont prioritaires sur les INSERT/UPDATE
Comparer les valeurs par l’ordre de leur type (String, Date …) et
prendre la valeur la plus élevée
28. #DevoxxFR
Et si t1 == t2 ? (précision timestamp à la ms)
Les DELETE sont prioritaires sur les INSERT/UPDATE
Comparer les valeurs par l’ordre de leur type (String, Date …) et
prendre la valeur la plus élevée
Cette règle est-elle ?
- commutative
- associative
- idempotente
Cassandra LWW
29. #DevoxxFR
Cassandra LWW
Associativité
[("toto", t1), ("titi", t1)], ("tata",t1) à [("toto", t1), ("tata",t1)] à ("toto", t1)
("toto", t1), [("titi", t1), ("tata",t1)] à [("toto", t1), ("titi",t1)] à ("toto", t1)
Commutativité
("toto", t1), ("tata",t1) à ("toto", t1)
("tata", t1), ("toto",t1) à ("toto", t1)
Idempotence
("toto", t1), ("toto",t1) à ("toto", t1)
32. #DevoxxFR
Le défi
32
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
33. #DevoxxFR
Le défi
33
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
34. #DevoxxFR
Le défi
34
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
Pas de garantie d’isolation ou
d’écriture atomique
35. #DevoxxFR
Le défi
35
Dans un système distribué,
définir un algorithme
garantissant des lectures atomiques
sur des opérations multi-partitions
37. #DevoxxFR
Un peu de théorie
37
Serializability
Repeatable Read
Cursor Stability
Read Commited
Read Uncommited
Snapshot Isolation Linearizability
Causal
PRAM (Pipelined RAM)
RYW (Read Your Write)
Eventual Consistency
38. #DevoxxFR
Un peu de théorie
38
Serializability
Repeatable Read
Cursor Stability
Read Commited
Read Uncommited
Snapshot Isolation Linearizability
Causal
PRAM (Pipelined RAM)
RYW (Read Your Write)
Eventual Consistency
Coordination
synchrone
Sans
Coordination
39. #DevoxxFR
Un peu de théorie
39
Serializability
Repeatable Read
Cursor Stability
Read Commited
Read Uncommited
Snapshot Isolation Linearizability
Causal
PRAM (Pipelined RAM)
RYW (Read Your Write)
Eventual Consistency
Coordination
synchrone
Sans
Coordination
RAMP Transactions
40. #DevoxxFR
Read Atomic Multi-Partitions Transaction
Fournit une "visibilité atomique"
☞ Soit toutes les mises à jour d’une transaction sont
visibles, soit aucune ne l’est
RAMP Transaction
40
43. #DevoxxFR
Idépendance de Partition
☞ les clients n’ont besoin de contacter que les partitions
impliquées dans la transaction
Idépendance de Synchronisation
☞ la transaction d’un client ne peut bloquer les autres
clients.
☞ si le client peut accéder aux partitions de la
transaction, la transaction sera réussie à terme.
Garanties RAMP Transaction
43
59. #DevoxxFR
RAMP – Fast (Cas d’erreur)
59
Le client tombe après commit(X, t1)
☞ processus de maintenance pour valider les autres
partitions pas encore validées (force-commit)
Le client tombe après le dernier prepare
☞ processus de maintenance pour nettoyer Data[ ]
après un timeout
60. #DevoxxFR
RAMP – Fast (Cas d’erreur)
60
Le client fait un rollback(ts) après le dernier prepare
☞ enlever les valeurs écrites à ts dans Data [ ]
61. #DevoxxFR
RAMP – Fast (Coût Disque)
61
La taille des méta-données est linéairement
proportionnelle au nombre de partitions impliquées dans
la transaction
0
1
2
3
4
5
6
7
8
Taille
méta
données
1 2 3 4 5 6 7 8
Nb de partitions
81. #DevoxxFR
Détails d’implémentation
81
Réplication
☞ Attendre un ack pour N réplicas d’une partition (N
configurable)
Tâche de maintenance
☞ pour forcer un commit sur les partitions impliquées
dans une transaction ayant au moins 1 partition validée