1. An 10,000’ overview
of a Dynamo-style
KV-Store
Sebastian Cohnen
@tisba / tisba.de
2. About Me
• Freier Entwickler
❤ Ruby/Rails & node.js
❤ Performance & Scalability Engineering
❤ Distributed Load Testing
❤ CouchDB, Redis & Riak
und ebenfalls interessiert an Erlang, AMQP, ...
3. What is Riak?
Pronounced “REE-ack”
A Database
A Data Store
A key/value store
A “NoSQL” database
Schemaless and data-type agnostic
Quelle: http://wiki.basho.com/What-is-Riak%3F.html
4. What (else) is
Riak?
As distributed as you want and need it to be
Scalable
Written (primarily) in Erlang
Used by Fortune 100 Companies
Used by startups
Not the best fit for every project and application
Quelle: http://wiki.basho.com/What-is-Riak%3F.html
5. ...in short?
verteilter KV-Store, horizontal skalierbar
der Grad an C, A und P sind wählbar
austauschbare Storage Backends (pro Bucket)
Zugriff via HTTP/REST oder Protocol Buffers
agnostisch zum Inhalt
7. ClusteR
Riak besteht aus einem Cluster von Nodes
ein Cluster bildet einen Keyspace / KeyRing
jede Riak Node besteht aus einer Anzahl von
VNodes (virtual node)
Consistant Hashing bestimmt die Positionen von
VNodes und Keys im Ring
9. Node
Jede Node in Riak sind identisch, es gibt keine Rollen
Jede Node in Riak darf ausfallen
Eine Node wird zum Koordinator, wenn ein Client
eine Anfrage an ihn richtet
Es können jederzeit Nodes hinzugefügt oder entfernt
werden
10. Bucket
ein Bucket ist eine logische Komponente, die wie ein
Namespace zu sehen ist
ein Bucket kann Eigenschaften haben, z.B.
Konfiguration für ein Backend und Default-Werte für
Quoren
Der Name eines Buckets gehört mit zum Key eines
Objektes in Riak
11. Conflicts
Last-Write-Wins: basiert auf Timestamps und
sorgt für ein “fire-and-forget” Verhalten
(last_write_wins)
Vector Clocks, wobei Riak alle Siblings zur
Verfügung stellt (allow_mult)
Mittels Read Repair kann Riak beim Lesen von
Objekten Konsitenz unter den Nodes erzeugen
12. what else?
Ring Informationen werden mit einem Gossip
Protocol im Cluster verteilt (Ring Status, Pending
Changes, Partition Ownership, ...)
Hinted Handoff wird benutzt, um Daten von einer
“Vertreter-Node” zu einer ehemals nicht verfügbaren
Node zu übertragen
Pre- und Post-Commit Hooks
Links & Link-walking
Luwak
14. Tuning Riak
Riak erlaubt es Konsistenz,Verfügbarkeit und
Partitionstolleranz zu einem gewissen Grad zu
kontrollieren
Diese Einstellungen können auf Bucket oder Key/
Objekt-Ebene stattfinden
Unterschiedliche Daten können so mit
unterschiedlichen Anforderungen im selben Cluster
gespeichert werden
19. Data Storage
Die Keys von Objekten werden zusammen mit ihrem
Bucketnamen gehasht, um ihre Position im Ring
ausfindig zu machen und zustände Nodes zu ermitteln
Wichtig: Buckets sind nur logische Einheiten und
bilden einen Namensraum
20. Store an Object [1]
1. Cluster mit 8 Nodes, 64 Partitionen
2. POST oder PUT an NODE1/buckets/my_bucket[/
my_key] mit Parameter: N=3, W=2, DW=1
3. Node1 wird zum Koordinator und ermittelt, wer für
die drei Replikas zuständig ist, leitet den
Schreibrequest weiter und wartet auf Antwort
21. Store Object [2]
4. Node 3, 5 und 8 erhält den Request
Node 3 meldet Annahme des Requests an Node 1
Node 5 meldet erfolgreiche Persistierung an Node
1
5. Node 1 antwortet dem Client den Erfolg der
Operation
6. Node 8 beendet ebenfalls erfolgreich die Operation
22. Store an Object
POST oder PUT an /buckets/my_bucket[/my_key]
Header
Content-Type
X-Riak-Vclock
X-Riak-Meta-*
X-Riak-Index-*
Link
23. Fetch an Object
GET NODE1/buckets/my_bucket/my_key mit
Parameter: R=2
Node 1 ermittelt zuständige Nodes und leitet die
Anfrage weiter
Wenn mindestens zwei Nodes eine konsistente
Antwort geben, ist die Leseoperation erfolgreich
26. Map Reduce
Map Reduce
Key Filter (z.B. begins_with, between,
Transformationen, ...)
Abfragen in Erlang oder Javascript, vordefiniert oder
zur Requestzeit
gut für Datenanalyse
27. Riak Search
Apache Lucene/Solr like Volltextsuche
Programmierbare Tokenizer, ...
Ergebnis sind Keys, die z.B. als Input für MR genutzt
werden können
relativ Ressourcen intensiv
Index wird im Cluster gespeichert (Token-basiert)
28. Riak 2i
2i = Secondary Index
simpler, Nutzer-definierter lexikalischer Index
Ergebniss ist ebenfalls als Input für MR verwendbar
weniger Ressourcen intensiv, aber keine FTS
Index-Informationen werden zusammen mit dem
Objekt im Cluster gespeichert