Archives pour l'étiquette cassandra

SQL ou No-SQL ? Pourquoi pas les deux ?

Il y a tellement de base de données qu’on se demande parfois laquelle choisir. Je pense à MySQL, MongoDB, Cassandra, JCR, Memcache, Redis, Oracle, Neo4j. En réalité ils en existent autant qu’ils existent de contraintes de persistance de données, ainsi que leurs forks. Pour répondre à la question SQL ou No-SQL ? pour moi c’est SQL avec du No-SQL.

Mysql

Certaines base de données relationnelles intègres des interfaces type no-sql, dans le cas de MySql il existe des extensions qui permet d’intéroger le memcache de mysql.
Je vous invite à regarder la conférence de Serge FREZEFOND au forumphp 2013.

 

MariaDB + Cassandra

MariaDB est un fork de MySQL.
Depuis la version 10.0 de MariaDB,  il est possible d’ajouter un plugin qui va permettre d’interroger Cassandra depuis MariaDB, tout en y fessant des jointures, ce qui n’est pas possible de faire dans une base de donnée comme Cassandra.

Commencer installer Cassandra sur votre serveur via leur tutoriel :
https://wiki.apache.org/cassandra/GettingStarted
Si vous installez Cassandra depuis les paquets Debian, vous aurez à votre disposition le browser cqlsh.
Ensuite installez le plugin sur MariaDB suivant la page Cassandra storage engine overview.

Une fois que tout est en place, vous pouvez voir votre plugin actif comme ceci :

MariaDB [(none)]> SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_VERSION, PLUGIN_MATURITY FROM information_schema.plugins WHERE PLUGIN_TYPE = "STORAGE ENGINE";
+--------------------+---------------+----------------+-----------------+
| PLUGIN_NAME        | PLUGIN_STATUS | PLUGIN_VERSION | PLUGIN_MATURITY |
+--------------------+---------------+----------------+-----------------+
| binlog             | ACTIVE        | 1.0            | Stable          |
| MEMORY             | ACTIVE        | 1.0            | Stable          |
| MyISAM             | ACTIVE        | 1.0            | Stable          |
| CSV                | ACTIVE        | 1.0            | Stable          |
| MRG_MyISAM         | ACTIVE        | 1.0            | Stable          |
| PERFORMANCE_SCHEMA | ACTIVE        | 0.1            | Gamma           |
| InnoDB             | ACTIVE        | 5.6            | Stable          |
| ARCHIVE            | ACTIVE        | 3.0            | Stable          |
| Aria               | ACTIVE        | 1.5            | Gamma           |
| FEDERATED          | ACTIVE        | 2.1            | Stable          |
| BLACKHOLE          | ACTIVE        | 1.0            | Stable          |
| partition          | ACTIVE        | 1.0            | Stable          |
| CASSANDRA          | ACTIVE        | 0.1            | Experimental    |
+--------------------+---------------+----------------+-----------------+

Maintenant connectons nous sur Cassandra via cqlsh, le but va être de créer la KEYSPACE mariadbtest2 et d’y ajouter des données qu’on va essayer de retrouver dans MariaDB.

➜ ~ cqlsh
 Connected to Test Cluster at localhost:9160.
 [cqlsh 2.2.0 | Cassandra 1.1.12 | CQL spec 2.0.0 | Thrift protocol 19.33.0]
 Use HELP for help.
 cqlsh> CREATE KEYSPACE mariadbtest2 WITH strategy_class = 'org.apache.cassandra.locator.SimpleStrategy' AND strategy_options:replication_factor='1';
 cqlsh> use mariadbtest2;
cqlsh:mariadbtest2> create columnfamily cf1 ( pk varchar primary key, data1 varchar, data2 bigint);
cqlsh:mariadbtest2> insert into cf1 (pk, data1, data2) values ('rowkey12', 'data1-value3', 454);
cqlsh:mariadbtest2> insert into cf1 (pk, data1, data2) values ('rowkey10', 'data1-value', 123456);
cqlsh:mariadbtest2> insert into cf1 (pk, data1, data2) values ('rowkey11', 'data1-value2', 34543);
cqlsh:mariadbtest2> select * from cf1;
pk        | data1        | data2
----------+--------------+--------
rowkey12  | data1-value3 | 454
rowkey10  | data1-value  | 123456
rowkey11  | data1-value2 | 34543

On viens de créer nos 3 valeurs dans Cassandra et maintenant nous allons nous connecter à MariaDB pour voir comment cela ce présente de son côté.

Attention : Il faut indiquer à MariaDB la connexion entre votre base de donnée et Cassandra via la création de la table avec les propriétés :

  • engine=cassandra
  • thrift_host=’localhost’
  • keyspace=’mariadbtest2′
➜ ~ mysql -u root -p
MariaDB [(none)]> use test;
MariaDB [test]> create table t1 (
-> pk varchar(36) primary key,
-> data1 varchar(60),
-> data2 bigint
-> ) engine=cassandra thrift_host='localhost' keyspace='mariadbtest2' column_family='cf1';
MariaDB [test]> select * from t1;
+----------+--------------+--------+
| pk       | data1        | data2  |
+----------+--------------+--------+
| rowkey12 | data1-value3 | 454    |
| rowkey10 | data1-value  | 123456 |
| rowkey11 | data1-value2 | 34543  |
+----------+--------------+--------+

À présent vous avez relié votre base de données SQL avec une base de données No-SQL, pour les personnes qui n’ont pas besoin de faire des relations de données entre des tables relationnelles et de la BIG DATA n’auront pas d’intérêt de faire tout cela.

Je n’ai pas eu l’occasion d’expérimenté ça avec une grosse quantité de donnée pour Cassandra et plusieurs jointures depuis MariaDB. Par contre j’ai trouvé un slideshare qui peut vous aider :
http://fr.slideshare.net/planetcassandra/5-colin-charles

(Bonus) Est-ce possible sans driver/plugin ?

Ce genre de chose peut-être également fait depuis votre application, il suffirait d’avoir un identifiant partagé entre plusieurs bases de données et via une requête on récupère une série d’ID qu’on exécute sur les autres bases de données.

Ce que je veux dire c’est qu’il est possible d’avoir une solution qui s’approche de ce qu’on vient de voir depuis votre application PHP, grâce à une librairie que j’ai écris :
https://github.com/pokap/pool-dbm

Cette librairie permet de faire des relations entre différente base de données (supporté par doctrine), grâce à un ID partagé et un mapping master & slave.