INTRODUCTION À RIAK
Damien Krotkine
À PROPOS
• Ingénieur chez booking.com 	

• BigData, systèmes distribués	

• Backend
Damien Krotkine
RIAK EST…
• une base de donnée	

• open source	

• distribuée	

• clef-valeur	

• masterless	

• haute disponibilité	

• s...
PROBLÉMATIQUE
STOCKAGE DE SESSION
• un site web dynamique	

• + RDBM	

• lire la session	

• la mettre à jour	

• faire des analyses	

•...
PROBLÈME DE PERFORMANCE
• latence: trop de lecture/écriture 	

• throughput: grosses sessions	

• solution, externaliser l...
SOLUTIONS POSSIBLES
OPTIMISATIONSTRIVIALES
• améliorer le code métier	

• optimiser la config BDD	

• améliorer le hardware	

• solutions limit...
RÉPLICATION
• un master	

• plusieurs slaves	

• lecture sur slaves	

• problèmes quand trop d’écritures
SHARDING
• perte de machine = perte de donnée	

• problème lors d’ajout/retrait de noeuds
SHARDING + REPLICATION
• complexe à gérer	

• masters sont des SPOF	

• nécessité d'avoir des doublures de masters	

• gra...
CACHING
• gain en lecture	

• pas de gain en écriture, synchro, invalidation
SOLUTION RETENUE
CLUSTERING
• hardware pas cher	

• masterless	

• auto sharding/replication	

• répartition CPU/réseau	

• distributed com...
PROPRIÉTÉS DÉSIRÉES
• robustesse: pouvoir perdre des noeuds	

• facilité d'administration et configuration	

• sécurité: éc...
DYNAMO PAPER
• 2007 par amazon 	

• décrit des techniques	

• Riak est une implémentation
LE PROBLÈME DE LA
COHÉRENCE
LES PARTITIONS RÉSEAU
plusieurs états du monde simultanée
CAPTHEOREM
• Eric Brewer	

• Cohérence forte,	

• Disponibilité,	

• tolérance aux Partitions	

• 2 sur les 3
Partitioning	

Tolérance aux partitions
réseaux
Availability	

les clients peuvent lire
et écrire
Strong	

Consistency	

U...
CAPTHEOREM
• mauvaise représentation	

• la C,A, P ne sont pas binaires
RIAK, HYBRIDE
• Riak est une base hybride	

• AP par défaut et historiquement	

• CP si besoin (version 2)	

• configuratio...
RIAK
RIAK EST UN RING
STRUCTURE
INTERNE
• 2 protocoles	

• clef-valeur en surface	

• distributed computing 	

• backend clef valeur	

• eleveld...
CLEF-VALEUR
• pas de table, pas de relation	

• design simple	

• bucket, clef, valeur, content-type	

• ajout de fonction...
ROBUSTESSE
• donnée répliquée, n = 3 par défaut	

• partage d'état (gossip)
DISASTER RECOVERY
• hinted handoffs	

• Anti-Entropy
FACILITÉ
• masterless	

• un seul fichier de configuration	

• redémarrage en cascade	

• redémarrage à chaud	

• riak contr...
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=...
VITESSE
• débit élevé et latence faible:	

• plusieurs noeuds ont la données	

• donnée transite en interne + cache	

• le...
SCALABILITÉ
• besoin stockage ? + de noeuds	

• besoin meilleure latence ? + de noeuds	

• besoin throughput en écriture ?...
DEMO
INSTALLATION
• mac OS X	

!
• docker: https://github.com/hectcastro/docker-riak
brew install riak
riak start
DOCKER_RIAK_A...
CLIENTS RIAK
• officiels: Erlang, Java, Python	

• communautaires: tous les langages
QUELLE API
• http REST: pratique, web	

• ProtoBuf: simple, rapide
SET/GET
• set / get en Curl	

• (demo)
SET/GET
Namespace ns = new Namespace("default", "my_bucket");
Location location = new Location(ns, "my_key");
RiakObject r...
BUCKETS
• liste des buckets	

• liste des clefs d’un bucket	

• propriété des bucket	

• (demo buckets)
REKON
• API Rest => client javascript => navigateur	

• (demo Rekon)
RIAK CONTROL
• aperçu du cluster	

• ajout d’une machine riak@172.17.0.9	

• (demo riak control)
DESIGN DE DONNÉES
CAS D’UTILISATION
• un site web d’actualités	

• des “news”	

• des commentaires associés aux news	

• des utilisateurs
DESIGN DES DONNÉES
• news: news_id, [ comment_id ]	

• commentaire: comment_id, user_id, news_id, texte	

• user: id
NEWS
• ajout d’une news: SET news/42 [ ]	

• affichage d’une news http://site.com/news/42.html	

• GET news/42 retourne une...
COMMENTAIRES
• ajout d’un commentaire	

• SET comments/01, { news_id, user_id, content }	

• GET news/42, append à la list...
DEMO
• ajout de news, commentaires (demo)	

• utilisation:
my $r = Riak::Client->new(host=>”localhost",
port=>49159);
my $...
LES CONFLITS
MISE À JOUR DOUBLE
• 1 news avec zero commentaire	

• 2 nouveaux commentaires sur la news	

• GET1, GET2, SET1, SET2	

• G...
RÉSOLUTION CÔTÉ CLIENT
• le client merge les listes d’id, et refait un SET	

• GET: 2 listes de valeurs + id du conflit	

•...
RÉSOLUTION CÔTÉ SERVEUR
• CRDT: Conflict-free replicated data type	

• une révolution pour le secteur	

• dans Riak: compte...
CRDT SET
curl -XPOST http://localhost:49160/types/sets/buckets/
news_comments/datatypes/42 
-H "Content-Type: application/...
BUCKET CP
• un bucket en CP au lieu de AP	

• exemple: gestion de paiement, finance	

• besoin de strong consistency	

• Ri...
INDEX SECONDAIRES
CAS D’UTILISATION
• lister les commentaires d'un user	

• lister les commentaires entre 2 dates	

• lister les commentaire...
EXEMPLE
• (demo)
my $r = Riak::Client->new(host=>”localhost",
port=>49159);
$r->put( “user",
damien => { age => 36 },
“app...
FONCTIONS AVANCÉES
FONCTIONS AVANCÉES
• map reduce	

• javascript, erlang	

• search full text	

• basé sur lucene	

• riak cs	

• riak enter...
CONCLUSION
• Riak idéal pour l’IT modulaire	

• une boîte à outil pour de la performance	

• la plus robuste des solutions...
QUESTIONS ?
Riak introduction
Prochain SlideShare
Chargement dans…5
×

Riak introduction

2 029 vues

Publié le

Introduction to Riak, in french.

Publié dans : Logiciels
0 commentaire
4 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
2 029
Sur SlideShare
0
Issues des intégrations
0
Intégrations
625
Actions
Partages
0
Téléchargements
21
Commentaires
0
J’aime
4
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

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 ?

×