3. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
CASSANDRA
Base de données NoSQL orientée colonne
Extrêmement rapide
Pas de SPOF
Écrite en Java
...
2008
Facebook
2013
1.2
2009 2010 2011 2012
1.11.00.8
Apache
top level 0.8
Apache
incubator
4. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
CASSANDRA JAVA DRIVER
DATASTAX CASSANDRA JAVA DRIVER
CQL 3 + CQL Binary Protocol
Version 1.0.0
Release Mai 2013
Compatible avec Cassandra 1.2+
Apache License Version 2.0
Développé par les équipes de Datastax
5. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
CQL 3 - CQL
CQL : C assandra Query Language
CQL 3 ~ = SQL
Même syntaxe sans agrégation (JOIN, GROUP BY, …)
Changement de philosophie avec CQL 3 :
→ Nécessite un schéma !
CREATE TABLE Users (KEY text PRIMARY KEY, NAME text)
INSERT INTO Users(KEY, NAME) VALUES ('1','Buzz') SELECT * FROM Users
UPDATE Users SET NAME='Woody' WHERE KEY='1'
ALTER TABLE Users ADD AGE text
6. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
CQL 3 - SCHEMA
ippon@ippon:~$ cqlsh -2 -k ippevent
[cqlsh 3.0.2 | Cassandra 0.0.0 | CQL spec 2.0.0 | Thrift protocol 19.36.0]
cqlsh:ippevent> CREATE TABLE person (KEY text PRIMARY KEY, NAME text);
cqlsh:ippevent> INSERT INTO person(KEY, NAME, AGE) VALUES ('1','buzz',30);
cqlsh:ippevent> SELECT * FROM person;
KEY | AGE | NAME
-----+-----+------
1 | 30 | buzz
ippon@ippon:~$ cqlsh -3 -k ippevent
[cqlsh 3.0.2 | Cassandra 1.2.5 | CQL spec 3.0.0 | Thrift protocol 19.36.0]
cqlsh:ippevent> CREATE TABLE person (KEY text PRIMARY KEY, NAME text);
cqlsh:ippevent> INSERT INTO person(KEY, NAME, AGE) VALUES ('1','buzz',30);
Bad Request: Unknown identifier age
CLQ 2
CLQ 3
7. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
CQL 3 - UPSERT
Cependant l'UPSERT reste possible
cqlsh:ippevent> SELECT * FROM Mutations;
cqlsh:ippevent> UPDATE Mutations SET A='value from UPDATE'
WHERE KEY='1';
cqlsh:ippevent> SELECT * FROM Mutations;
key | a | b
-----+-------------------+------
1 | value from UPDATE | null
cqlsh:ippevent> INSERT INTO Mutations(KEY,B)
VALUES('1','value from INSERT');
cqlsh:ippevent> SELECT * FROM Mutations;
key | a | b
-----+-------------------+-------------------
1 | value from UPDATE | value from INSERT
8. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
CQL 3 – Super Column
Abandon des Super Columns
Colonne dont la valeur est des colonnes
→ Préférer désormais l'utilisation de
clustering keys
buzz AGE ADRESSE
32 NUMERO RUE VILLE
90 Baudin Levallois
9. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
CQL 3 – Modélisation (Wide Rows)
Wide Rows
Cassandra peut stocker plus de 2M de colonnes par
clef.
Exemple :
→ Comment faire avec CQL 3 ?
buzz 133829 133950 134022 142109
Star command
...
Vers l'infini Où est Zurg ? Space
command ...
woody 133983 134802
J'ai un
serpent ...
Qui a
empoisonné ...
KEY COLUMNS ...
10. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
CQL 3 – Modélisation (Wide Rows)
buzz 133829-dialog 133950-dialog 134022-dialog 142109-dialog
Star command ... Vers l'infini Où est Zurg ? Space command ...
woody 133983-dialog 134802-dialog
J'ai un serpent ... Qui a empoisonné ...
CREATE TABLE DIALOG (
username VARCHAR,
said_at TIMESTAMP,
dialog VARCHAR,
PRIMARY KEY (username, said_at)
)
username said_at dialog
buzz 133829 Star command ...
buzz 133950 Vers l'infini ...
...
woody 133983 J'ai un serpent ...
...
Représentation Logique
Représentation Physique
Partition key Clustering key
13. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
CQL Binary Protocol
CQL Binary Protocol remplaçant de Thrift
Thrift : rapide et multi-language
Pourquoi changer ? RPC seulement.
CQL Binary Protocol ouvre la porte au
streaming (curseurs), aux notifications
techniques, …
Mais Thrift reste maintenu
14. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
CQL Binary Protocol
Nouveau port (9042 par défaut)
Actif par défaut Cassandra 1.2.5+
Peut cohabiter avec l'interface Thrift
$CASSANDRA_HOME/conf/cassandra.yaml
# Whether to start the native transport server.
# Please note that the address on which the native transport is bound is the
# same as the rpc_address. The port however is different and specified below.
start_native_transport: true
# port for the CQL native transport to listen for clients on
native_transport_port: 9042
# Whether to start the thrift rpc server.
start_rpc: true
# port for Thrift to listen for clients on
rpc_port: 9160
17. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
Java Driver - QueryBuilder
QueryBuilder :
Construction de requêtes typées
Fluent API
Opérations supportées
SELECT
UPDATE
INSERT
DELETE
BATCH
Pas encore d’opérations de DDL (prévu en 1.1.0)
18.
19.
20.
21.
22.
23. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
Java Driver – Policies
ReconnectionPolicy
ConstantReconnectionPolicy // ré-éssai à intervall régulier
ExponentialReconnectionPolicy
LoadBalancingPolicy
DCAwareRoundRobinPolicy // load balance au sein d'un DC
RoundRobinPolicy
TokenAwarePolicy // load balance sur les nœuds qui ont la data
RetryPolicy
DowngradingConsistencyPolicy
LoggingRetryPolicy
24. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
AGILITE
CONCLUSION
Java Driver utilise un nouveau socle tourné vers les
futures releases de Cassandra
CQL 3
Adoption par utilisateurs SQL facilitée
Représentation logique de stockages spécifiques
CQL Binary Protocol
Taillé pour la forte volumétrie
Permettra d'accueillir de nouvelles fonctionnalités (ex :
curseurs)
1ère implémentation de ces 2 socles
API très agréable à utiliser
Très configurable/extensible
25. www.ippon.fr www.atomes.com www.ippon-mobile.fr http://blog.ippon.fr
Liens
C* Summit 2013 :
http://planetcassandra.org/Learn/CassandraSummit
NYC* 2013 - New Cassandra Drivers in Depth« »
Michael Figuière
Documentation :
http://www.datastax.com/doc-source/developer/java-driver/
Benchs
https://github.com/brianfrankcooper/YCSB
https://github.com/vberetti/YCSB