Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Riak introduction

2,255 views

Published on

Introduction to Riak, in french.

Published in: Software

Riak introduction

  1. 1. INTRODUCTION À RIAK Damien Krotkine
  2. 2. À PROPOS • Ingénieur chez booking.com • BigData, systèmes distribués • Backend Damien Krotkine
  3. 3. RIAK EST… • une base de donnée • open source • distribuée • clef-valeur • masterless • haute disponibilité • scalable • tolérante aux pannes • hybride
  4. 4. PROBLÉMATIQUE
  5. 5. STOCKAGE DE SESSION • un site web dynamique • + RDBM • lire la session • la mettre à jour • faire des analyses • stockage dans une bdd relationnelle classique
  6. 6. PROBLÈME DE PERFORMANCE • latence: trop de lecture/écriture • throughput: grosses sessions • solution, externaliser le stockage des sessions
  7. 7. SOLUTIONS POSSIBLES
  8. 8. OPTIMISATIONSTRIVIALES • améliorer le code métier • optimiser la config BDD • améliorer le hardware • solutions limitées et très couteuses
  9. 9. RÉPLICATION • un master • plusieurs slaves • lecture sur slaves • problèmes quand trop d’écritures
  10. 10. SHARDING • perte de machine = perte de donnée • problème lors d’ajout/retrait de noeuds
  11. 11. SHARDING + REPLICATION • complexe à gérer • masters sont des SPOF • nécessité d'avoir des doublures de masters • grande complexité
  12. 12. CACHING • gain en lecture • pas de gain en écriture, synchro, invalidation
  13. 13. SOLUTION RETENUE
  14. 14. CLUSTERING • hardware pas cher • masterless • auto sharding/replication • répartition CPU/réseau • distributed computing
  15. 15. PROPRIÉTÉS DÉSIRÉES • robustesse: pouvoir perdre des noeuds • facilité d'administration et configuration • sécurité: écriture pérenne • vitesse: haut débit (throughput) • vitesse: faible latence (latency) • stockage en quantité • scalabilité • cohérence (consistency): écriture puis lecture
  16. 16. DYNAMO PAPER • 2007 par amazon • décrit des techniques • Riak est une implémentation
  17. 17. LE PROBLÈME DE LA COHÉRENCE
  18. 18. LES PARTITIONS RÉSEAU plusieurs états du monde simultanée
  19. 19. CAPTHEOREM • Eric Brewer • Cohérence forte, • Disponibilité, • tolérance aux Partitions • 2 sur les 3
  20. 20. Partitioning Tolérance aux partitions réseaux Availability les clients peuvent lire et écrire Strong Consistency Une seule vision des données CA AP CP Impossible
  21. 21. CAPTHEOREM • mauvaise représentation • la C,A, P ne sont pas binaires
  22. 22. RIAK, HYBRIDE • Riak est une base hybride • AP par défaut et historiquement • CP si besoin (version 2) • configuration par bucket (namespace)
  23. 23. RIAK
  24. 24. RIAK EST UN RING
  25. 25. STRUCTURE INTERNE • 2 protocoles • clef-valeur en surface • distributed computing • backend clef valeur • eleveldb et bitcask distributed system at heart dynamo model FSMs riak core vnode master k/v vnode storage engine client application httpprotobufs riak_client riak core
  26. 26. CLEF-VALEUR • pas de table, pas de relation • design simple • bucket, clef, valeur, content-type • ajout de fonctionnalités facile • 2i, MapReduce, search, datatypes (CRDTs)
  27. 27. ROBUSTESSE • donnée répliquée, n = 3 par défaut • partage d'état (gossip)
  28. 28. DISASTER RECOVERY • hinted handoffs • Anti-Entropy
  29. 29. FACILITÉ • masterless • un seul fichier de configuration • redémarrage en cascade • redémarrage à chaud • riak control • métriques de diagnostiques
  30. 30. SÉCURITÉ • garantie d’écriture variable • fire & forget: w=0 dw=0 pw=0 • quorum: w=2 dw=0 pw=0 • durabilité: w=2, dw=1, pw=1 • durabilité maximale: w=3, dw=3, pw=3 • entier ou “quorum”,“all”
  31. 31. VITESSE • débit élevé et latence faible: • plusieurs noeuds ont la données • donnée transite en interne + cache • lecture configurable • r=1, …, quorum, all • n=1,…,quorum, all
  32. 32. SCALABILITÉ • besoin stockage ? + de noeuds • besoin meilleure latence ? + de noeuds • besoin throughput en écriture ? + de noeuds • besoin throughput en lecture ? • + de noeuds • n plus grand
  33. 33. DEMO
  34. 34. INSTALLATION • mac OS X ! • docker: https://github.com/hectcastro/docker-riak brew install riak riak start DOCKER_RIAK_AUTOMATIC_CLUSTERING=1 DOCKER_RIAK_CLUSTER_SIZE=5 DOCKER_RIAK_BACKEND=leveldb make start-cluster
  35. 35. CLIENTS RIAK • officiels: Erlang, Java, Python • communautaires: tous les langages
  36. 36. QUELLE API • http REST: pratique, web • ProtoBuf: simple, rapide
  37. 37. SET/GET • set / get en Curl • (demo)
  38. 38. SET/GET Namespace ns = new Namespace("default", "my_bucket"); Location location = new Location(ns, "my_key"); RiakObject riakObject = new RiakObject(); riakObject.setValue(BinaryValue.create("my_value")); StoreValue store = new StoreValue.Builder(riakObject) .withLocation(location) .withOption(Option.W, new Quorum(3)).build(); client.execute(store); Namespace ns = new Namespace("default","my_bucket"); Location location = new Location(ns, "my_key"); FetchValue fv = new FetchValue.Builder(location).build(); FetchValue.Response response = client.execute(fv); RiakObject obj = response.getValue(RiakObject.class);
  39. 39. BUCKETS • liste des buckets • liste des clefs d’un bucket • propriété des bucket • (demo buckets)
  40. 40. REKON • API Rest => client javascript => navigateur • (demo Rekon)
  41. 41. RIAK CONTROL • aperçu du cluster • ajout d’une machine riak@172.17.0.9 • (demo riak control)
  42. 42. DESIGN DE DONNÉES
  43. 43. CAS D’UTILISATION • un site web d’actualités • des “news” • des commentaires associés aux news • des utilisateurs
  44. 44. DESIGN DES DONNÉES • news: news_id, [ comment_id ] • commentaire: comment_id, user_id, news_id, texte • user: id
  45. 45. NEWS • ajout d’une news: SET news/42 [ ] • affichage d’une news http://site.com/news/42.html • GET news/42 retourne une liste d’id • GET comment/id
  46. 46. COMMENTAIRES • ajout d’un commentaire • SET comments/01, { news_id, user_id, content } • GET news/42, append à la liste • SET news/42 [ … 01 ]
  47. 47. DEMO • ajout de news, commentaires (demo) • utilisation: my $r = Riak::Client->new(host=>”localhost", port=>49159); my $news = $r->get(news => 42); foreach (@$news) { say $r->get(comment => $_)->{content}; }
  48. 48. LES CONFLITS
  49. 49. MISE À JOUR DOUBLE • 1 news avec zero commentaire • 2 nouveaux commentaires sur la news • GET1, GET2, SET1, SET2 • GET2: retourne 1 commentaire ( au lieu de 2)
  50. 50. RÉSOLUTION CÔTÉ CLIENT • le client merge les listes d’id, et refait un SET • GET: 2 listes de valeurs + id du conflit • merge des listes • SET de la nouvelle valeur + id du conflit
  51. 51. RÉSOLUTION CÔTÉ SERVEUR • CRDT: Conflict-free replicated data type • une révolution pour le secteur • dans Riak: compteur, set, map
  52. 52. CRDT SET curl -XPOST http://localhost:49160/types/sets/buckets/ news_comments/datatypes/42 -H "Content-Type: application/json" -d '{"add_all":[1,2]}' ! curl -XPOST http://localhost:49160/types/sets/buckets/ news_comments/datatypes/42 -H "Content-Type: application/json" -d '{"remove":[3]}' riak-admin bucket-type create news '{"props": {"datatype":"set"}}'
  53. 53. BUCKET CP • un bucket en CP au lieu de AP • exemple: gestion de paiement, finance • besoin de strong consistency • Riak permet d’avoir des bucket CP et AP • révolutionnaire, plus besoin de RDBMs
  54. 54. INDEX SECONDAIRES
  55. 55. CAS D’UTILISATION • lister les commentaires d'un user • lister les commentaires entre 2 dates • lister les commentaires effacés • binary index (alphanumeric) • integer index
  56. 56. EXEMPLE • (demo) my $r = Riak::Client->new(host=>”localhost", port=>49159); $r->put( “user", damien => { age => 36 }, “application/json", { idx_age_int => 36 } ); my $keys = $r->query_index( “user", "idx_age_int", [ 20, 50] );
  57. 57. FONCTIONS AVANCÉES
  58. 58. FONCTIONS AVANCÉES • map reduce • javascript, erlang • search full text • basé sur lucene • riak cs • riak enterprise • multi-dc
  59. 59. CONCLUSION • Riak idéal pour l’IT modulaire • une boîte à outil pour de la performance • la plus robuste des solutions NoSQL
  60. 60. QUESTIONS ?

×