Cassandra pour les développeurs java

Preview:

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 : 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

Questions?

Ceci est un cluster de dev cassandra

Recommended