Upload
jeremy-sevellec
View
5.065
Download
6
Embed Size (px)
DESCRIPTION
Présentation de Cassandra à la session NoSQL du Ch'ti Jug le 12 Décembre
Citation preview
pourles (ch’tis) Développeurs Java
Jérémy Sevellec
Merci à
• Nate McCall (@zznate)
• Sylvain Lebresne (@pcmanus)
• Jonathan Ellis (@spyced)
Qui est-ce?
MB « Qui Est-ce? »
Qui est-ce?
<moi>• Jérémy Sevellec
• Je travaille chez Sarbacane Software sur la problématique NoSQL (entre autres choses…)
Qui est-ce?• Je suis développeur (« What else? »)
Qui est-ce?• Oui, j’ai lu « Clean Code » et vous?
Qui est-ce?• Twitter :
• http://unchticafe.fr
</moi>
« Agenda »• CassandraLes principaux concepts
• HectorComment l’utiliser
• cassandra-unitUne librairie indispensable ;-)
NoSQL
Au delà du buzz
Toy Story
NoSQL
« Il ne peut en rester qu’un? »
Non :
« The right tool for the right job »
Les solutions NoSQL sontsimplement des outils.
Ce n’est donc pas la mort des RDBMS.
Highlander
NoSQL
Les solutions NoSQL aussi!Il ne faut pas en faire si vous n’en n’avez pas
besoin
Définition
Cassandra, c’est quoi?
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
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”
Les origines
Dynamo
Modèle distribué
Big table
Modèle de données et architecture de stockage
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)
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
Architecture
vs RDBMS
Architecture
vs RDBMS : ce qu’on perd
• Pas de jointure (à faire coté client ou avecMap/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?
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
Modèle de données
Et le modèle de données dans tout ça?
Modèle de données
Map<Key,Columns> cassandra = new HashMap<> ();
(« java 1.7 style »)
Ok, C’est quand même plus que ça
« Columns »
name value ts
column
”fname” “jeremy”
« Rows »
row
”fname” “jeremy”
“lname” “sevellec”
“phone” 060809..
”age” 30
« jsevellec »
« Column Family »
ColumnFamily
”fname” “jeremy”
“lname” “sevellec”
“phone” 060809..
”age” 21
« jsevellec»
”fname” “Chuck”
“lname” “norris”
“phone” 000000..
« cnorris »
”fname” “steve”
“lname” “job”
“phone” 060809..
“picture”0x1590...
« sjob»
« Column Family »
(super) ColumnFamily
10 “…”
11 “...”
17 “…”..
18 “…”
« key2»
5 “…”
10 “…”
18 “…”
« key3 »
« superKey1»
1 “…”
123 “…”
1234 “…”
12345 “…”
« key1»
« superKey2»
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
API
Qu’est-ce que je peux faire avec?
API
cassandra.put(key,value);value = cassandra.get(key);
Ok, C’est quand même plus que ça
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)
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é.
Partitionnement et Replication
irobot
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
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é.
Partionnement
RandomPartitioner Exemple :• 4 nœuds• Token = de A à Z
md5(« jsevellec ») =D
BCDEFGHIJKL
MNOPQRSTUVW
XYZA
A
W
T
L
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
Replication
SimpleStrategy : les réplicas sont placés sur les nœuds suivants dans le cluster
Exemple avec un RF = 3BCDEFGHIJKL
MNOPQRSTUVW
XYZA
A
W
T
L
md5(« jsevellec ») =D
D
D
D
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.
Consistance
Mais c’est quoi cette histoire de consistance?
Consistance• Le théorème CAP
• Tu ne peux en prendre que 2 et puis c’est tout.
Availability
Partition Tolerance
Consistency
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”
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
Consistance
WRITE
BCDEFGHIJKL
MNOPQRSTUVW
XYZA
A
W
T
L
Write(‘Y’) Y
Combien de nœuds doivent répondre pour que ce soit un succès ?
- CL.NONE : aucun- CL.ONE : 1- CL.QUORUM : 1 de plus que
la moitié des réplicas- CL.ALL : tous les nœuds
concernés par les réplicas.
Y
Y?
Consistance
READ
BCDEFGHIJKL
MNOPQRSTUVW
XYZA
A
W
T
L
READ(‘Y’) Y
Combien de nœuds doivent répondre pour que ce soit un succès ?
- CL.ONE : 1- CL.QUORUM : 1 de plus que
la moitié des réplicas- CL.ALL : tous les nœuds
concernés par les réplicas.
Y
Y?
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)
Outillage
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
Outillage• OPSCenter
Client
Et mon application dans tout ça?
Client
Cassandra n’impose pas un client, il faut en choisir un dans son langage
…
Client
Besoin d’un client en Java?
Client• Clients java :
– Pelops– Kundera– Easy-Cassandra– Cassandrelle
et surtout il y a : Hector, le plus populaire
Hector
Hector• http://hector-client.org
• Disponible sur le repository maven public
• Des projets exemples disponibles sur github
• Documentation « pas trop mal »
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
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
Hector
Du code, du code, du code!
Hector• Intégration sans problème avec Spring
– Injecter l’objet « keyspace »
• Hector Object Mapper :– ORM simple– Propose une implémentation JPA
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)
cassandra-unit
Du code, du code, du code!
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
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)
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
Liens utiles• Cassandra :
– http://cassandra.apache.org/– ML : [email protected] 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 : [email protected]
• Casandra-Unit :– https://github.com/jsevellec/cassandra-unit– https://github.com/jsevellec/cassandra-unit-examples
Questions?
Ceci est un cluster de dev cassandra