Riak est une base de données distribuée de type clé-valeur, sous licence Apache 2. Basho, la société derrière Riak, s'est inspirée de Dynamo d'Amazon pour nous offrir un stockage qui scale facilement. En particulier, sa grande force repose sur son modèle distribué où toutes les machines jouent un rôle équivalent, ce qui apporte à la fois une grande résistance aux erreurs et la capacité d'ajouter ou retirer facilement des machines à la volée.
Dans la seconde partie de la dépêche, je vais présenter plus en détails Riak, puis vous parler des nouveautés de la version 0.10 sortie récemment. J'aborderai également bitcask, un moteur de stockage clé-valeur local, qui peut être utilisé pour le stockage par noeud de Riak. Je finirais par une note très rapide à propos de ripple, le client en Ruby pour Riak.
Présentation de Riak
Riak est un stockage distribué de type clé-valeur. La réplication se fait de pair à pair, entre des nœuds jouant tous le même rôle. Il est ainsi très facile de rajouter ou supprimer n'importe quel machine d'une instance de Riak. Il offre un niveau de consistance ajustable grâce à un mécanisme de quorum.
Le projet est écrit en Erlang, mais on y accède via une API Rest. On profite ainsi de tous les avantages du HTTP : possibilité de mettre en place des load-balancers, utilisation des headers de cache, protocole bien connu des admin-sys, etc.
Les données sont organisées dans des buckets, que l'on peut voir comme des classes de documents. À l'intérieur d'un bucket, un document est référencé par une clé. On peut accéder à des documents de 3 façons :
- directement en donnant le bucket et la clé d'un document,
- en parcourant des liens, sorte de meta-données à sens unique
- ou encore via une requête map/reduce.
Chaque nœud enregistre les données grâce à un backend qui peut être choisi parmi de nombreuses options qui vont du système de fichiers à un moteur local de type clé-valeur en passant par les arbres balancés d'Erlang (gb_trees). Il est possible de configurer des backends différents par bucket.
La terminologie de Riak
En pratique, les opérations CRUD se font très simplement :
PUT /riak/{bucket}/{key} (Create, Update) (marche aussi avec POST)
GET /riak/{bucket}/{key} (Read)
DELETE /riak/{bucket}/{key} (Delete)
où {bucket} est la classe de documents (Artists par exemple) et {key} la clé identifiant le document (les-Beatles).
Les liens sont créés avec le header HTTP Link, vont d'un document à un autre et sont nommés. Un document peut avoir plusieurs liens aussi bien sortants qu'entrants :
PUT /riak/list/2
Link: ; riaktag="previous", ; riaktag="next"
On peut alors parcourir les liens pour rechercher des documents. Chaque saut doit être décrit par 3 éléments : le bucket de destination, le nom du lien et si le résultat doit être retourné (par défaut, seul l'élément en fin de chaîne est retourné). Pour ces trois éléments, il est possible de passer le mot-clé _ pour signifier n'importe lequel. Exemple :
GET /riak/artists/TheBeatles/albums,_,1/tracks,_,1
Les requêtes plus complexes se font grâce à du map/reduce. Pour Riak, une requête se compose d'éléments en entrée et d'un nombre variable de phases. Ces phases peuvent être soit de type map (s'applique à chaque élément individuellement : transformation, filtre) ou de type reduce (s'applique à la collection dans sa globalité : agrégation, assemblage). La tâche est décrite en JSON et les fonctions peuvent être en Javascript ou Erlang :
POST /mapred
{ "inputs": "stocks",
"query": [
{ "map": { "language": "javascript",
"name": "App.extractTickers",
"arg": "GOOG",
"keep": false },
{ "reduce": { "language": "javascript",
"name": "Riak.reduceMin",
"keep": true}]}
Les nouveautés de Riak 0.10
La version 0.10 de Riak est sortie le 23 avril et apporte les nouveautés suivantes :
- Protocol Buffers : l'interface privilégiée pour accéder à Riak est et reste le bon vieux HTTP, mais pour les personnes qui souhaitent profiter de la meilleur bande passante possible, il est possible d'utiliser Protocol Buffers.
- Commit Hooks : ces hooks permettent d'exécuter du code en Javascript ou Erlang à chaque enregistrement. On peut donc les voir comme une sorte de procédure stockée pour Riak.
- Faster Key Listings : énumérer les clés d'un bucket est maintenant bien plus rapide grâce à l'utilisation intelligente de bloom filters.
- Code plus modulaire : le code de Riak est mieux découpé, facilitant ainsi le travail des mainteneurs de paquets.
Présentation de bitcask
Il existe un certain nombre de moteurs de stockage local de type clé-valeur. Citons, par exemple, Berkeley DB, Tokyo Cabinet et Innostore (petit jeu en passant : lequel des trois ne repose pas une technologie appartenant à Oracle ?).
Ceux-ci sont éprouvés, mais ne répondent pas forcément aux besoins de Riak pour le stockage sur chaque nœud. Ces besoins sont larges : latence faible, fiabilité, comportement prévisible, facilité de sauvegarde/restauration, licence, etc.
Les développeurs de basho se sont inspirés des log-structured file systems pour développer bitcask. Bien que bitcask soit destiné à être utilisé avec Riak, il est tout à fait possible de l'utiliser de manière indépendante.
Pour les curieux, les premiers benchmarks sont très prometteurs et la lecture des notes sur le design de bitcask instructive.
Ripple, le client Ruby
Si vous souhaitez utiliser Riak dans une application Ruby, je vous conseille de regarder ripple. Celui-ci se découpe en deux espaces de nom :
- Riak regroupe les opérations supportées par Riak comme la manipulation de buckets ou l'utilisation de map/reduce ;
- Ripple est la couche objet inspirée d'ActiveRecord et DataMapper, compatible avec ActiveModel.
Aller plus loin
- Le site web de Riak (24 clics)
- Le wiki de Riak (11 clics)
- L'annonce de Riak 0.10 (3 clics)
- Bitcask (2 clics)
- Les lectures recommandées sur Riak (29 clics)
- Pourquoi Riak convient bien pour des applications web ? (13 clics)
# Ça fait plaisir
Posté par Édouard Siha . Évalué à 1.
Seul regret, le temps que tu as passé à rédiger cette dépêche est du temps que tu n'as pas consacré à DLFP en RoR, c'est mal ! ;-)
Au passage, je suis tombé sur "extensibilité" comme traduction pour "scalable" qui ne soit ni pédante ni un néologisme affreux et dont le sens est évident à la lecture. Je l'ai trouvé bien, je l'emploie maintenant avec grande satisfaction.
[^] # Re: Ça fait plaisir
Posté par Dring . Évalué à 1.
[^] # Re: Ça fait plaisir
Posté par Édouard Siha . Évalué à 1.
[^] # Re: Ça fait plaisir
Posté par Dring . Évalué à 1.
Curieusement, quand je regarde le wiktionnaire anglais, je vois que "scalable" appliqué au domaine informatique - et uniquement à celui-ci - signifierait forcément "vers plus grand".
[^] # Re: Ça fait plaisir
Posté par Dring . Évalué à 0.
Curieusement, quand je regarde le wiktionnaire anglais, je vois que "scalable" appliqué au domaine informatique - et uniquement à celui-ci - signifierait forcément "vers plus grand".
# Slogan:
Posté par El Titi . Évalué à 7.
Dsl, fallait que ca sorte => []
# HTTP
Posté par barmic . Évalué à 2.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: HTTP
Posté par Bruno Michel (site web personnel) . Évalué à 2.
Mais si tu ne veux pas utiliser HTTP, tu peux également utiliser le Protocol Buffers depuis la version 0.10.
# Un retour des bases de données réseau ?
Posté par lolop (site web personnel) . Évalué à 5.
C'est ce à quoi me fait penser le système de parcours de liens. Un retour d'une techno qui avait plié devant le modèle relationnel...
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
# Prometteur
Posté par paul . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.