10. NoSQL
« Il ne peut en rester qu‟un? »
Non :
« The right tool for the right job »
Les solutions NoSQL sont
simplement des outils.
Ce n‟est donc pas la mort des
RDBMS.
Highlander
11. NoSQL
Les solutions NoSQL aussi!
Il ne faut pas en faire si vous n‟en n‟avez pas besoin
13. Définition
Map cassandra = new HashMap();
(de toute façon dans la vie tout est hashmap)
Ok, C‟est quand même plus que ça
14. Définition
Apache Cassandra™ est une Base de données :
• Distribuée
• Hautement performante
• Extrêmement scalable
• Tolérante aux pannes (i.e. “no single point of
failure”)
• proposant un modèle plus riche que le simple
modèle “key/value”
15. Les origines
Dynamo Big table
Modèle distribué Modèle de données et
architecture de stockage
16. Quelques dates
• Développé initialement par Facebook pour la partie
« inbox search »
• « Open sourcé » en 2008
• Devient un projet apache dans l‟incubator en 2009
• « Top level project » apache en 2010
• Release 1.0 en Octobre 2011 (aujourd‟hui en 1.0.5)
17. Architecture
• Tous les nœuds du cluster ont le même rôle
• Pas de spof (les clients peuvent se connecter à
n‟importe quel nœud)
• Schéma optionnel
• Communication peer to peer (gossip protocol)
• Datacenter « aware »
• Eventuellement consistant
• Cache applicatif
19. Architecture
vs RDBMS : ce qu‟on perd
• Pas de jointure (à faire coté client ou avec
Map/reduce)
• Pas de lock ni de transactions (à faire coté
client, zookeeper, cage)
Ok et qu‟est ce qu‟il se passe quand on fait du
« sharding » sur un RDBMS?
20. Architecture
vs RDBMS : ce qu‟on gagne
• Pas de SPOF (réellement)
• Schéma optionnel (avec possibilité de rajouter des
metadata pour faciliter le requêtage)
• Scalabilité linéaire (pour être 2x plus performant :
rajouter 2x plus de nœuds et sans coupure ;-))
• (Very) Big Data
27. Modèle de données
• Les « columns » et « super columns » sont triés sur
le nom de la colonne
• Ce tri est défini au niveau « column family »
• Les tris prédéfinis sont:
– ByteType (default)
– LongType
– UTF8Type
– LexicalUUIDType
– TimeUUIDType
29. API
cassandra.put(key,value);
value = cassandra.get(key);
Ok, C‟est quand même plus que ça
30. API
• Ecriture / mise à jour / suppression (en fait c‟est la
même opération) sur une colonne, plusieurs
colonnes, une ligne.
– Toutes ces actions sont idempotentes! (sauf les
compteurs)
• Lecture
– Get : lire une seule colonne
– get_slice : lire un ensemble de colonnes (par nom
ou par intervalle)
– get_range_slice : un slice sur un ensemble de
lignes.
– Query by value (secondary index)
31. API
• Manipulation sur le schema
• CQL execution (depuis la 0.8)
– Aussi un moyen d‟effectuer des lectures
– Langage de requêtage « SQL like » simplifié.
33. Partionnement
• Le partionnement permet de répartir les lignes sur
les nœuds du cluster (à partir de la clé)
• Plusieurs choix de partitionnement (au niveau
cluster) :
– RandomPartitioner : (par defaut)
– ByteOrderedPartitioner : stocke les lignes dans
l‟ordre des <rowkey> à travers les nœuds du
cluster
34. Partionnement
• RandomPartioner
– Un token est défini au niveau de chaque nœud
un BigInteger entre 0 et 2**127
– Chaque nœud est responsable des cles qui sont
dans l‟intervalle qu‟il gère (intervalle entre le
token du nœud précédent et le token du nœud).
– Un hash (md5) de la clé est effectué et définit un
token. La ligne est envoyé sur le nœud qui gère
l‟intervalle concerné.
36. Replication
• La réplication est gérée au niveau d‟un keyspace
par le replication_factor
• Le replication_factor définit le nombre de copies
globales sur le cluster d‟une ligne
• La façon dont sont placés les replicas dépend de la
stratégie choisie
37. Replication
SimpleStrategy : les réplicas sont placés sur les
nœuds suivants dans le cluster
Exemple avec un RF = 3 A BCDEFGHIJKL
XYZA
md5(« jsevellec ») =D
W L
D
D
UVW
MNOPQRST
T
D
38. Replication
NetworkTopologyStrategy :
• la ligne est placée avec le « partitioner »
• les réplicas peuvent être placés dans un autre rack,
un autre datacenter…
• Il faut définir la topology du cluster : snitch.
41. Consistance
• Cassandra a fait le choix :
– Availability
– Partition Tolerance
• Et la consistance???
- “Instead of designing (costly) measure to prevent
inconsistency, we acknowledge that the cluster may
be in an inconsistent state for a brief period of time,
and we deal with it”
42. Consistance
• Cassandra permet au client de faire le choix entre
consistance et latence (pour chaque opération).
• Le consistency_level est liée au replication_factor. Il
définit le nombre de nœud devant se synchroniser avant
de répondre à une opération.
• Les différents niveaux de consistance sont :
– None
– One
– Quorum
– All
43. Consistance
WRITE
Write(„Y‟) Y
A BCDEFGHIJKL
Combien de nœuds doivent
répondre pour que ce soit un XYZA
succès ?
- CL.NONE : aucun
W L
- CL.ONE : 1 ? Y
- CL.QUORUM : 1 de plus que
la moitié des réplicas
- CL.ALL : tous les nœuds UVW
concernés par les réplicas. MNOPQRST
T
Y
44. Consistance
READ
READ(„Y‟) Y
A BCDEFGHIJKL
Combien de nœuds doivent
répondre pour que ce soit un XYZA
succès ?
- CL.ONE : 1
W L
- CL.QUORUM : 1 de plus que ? Y
la moitié des réplicas
- CL.ALL : tous les nœuds
concernés par les réplicas. UVW
MNOPQRST
T
Y
45. Consistance
Pour réparer de « l‟inconsistance » quand elle se
produit (perte d‟un nœud, …) :
• Hintend handoff : Quand un nœud n‟est pas
disponible, les insertions sont envoyés à un autre
nœud qui lui renverra quand le nœud redeviendra
disponible.
• Read repair : En lecture, si les valeurs différents, les
nœuds désynchronisés sont réparés en insérant les
nouvelles valeurs (basé sur le timestamp)
47. Outillage
• cassandra-cli : client ligne de commande de
requêtage (meta_data, put et get).
• cqlsh : client cql de requêtage
• nodetool : opération d‟administration sur les nœuds
du cluster
55. Hector
Connectivité :
• Pool de connexions
• Load balancing configurable (par défaut round
robin)
• Découverte automatique des noeuds
• Réessai automatique sur les noeuds non
disponibles
• Suspension des noeuds pour une courte période
après plusieurs timeout
56. Hector
Api objet :
• Orienté objet
• Encapsulation complète de Thrift
• Approche typée pour traiter avec le modèle de
données
• ORM (simple)
• HFactory = helper d‟instanciation d‟objet Hector
58. Hector
• Intégration sans problème avec Spring
– Injecter l‟objet « keyspace »
• Hector Object Mapper :
– ORM simple
– Propose une implémentation JPA
59. cassandra-unit
• Tu aimes :
– Cassandra
– Le TDD
– L‟intégration continue
Dans ce cas, cassandra-unit est fait pour toi :
- démarre un cassandra « embedded »
- chargement de données à partir de dataset
(xml, json, yaml)
61. Conseils
• Tout oublier ce que vous saviez sur les SGBDR
– Dénormalisation, duplication, …
• Créer votre modèle en pensant aux requêtes que
vous allez devoir faire
• Installation simple et efficace : apt-get install
cassandra ou yum install cassandra
62. Conseils
• Bien choisir votre replication_factor (structurant)
• Bien choisir votre partitioner (très structurant)
• Être couvert par ses tests! (pour permettre de
refactorer et faire évoluer votre modèle en phase de
développements)
63. Conseils
• Il faut bien garder à l‟esprit les principaux concepts
de cassandra quand vous développez votre
application
• Être couvert par ses tests! (pour permettre de
refactorer et faire évoluer votre modèle en phase de
développements), je sais, je l‟ai déjà dit
64. Liens utiles
• Cassandra :
– http://cassandra.apache.org/
– ML : user@cassandra.apache.org
dev@cassandra.apache.org
– irc.freenode.net #cassandra #cassandra-dev #cassandra-
ops
– http://www.datastax.com/ (société commerciale autour de
cassandra)
• Hector
– http://hector-client.org
– Google groups : hector-users@googlegroups.com
• Casandra-Unit :
– https://github.com/jsevellec/cassandra-unit
– https://github.com/jsevellec/cassandra-unit-examples
65. Questions?
Ceci est un cluster de dev cassandra