pour
les (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 »
• Cassandra
Les principaux concepts

• Hector
Comment l‟utiliser

• cassandra-unit
Une 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 sont
simplement 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                                 Big table


Modèle distribué                  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 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? 
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 »



     column
   name value ts

  ”fname” “jeremy”
« Rows »
    row

   « jsevellec »

”fname” “jeremy”

“lname” “sevellec”

“phone” 060809..

”age”    30
« Column Family »

                     ColumnFamily

   « jsevellec»          « cnorris »         « sjob»

”fname” “jeremy”     ”fname” “Chuck”    ”fname” “steve”

“lname” “sevellec”   “lname” “norris”   “lname” “job”

“phone” 060809..     “phone” 000000..   “phone” 060809..

”age”    21                             “picture” 0x1590..
                                                  .
« Column Family »

                (super) ColumnFamily

           « superKey1»                  « superKey2»


     « key2»              « key3 »          « key1»

10      “…”        5          “…”    1         “…”

11      “...”      10         “…”    123       “…”

17      “…”        18         “…”    1234      “…”
        ..
18      “…”                          12345     “…”
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
                                     A   BCDEFGHIJKL
                              XYZA
md5(« jsevellec ») =D



                               W              L



                              UVW
                                          MNOPQRST
                                     T
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 = 3                     A    BCDEFGHIJKL
                                  XYZA
md5(« jsevellec ») =D



                                   W                   L
                                                           D
                              D


                              UVW
                                                    MNOPQRST
                                           T
                                          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.
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
                 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
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
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

Cassandra pour les développeurs java

  • 1.
    pour les (ch‟tis) DéveloppeursJava Jérémy Sevellec
  • 2.
    Merci à • NateMcCall (@zznate) • Sylvain Lebresne (@pcmanus) • Jonathan Ellis (@spyced)
  • 3.
    Qui est-ce? MB « Qui Est-ce? »
  • 4.
    Qui est-ce? <moi> • JérémySevellec • Je travaille chez Sarbacane Software sur la problématique NoSQL (entre autres choses…)
  • 5.
    Qui est-ce? • Jesuis développeur (« What else? »)
  • 6.
    Qui est-ce? • Oui,j‟ai lu « Clean Code » et vous?
  • 7.
    Qui est-ce? • Twitter: • http://unchticafe.fr </moi>
  • 8.
    « Agenda » •Cassandra Les principaux concepts • Hector Comment l‟utiliser • cassandra-unit Une librairie indispensable ;-)
  • 9.
    NoSQL Au delà dubuzz Toy Story
  • 10.
    NoSQL « Il nepeut 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
  • 12.
  • 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™ estune 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 lesnœ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
  • 18.
    Architecture vs RDBMS
  • 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
  • 21.
    Modèle de données Etle modèle de données dans tout ça?
  • 22.
    Modèle de données Map<Key,Columns>cassandra = new HashMap<> (); (« java 1.7 style ») Ok, C‟est quand même plus que ça
  • 23.
    « Columns » column name value ts ”fname” “jeremy”
  • 24.
    « Rows » row « jsevellec » ”fname” “jeremy” “lname” “sevellec” “phone” 060809.. ”age” 30
  • 25.
    « Column Family» ColumnFamily « jsevellec» « cnorris » « sjob» ”fname” “jeremy” ”fname” “Chuck” ”fname” “steve” “lname” “sevellec” “lname” “norris” “lname” “job” “phone” 060809.. “phone” 000000.. “phone” 060809.. ”age” 21 “picture” 0x1590.. .
  • 26.
    « Column Family» (super) ColumnFamily « superKey1» « superKey2» « key2» « key3 » « key1» 10 “…” 5 “…” 1 “…” 11 “...” 10 “…” 123 “…” 17 “…” 18 “…” 1234 “…” .. 18 “…” 12345 “…”
  • 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
  • 28.
    API Qu‟est-ce que jepeux faire avec?
  • 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 surle schema • CQL execution (depuis la 0.8) – Aussi un moyen d‟effectuer des lectures – Langage de requêtage « SQL like » simplifié.
  • 32.
  • 33.
    Partionnement • Le partionnementpermet 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é.
  • 35.
    Partionnement RandomPartitioner Exemple : •4 nœuds • Token = de A à Z A BCDEFGHIJKL XYZA md5(« jsevellec ») =D W L UVW MNOPQRST T
  • 36.
    Replication • La réplicationest 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 : lesré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 : • laligne 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.
  • 39.
    Consistance Mais c‟est quoicette histoire de consistance?
  • 40.
    Consistance • Le théorèmeCAP • Tu ne peux en prendre que 2 et puis c‟est tout.
  • 41.
    Consistance • Cassandra afait 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 permetau 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)
  • 46.
  • 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
  • 48.
  • 49.
  • 50.
    Client Cassandra n‟impose pasun client, il faut en choisir un dans son langage …
  • 51.
  • 52.
    Client • Clients java: – Pelops – Kundera – Easy-Cassandra – Cassandrelle et surtout il y a : Hector, le plus populaire
  • 53.
  • 54.
    Hector • http://hector-client.org • Disponiblesur le repository maven public • Des projets exemples disponibles sur github • Documentation « pas trop mal »
  • 55.
    Hector Connectivité : • Poolde 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
  • 57.
    Hector Du code, ducode, du code!
  • 58.
    Hector • Intégration sansproblè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)
  • 60.
  • 61.
    Conseils • Tout oublierce 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 choisirvotre 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 fautbien 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