65
pour les (ch’tis) Développeurs Java Jérémy Sevellec

Cassandra pour les développeurs java

Embed Size (px)

DESCRIPTION

Présentation de Cassandra à la session NoSQL du Ch'ti Jug le 12 Décembre

Citation preview

Page 1: Cassandra pour les développeurs java

pourles (ch’tis) Développeurs Java

Jérémy Sevellec

Page 2: Cassandra pour les développeurs java

Merci à

• Nate McCall (@zznate)

• Sylvain Lebresne (@pcmanus)

• Jonathan Ellis (@spyced)

Page 3: Cassandra pour les développeurs java

Qui est-ce?

MB « Qui Est-ce? »

Page 4: Cassandra pour les développeurs java

Qui est-ce?

<moi>• Jérémy Sevellec

• Je travaille chez Sarbacane Software sur la problématique NoSQL (entre autres choses…)

Page 5: Cassandra pour les développeurs java

Qui est-ce?• Je suis développeur (« What else? »)

Page 6: Cassandra pour les développeurs java

Qui est-ce?• Oui, j’ai lu « Clean Code » et vous?

Page 7: Cassandra pour les développeurs java

Qui est-ce?• Twitter :

• http://unchticafe.fr

</moi>

Page 8: Cassandra pour les développeurs java

« Agenda »• CassandraLes principaux concepts

• HectorComment l’utiliser

• cassandra-unitUne librairie indispensable ;-)

Page 9: Cassandra pour les développeurs java

NoSQL

Au delà du buzz

Toy Story

Page 10: Cassandra pour les développeurs java

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

Page 11: Cassandra pour les développeurs java

NoSQL

Les solutions NoSQL aussi!Il ne faut pas en faire si vous n’en n’avez pas

besoin

Page 12: Cassandra pour les développeurs java

Définition

Cassandra, c’est quoi?

Page 13: Cassandra pour les développeurs java

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

Page 14: Cassandra pour les développeurs java

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”

Page 15: Cassandra pour les développeurs java

Les origines

Dynamo

Modèle distribué

Big table

Modèle de données et architecture de stockage

Page 16: Cassandra pour les développeurs java

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)

Page 17: Cassandra pour les développeurs java

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

Page 18: Cassandra pour les développeurs java

Architecture

vs RDBMS

Page 19: Cassandra pour les développeurs java

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?

Page 20: Cassandra pour les développeurs java

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

Page 21: Cassandra pour les développeurs java

Modèle de données

Et le modèle de données dans tout ça?

Page 22: Cassandra pour les développeurs java

Modèle de données

Map<Key,Columns> cassandra = new HashMap<> ();

(« java 1.7 style »)

Ok, C’est quand même plus que ça

Page 23: Cassandra pour les développeurs java

« Columns »

name value ts

column

”fname” “jeremy”

Page 24: Cassandra pour les développeurs java

« Rows »

row

”fname” “jeremy”

“lname” “sevellec”

“phone” 060809..

”age” 30

« jsevellec »

Page 25: Cassandra pour les développeurs java

« 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»

Page 26: Cassandra pour les développeurs java

« Column Family »

(super) ColumnFamily

10 “…”

11 “...”

17 “…”..

18 “…”

« key2»

5 “…”

10 “…”

18 “…”

« key3 »

« superKey1»

1 “…”

123 “…”

1234 “…”

12345 “…”

« key1»

« superKey2»

Page 27: Cassandra pour les développeurs java

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

Page 28: Cassandra pour les développeurs java

API

Qu’est-ce que je peux faire avec?

Page 29: Cassandra pour les développeurs java

API

cassandra.put(key,value);value = cassandra.get(key);

Ok, C’est quand même plus que ça

Page 30: Cassandra pour les développeurs java

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)

Page 31: Cassandra pour les développeurs java

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é.

Page 32: Cassandra pour les développeurs java

Partitionnement et Replication

irobot

Page 33: Cassandra pour les développeurs java

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

Page 34: Cassandra pour les développeurs java

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é.

Page 35: Cassandra pour les développeurs java

Partionnement

RandomPartitioner Exemple :• 4 nœuds• Token = de A à Z

md5(« jsevellec ») =D

BCDEFGHIJKL

MNOPQRSTUVW

XYZA

A

W

T

L

Page 36: Cassandra pour les développeurs java

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

Page 37: Cassandra pour les développeurs java

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

Page 38: Cassandra pour les développeurs java

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.

Page 39: Cassandra pour les développeurs java

Consistance

Mais c’est quoi cette histoire de consistance?

Page 40: Cassandra pour les développeurs java

Consistance• Le théorème CAP

• Tu ne peux en prendre que 2 et puis c’est tout.

Availability

Partition Tolerance

Consistency

Page 41: Cassandra pour les développeurs java

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”

Page 42: Cassandra pour les développeurs java

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

Page 43: Cassandra pour les développeurs java

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?

Page 44: Cassandra pour les développeurs java

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?

Page 45: Cassandra pour les développeurs java

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)

Page 46: Cassandra pour les développeurs java

Outillage

Page 47: Cassandra pour les développeurs java

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

Page 48: Cassandra pour les développeurs java

Outillage• OPSCenter

Page 49: Cassandra pour les développeurs java

Client

Et mon application dans tout ça?

Page 50: Cassandra pour les développeurs java

Client

Cassandra n’impose pas un client, il faut en choisir un dans son langage

Page 51: Cassandra pour les développeurs java

Client

Besoin d’un client en Java?

Page 52: Cassandra pour les développeurs java

Client• Clients java :

– Pelops– Kundera– Easy-Cassandra– Cassandrelle

et surtout il y a : Hector, le plus populaire

Page 53: Cassandra pour les développeurs java

Hector

Page 54: Cassandra pour les développeurs java

Hector• http://hector-client.org

• Disponible sur le repository maven public

• Des projets exemples disponibles sur github

• Documentation « pas trop mal »

Page 55: Cassandra pour les développeurs java

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

Page 56: Cassandra pour les développeurs java

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

Page 57: Cassandra pour les développeurs java

Hector

Du code, du code, du code!

Page 58: Cassandra pour les développeurs java

Hector• Intégration sans problème avec Spring

– Injecter l’objet « keyspace »

• Hector Object Mapper :– ORM simple– Propose une implémentation JPA

Page 59: Cassandra pour les développeurs java

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)

Page 60: Cassandra pour les développeurs java

cassandra-unit

Du code, du code, du code!

Page 61: Cassandra pour les développeurs java

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

Page 62: Cassandra pour les développeurs java

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)

Page 63: Cassandra pour les développeurs java

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

Page 64: Cassandra pour les développeurs java

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

Page 65: Cassandra pour les développeurs java

Questions?

Ceci est un cluster de dev cassandra