Annonce de la sortie de Riak 0.10

Posté par  (site web personnel) . Modéré par patrick_g.
Étiquettes :
18
3
mai
2010
Base de données
Dans la grande famille des bases de données NoSQL, je vous ai déjà présenté Cassandra, MongoDB, Redis et FlockDB. Laissez-moi vous présenter un nouveau membre de cette famille : Riak.

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)

{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

  • # Ça fait plaisir

    Posté par  . Évalué à 1.

    Ça fait plaisir de voir des alternatives se développer et conquérir l'intérêt des gens dans le domaine du stockage de données. Merci pour ce tour d'horizon de la bête !
    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  . Évalué à 1.

      Et "dimensionnable", ça le fait pas ?
      • [^] # Re: Ça fait plaisir

        Posté par  . Évalué à 1.

        "dimensionnable" n'existe pas... D'ailleurs Templeet te l'a probablement souligné de rouge.
        • [^] # Re: Ça fait plaisir

          Posté par  . Évalué à 1.

          Certes, mais ça le fait quand même, non ? Le problème avec "extensible", c'est que ça va dans un seul sens. Alors que la notion d'échelle n'implique pas un seul sens ; on peut dimensionner vers plus petit ou vers plus grand.

          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  . Évalué à 0.

          Certes, mais ça le fait quand même, non ? Le problème avec "extensible", c'est que ça va dans un seul sens. Alors que la notion d'échelle n'implique pas un seul sens ; on peut dimensionner vers plus petit ou vers plus grand.

          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  . Évalué à 7.

    Riak, la DB du tipiak!

    Dsl, fallait que ca sorte => []
  • # HTTP

    Posté par  . Évalué à 2.

    Si j'ai bien compris ça utilise HTTP pour communiquer avec l'extérieur ? C'est dommage il y a tant de chose dans le monde des réseaux qui ne sont pas HTTP. Et c'est dommage aussi de donner raison aux administrateurs pressés qui interdisent tout ce qui n'est pas HTTP...

    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  (site web personnel) . Évalué à 2.

      Riak est une base de données et n'a donc pas vocation à communiquer avec l'extérieur. Il communique avec des applications, et l'intérêt de HTTP est alors de réutiliser tout ce qui existe en termes de load-balancer, proxy caches, etc.

      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  (site web personnel) . Évalué à 5.

    Cf Base_de_données_réseau

    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  . Évalué à 2.

    Ce type d'outil promet de permettre de remplacer le stockage de blobs dans le système de fichier par un stockage via un service, lequel se débrouillera pour être fiable. L'idée est très plaisante !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.