NoSQL : premiers pas avec Cassandra

October 1, 2010

Je reviens après ce long silence pour vous présenter une “nouvelle” technologie qui se développe de plus en plus : les bases de données NoSQL, et principalement Cassandra, la solution de la fondation Apache.

Introduction

Pour commencer, une base de données NoSQL q’est-ce que c’est ?

C’est une base de données non relationnelle. La plupart des bases de données relationnellesMySQL, Oracle, PostgreSQL) utilisent le langage SQL pour fournir un accès aux données. Pour les bases de données NoSQL, il’y a donc pas de requête SQL.

Le stockage utilise alors différentes représentations :

Regardez cet article pour en savoir plus sur les différentes bases de données NoSQL. N’hésitez pas à regarder les articles spécifiques à chaque famille de bases de données.

Ce type de base de données connait un succès grandissant, car des acteurs majeurs du Web ont choisi ce type de solutions : Facebook, Twitter, Digg, LinkedIn…

Il existe de nombreuses solutions de bases de données NoSQL : Cassandra (de la fondation Apache), Hypertable, MongoDB, Projet Voldemort

Présentation de Cassandra

Cassandra est la solution NoSQL d’Apache. C’est une base de données orientée colonnes qui se veut être hautement extensible. C’est-à-dire qu’il est très simple d’ajouter ou d’enlever (c’est plus rare) un nœud du cluster. D’abord développé par Facebook, le code source est devenu Open-Source et repris par la fondation Apache.

Modèle de données

Il existe quatre types de données dans Cassandra : les colonnes (Column), les supercolonnes (SuperColumn), les familles de colonnes (ColumnFamily) et le KeySpace.

Column

Objet de plus bas niveau, il est composé d’une clé (le nom de la colonne), d’une valeur et d’un timestamp.

Les timestamps des colonnes sont utilisés pour résoudre les conflits entre plusieurs nœuds de l’infrastructure, pour savoir si un nœud à une version plus récente. Il est donc important que tous les nœuds de l’infrastructure soient synchronisés sur la même horloge.

SuperColumn

Une supercolonne représente une colonne dont les valeurs sont d’autres colonnes. C’est le moyen le plus simple pour représenter une relation entre deux objets.

SuperColumn

ColumnFamily

Les familles de colonnes sont similaires aux tables des bases de données relationnelles. Elles contiennent les données organisées en lignes, chaque ligne est identifiée par une clé unique (correspondant à la clé primaire pour les bases de données relationnelles). Chaque ligne contient alors un ensemble de (super-)colonnes.

À l’intérieur des ColumnFamily, les clés sont toujours triées. La façon de trier dépend de la clé utilisée : nombre, chaîne de caractère, UUID

ColumnFamily

KeySpace

L’espace de clés est l’équivalent d’une base de données pour les systèmes relationnels. Il a un nom et contient l’ensemble des familles de colonnes (l’ensemble des tables pour un système relationnel).

KeySpace

Configuration du serveur

La configuration d’un serveur Cassandra est extrêmement simple, il n’y à qu’un seul fichier de configuration : conf/storage-conf.xml

Ce fichier contient à la fois les paramètres du serveur (mémoire, chemins des fichiers…), les paramètres du cluster et la définition des KeySpace.

Paramètres du cluster

Cassandra utilise le protocole Thrift pour faire communiquer les différents nœuds du cluster entre eux. C’est d’ailleurs ce protocole qui est utilisé par les clients qui se connectent au serveur Cassandra.

La configuration de Thrift est assez simple, vous spécifiez un port d’écoute (ThriftPort) et un nom d’hôte (ThriftAddress) qui doit être accessible par les différents clients. Au niveau du cluster, il faut définir le nom d’hôte (ListenAddress) et le port (StoragePort) accessible par les différents nœuds du cluster.

Lors du démarrage du cluster, les nœuds qui le composent doivent se découvrir, pour cela, certains des nœuds doivent être définis comme des racines (Seeds). Lors du démarrage d’un nœud, il va s’enregistrer auprès des *Seeds *qui sont configurés et récupérer ainsi la liste des nœuds du cluster.

Configuration des KeySpaces

Le principal problème que je trouve à Cassandra c’est que les KeySpaces doivent être définis avant le démarrage du serveur afin que tous les nœuds possèdent le même schéma.

Pour définir les KeySpaces, c’est dans le fichier conf/storage-conf.xml :

<keyspaces>
    <keyspace name="Keyspace1">
        <columnfamily name="Standard1" comparewith="BytesType" />

        <columnfamily name="Standard2" comparewith="UTF8Type" keyscached="100%" />
        <columnfamily name="StandardByUUID1" comparewith="TimeUUIDType" />
        <columnfamily name="Super1" comparewith="BytesType" comparesubcolumnswith="BytesType" columntype="Super" />

        <columnfamily name="Super2" comparewith="UTF8Type" keyscached="50%" comparesubcolumnswith="UTF8Type" columntype="Super" rowscached="10000"
                      comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings" />
    </keyspace>
</keyspaces>

La définition est très simple et les paramètres des ColumnFamily permettent de gérer le cache de la base de données (KeysCached et RowsCached) ainsi que le tri des clés (CompareWith et CompareSubcolumnsWith).

Conclusion

Pour avoir testé Cassandra, les performances sont impressionnantes par rapport à des bases de données comme MySQL. Par contre, ce type de bases de données n’est pas à utiliser pour tous les types d’applications.

Le seul point noir de Cassandra c’est le protocole Thrift utilisé pour la communication entre le client et le serveur. Heureusement qu’il existe quelques (mais très peu) librairies d’abstraction de cette couche.