Riak introduction

61
INTRODUCTION À RIAK Damien Krotkine

Transcript of Riak introduction

INTRODUCTION À RIAKDamien 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é • scalable • tolérante aux pannes • hybride

PROBLÉMATIQUE

STOCKAGE DE SESSION

• un site web dynamique • + RDBM • lire la session • la mettre à jour • faire des analyses • stockage dans une bdd relationnelle classique

PROBLÈME DE PERFORMANCE

• latence: trop de lecture/écriture • throughput: grosses sessions • solution, externaliser le stockage des sessions

SOLUTIONS POSSIBLES

OPTIMISATIONS TRIVIALES

• améliorer le code métier • optimiser la config BDD • améliorer le hardware • ⇒ solutions limitées et très couteuses

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 • ⇒ grande complexité

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 computing

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

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

CAP THEOREM

• 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

Une seule vision des données

CA AP

CP

Impossible

CAP THEOREM

• 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) • configuration par bucket (namespace)

RIAK

RIAK EST UN RING

STRUCTURE INTERNE

• 2 protocoles • clef-valeur en surface • distributed computing • backend clef valeur • eleveldb et bitcask

basho

it’s a distributed system at heart

dynamo model FSMs

riak core

vnode master

k/v vnode

storage engine

client application

httpprotobufs

riak_client

riak core

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)

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 control • métriques de diagnostiques

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”

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

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

DEMO

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

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/GETNamespace 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);

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 [email protected] • (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 liste d’id • GET comment/id

COMMENTAIRES

• ajout d’un commentaire • SET comments/01, { news_id, user_id, content } • GET news/42, append à la liste • SET news/42 [ … 01 ]

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}; }

LES CONFLITS

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)

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

RÉSOLUTION CÔTÉ SERVEUR

• CRDT: Conflict-free replicated data type • une révolution pour le secteur • dans Riak: compteur, set, map

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"}}'

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

INDEX SECONDAIRES

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

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] );

FONCTIONS AVANCÉES

FONCTIONS AVANCÉES• map reduce

• javascript, erlang • search full text

• basé sur lucene • riak cs • riak enterprise • multi-dc

CONCLUSION

• Riak idéal pour l’IT modulaire • une boîte à outil pour de la performance • la plus robuste des solutions NoSQL

QUESTIONS ?