mardi 18 mai 2010

Cassandra - Options supplémentaires de configuration

Maintenant que nous avons installé, configuré et utilisé notre base de données ImitationFacebook il est temps d'aller un peu plus loin dans la configuration et en particulier dans les options proposées par storage-conf.xml.
Je n'aborderai pas ici toutes les options qu'il est possible de paramétrer, elles sont assez nombreuse, mais dans un premier temps celles que je juge les plus utiles.
Je vais aborder des thématiques en fonction de question que l'on peut se poser :


1) Je veux plus de sécurité

Dans ce cas on souhaite que les données soient répliquées plus que d'habitude.


Chercher dans le XML le champ : "ReplicationFactor"
Par défaut il est à 1, c'est à dire qu'une copie de chaque donnée va être faite sur vos différents serveurs. Vous pouvez augmenter ce nombre pour plus de sécurité, en cas de défaillance probable d'un serveur par exemple.

2) Je veux plus de sécurité (bis)

Cette fois on va s'attaquer au problème de l'authentification. Bon soyons clair tout de suite dans la version 0.6.1 on peut pas faire grand chose vu que c'est pas encore très bien implémenté. Mais bon ce pourrait être très utile dans la suite (on pense notamment à Cassandra 0.7.0
On ira chercher dans le champ XML suivant : "Authenticator"

3) Je veux changer l'ordre dans lequel mes données sont insérées.

Tout de suite, quand je parle d'ordre c'est celui des "keys" c'est à dire des clefs et non pas des columns !
Rappelez vous l'ordre dans lequel les Column sont rangés est décrit par : CompareWith !
Le champ XML : "Partitioner"

Très honnêtement je ne saisis pas pourquoi on souhaiterait changer l'ordre des clefs, mais après tout c'est toujours possible.

3) Je veux plus de vitesse

Cette option est assez bien faite, elle permet notamment de faire un réglage fin pour chacune des ColumnFamily sur les performances à adopter. Dans la déclaration XML d'une ColumnFamily, rajoutez les lignes suivantes :

RowsCached=XXX
KeysCached=XXX

A la place des XXX on peut avoir :

  • un pourcentage si c'est suivi d'un % (exemple : RowsCached="10%" )
  • Un taux si la valeur est comprise entre 0 et 1 (exemple : RowCached="0.5" )
  • Un nombre (exemple : RowCached="10000")



mardi 4 mai 2010

Les alternatives à Cassandra

Maintenant que nous avons un peu vu ce qu'est Cassandra, j'aimerais parler des alternatives qui existent.
Cet article est en partie une traduction de l'excellent article :

Il ne faut pas croire qu'il existe actuellement une ou deux bases NoSQL qui se battent en duel, c'est un mouvement qui est bien enclenché maintenant et qui possède une excellente dynamique dynamique.

Voici une liste non exhaustive des bases qui existent, classées suivant leurs caractéristiques. J'ai mis en gras celles qui semblaient à mon goût être utilisable de façon stable et qui sont activement développées.

Excellente consistance des données (bonne réplications dans les nodes) :

Les bases ci-dessous assurent que les données ne seront pas perdues et donc que les modifications, inclusions des données se feront de façon sûre à travers les nodes. Cependant le principal désavantage de ces bases est que l'on doit faire constamment attention car il faut attendre que les modifications soient répercutées dans l'ensemble des noeuds.
  • BigTable : Table de Google
  • HyperBase : Base de données performante
  • HBase : Cette base de données est performante pour les accès très fréquents et courts. Elle peut en particulier dépasser (et de loin si on en croit les tests effectués par rapport à Cassandra 0.5.1, cf le rapport de yahoo déjà posté sur ce blog).
  • MongoDB
  • Terrastore : Base de données utile pour la gestion de base de données très importantes.
  • Redis
  • Scalaris
  • MemcacheDB
  • Berkeley DB

Consistance moyenne des données, mais disponibilité excellente :

Cette catégorie correspond aux bases de données qui sont plus tolérantes à des données non intégralement répliquées. La plupart de ces dernières ont une variable "consistency" qui indiquent à quel point les données sont correctement répliquées au travers des noeuds (nodes). L'avantage est que l'accès, l'écriture et la lecture peuvent se faire à n'importe quel moment.
  • Dynamo
  • Voldemort
  • Tokyo Cabinet 
  • KAI
  • Cassandra : Peut être la plus couramment utilisée parmis toutes les bases de données du monde NoSQL. Utilisée en version modifiée dans Twitter, Digg, Reddit.
  • CouchDB
  • SimpleDB
  • Riak : Toute jeune base, cf l'article sur linuxfr.org


Enfin pour finir, une petite image issue du même blog qu'en haut, voici un petit graphique qui résume bien les capacités de chacune des bases ainsi que leurs caractéristiques :


samedi 1 mai 2010

Note

Comme je fais des messages (très) longs, pour plus de lisibilité j'ai réduit le nombre de messages par page à 5, donc n'oubliez pas de regarder les pages suivantes.


Bonne lecture,

Victor

Cassandra 6) Utiliser un client haut-niveau

Maintenant que nous avons installé les bases de données dans Cassandra il faut les exploiter et y insérer des données.
Dans la suite nous allons travailler avec Java (et peut être C++ quand le client sera mis à jour)

Il existe deux façons d'utiliser Java avec Cassandra :
_Utiliser directement Thrift, qui est développé par la fondation Apache. cependant pour débuter ce n'est pas simple du tout et pas très pratique non plus.
_Utiliser un client de plus haut niveau. C'est la solution que nous allons choisir.

1) Installation du client :

Dans la suite nous allons tirer partie du client Hector, qui est une implémentation modèle des méthodes Thrift que l'on a à disposition. Ce projet est bien suivi, mis à jour régulièrement et possède une communauté active et qui pourra répondre à vos questions.

C'est ici que vous pourrez télécharger la dernière version d'Hector
Pour vous rendre sur la page d'aide des utilisateurs d'Hector, c'est ici

L'installation dans un IDE se fait simplement en ajoutant le JAR (ainsi que les autres dont hector a besoin) dans les librairies.

Il existe Cassandra pour bien d'autres langages et je vous invite à parcourir la page http://wiki.apache.org/cassandra/ClientOptions.
Vous y trouverez une sélection de client pour un grand nombre de langages.

2) Premiers pas

Hector a été conçu pour être simple, il possède un système de choix de serveur pour l'inclusion des keys dans votre base est très sommaire et ne prend pas en compte la disponibilité de chacun etc... Il opère un choix aléatoire.

Malgré tout, c'est un excellent choix et nous allons voir comment se débrouiller avec ce client.

Voici ce qu'on fait avec Hector pour ouvrir une connexion vers Cassandra :

CassandraClientPool pool = CassandraClientPoolFactory.INSTANCE.get();
CassandraClient  client = pool.borrowClient("localhost", 9160);
Keyspace keyspace = client.getKeyspace("ImitationFacebook");

Une fois que vous avez fait cela, vous avez établi votre connexion vers votre base de données.
ATTENTION : N'oubliez pas de relâcher votre client après vos opérations, en faisant ce bout de code :
 pool.releaseClient(client);

Hector commence par prendre un client, puis lui attribue un serveur. Ici on a pris l'exemple où la base de données est installé sur le même serveur que celui qui fait la requête et communique avec le port 9160.
Puis le client ouvre le keyspace qui nous intéresse, ici ImitationFacebook.

3) Premières requêtes


CassandraClientPool pool = CassandraClientPoolFactory.INSTANCE.get();
CassandraClient  client = pool.borrowClient("localhost", 9160);
Keyspace keyspace = client.getKeyspace("ImitationFacebook");
ColumnPath columnPathUser = new ColumnPath("Utilisateurs");
columnPath.setColumn(StringUtils.bytes("nom"));
keyspace.insert("kabdebon",columnPathUser, StringUtils.bytes("Kabdebon"));
pool.releaseClient(client);



Voilà la première requête a été faite grâce à Hector sur Cassandra !
N'oubliez pas d'entourer ce bloc de code de try /catch ou de throw les exceptions qui pourraient survenir.

Qu'avons nous fait au juste ?
Dans cet exemple nous avons juste inséré à la clé "kabdebon" une Column "nom" avec la valeur "kabdebon". Il y a pas mal de choses qui se sont passées juste pour faire cela :
1) Ouverture de la connexion vers le keyspace
2) Création d'un columnPath (comprendre chemin vers une colonne) où on a indiqué la ColumnFamily et le nom de la Column où on souhaitait insérer les données.
3) Insertion des données.

Pourquoi avoir recours à StringUtils ?

StringUtils est inclus dans la librairie Hector. Par défaut thrift ne prend en entrée que des byte[], ce petit utilitaire permet de faire une conversion String UTF8 -> byte[].