Cette semaine je me suis déplacé à la Cantine Numérique de Nantes pour assister à la soirée nosql du JUG. Thématiques abordées : Couchbase et MongoDB. Maintenant que je commence à avoir une bonne prise en main de Mongo, la présentation de Tugdual Grall aidant (comment ne pas être convaincu par un triathlète !), je me suis décidé a tester Couchbase. Pour moi ce n’est pas une inconnue non plus car j’ai beaucoup utilisé Memcached jusqu’à présent. De plus, avant de passer sur Mongo, j’utilisait CouchDB lorsque j’ai pris mes distances avec SQL. Je vais vous parler de mon cas : développeur sous MacOS ayant une expérience de MongoDB. C’est parti pour la prise en main de Couchbase !

Installation

Tout d’abord, au niveau du téléchargement MongoDB et CouchBase sont similaires : tout deux proposent des téléchargements pour Windows, Mac et Linux. Le code source est également disponible. Concernant MacOS, le fichier à télécharger fait la même taille : 50Mo grosso modo. L’avantage de Couchbase est qu’il fournit un wizard pour l’installation ainsi qu’une icône pour la barre du haut. Celle ci permet notamment d’effectuer des mises à jour, de gérer le serveur et d’accéder à l’interface d’administration graphique. MongoDB lui se contente de fournir une archive à placer typiquement dans /opt par exemple. Il n’y a pas d’interface graphique ni de système de mise à jour. Pour la configuration de base, on suit les étapes qui aboutiront à la configuration d’un bucket.

Interface d'administration

Le gros point fort de Couchbase : avec l’interface d’administration on peut tout faire ! C’est à la fois un outil qui peut être mis à disposition des administrateurs systèmes mais qui est également très pratique pour les développeurs. Toutes les opérations possibles sont disponibles dans cette interface. Bien sûr ces opérations sont également accessibles via une API REST et un outil en ligne de commande.

L’écran d’accueil est un dashboard qui nous montre l’état du cluster : serveurs up/down, mémoire utilisée, espace disque utilisé, opérations par secondes... Bref une belle interface de monitoring. On peut également avoir le détail sur l’ensemble des serveurs. Lorsque vous installer CouchDB sur une autre machine, vous aurez la possibilité de rejoindre le cluster existant uniquement en connaissant l’adresse IP et le mot de passe administrateur. Il n’y a pas d’opérations supplémentaires. L’inverse est également possible : depuis l’interface vous pouvez faire rejoindre un serveur existant à votre cluster (mais les données seront supprimées sur ce dernier ! un message vous avertira). C’est beaucoup plus simple qu’avec MongoDB ! Le failover se configure simplement également.

On a également accès aux logs et aux paramètres : notamment des alertes par email ou la compaction des bases.

Tester Couchbase avec l’interface graphique

Comme je le disais, le développeur peut utiliser cette interface d’administration. Il peut notamment créer directement des documents et les éditer en JSON dans le navigateur. Il peut également les supprimer.

On a également la possibilité de créer des vues. Finalement ce sont des opérations de type Map / Reduce que le développeur va créer en développement par exemple. Il va pouvoir tester son fonctionnement sur un sous ensemble de données puis passer sa vue en production avec cette fois-ci l’utilisation de toutes les données. C’est CouchDB qui gère en tâche de fond l’exécution du calcul, soit sur une base d’intervalles de temps soit sur un certain nombre de requêtes. L’affichage du résultat n’est donc pas forcément en temps réel. La syntaxe semble similaire à MongoDB :

Ecrire du code

Bien sûr une fois pris en main à ce niveau-là on veut tout de suite voir ce que ça donne au niveau du code. Tout comme pour MongoDB, il existe de nombreux drivers. En ce qui concerne Java, il y en a quatre : Ektorp, JRelax, jcouchdb et CouchDB4J. Je n’en ai testé aucun. CouchDB4J me paraît intéressant : il propose une API simple. En général, je ne suis pas pour le mapping lorsque l’on travaille en nosql, c’est une perte de temps et cela rigidifie l’application. Je vous mets un bout de code pour la forme :

Session s = new Session("localhost",5984);
Database db = s.getDatabase("foodb");
Document doc = db.getDocument("documentid1234");
doc.put("foo", "bar");
db.saveDocument(doc);
Document newdoc = new Document();
newdoc.put("foo", "baz");
db.saveDocument(newdoc);
ViewResult result = db.getAllDocuments();
for (Document d: result.getResults()) {
    System.out.println(d.getId());
    Document full = db.getDocument(d.getId());
}

Il n’y a que très peu de différences avec le driver officiel Java pour MongoDB. Les drivers Java fournis en exemple par Couchbase sont des projets communautaires.

Concernant Node.js, il existe le paquet Cradle. Il n’est également pas officiel mais semble très actif. On peut l’installer directement avec npm. La syntaxe est bien dans l’esprit de node.js avec la notion de callback nécessairement utilisée. Cradle supporte également les vues.

Il y a pas mal de pull requests et des tâches en cours. C’est plutôt bon signe.

Bien sûr vous pouvez aussi vous contentez d’utiliser uniquement l’API HTTP. C’est un choix à faire.

Architecture

Pour une fois, je n’en parle pas trop. L’objectif de l’article était de prendre en main Couchbase et de voir rapidement ce qu’on pouvait en faire. Celà dit c’est toujours intéressant de savoir ce qu’il y a sous le capot. Typiquement, il s’agit d’un serveur HTTP qui expose une API pour effectuer toutes les opérations sur les bases en appliquant le principe du Fire and forget (port 8092). Il est également possible de s’y connecter avec le protocole memcached (port 11211/11210). Toute la gestion du cluster (dont notamment le fail over) est développé en Erlang. Le reste est écrit en C.

Conclusion

L’interface graphique m’a convaincu, l’entreprise qui supporte le projet aussi et l’architecture de la solution semble véritablement bien huilée. Memcached est une solution connue et utilisée depuis longtemps : Couchbase contribue au projet pour son « Object-Managed Cache ». La gestion de cluster par Erlang est également un gage de crédibilité. Maintenant la prochaine étape pour moi : c’est de faire un PoC et d’écrire du code. Je crois que je vais ressusciter mon URL Shortener et enfin le mettre en ligne : https://github.com/loicguillois/lgu.me