nosql cgn: riak (01/2012)
Post on 05-Dec-2014
1.703 Views
Preview:
DESCRIPTION
TRANSCRIPT
An 10,000’ overviewof a Dynamo-style
KV-Store
Sebastian Cohnen@tisba / tisba.de
About Me
• Freier Entwickler
❤ Ruby/Rails & node.js
❤ Performance & Scalability Engineering
❤ Distributed Load Testing
❤ CouchDB, Redis & Riak
und ebenfalls interessiert an Erlang, AMQP, ...
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
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
...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
Basic Concepts
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
http://wiki.basho.com/What-is-Riak%3F.html
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
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
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
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
Tuning CAP in Riak
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
Quoren
Konfigurierbar pro Bucket oder pro Objekt
N - Anzahl der Replikas
W - Write Quorum
R - Read Quorum
Example
geringer R-Wert, geringere Read-Latency, weniger Konsistenz
geringer W-Wert, geringere Write-Latency
R + W > N, starke Konsistenz (z.B. 2 + 3 > 4 oder 4 + 3 > 5)
...
More QUorums
DW - Durable Write Quorum
Mindestanzahl persistenter Schreiboperationen
PW & PR - Primary Replica Write/Read Quorum
Mindestanzahl von verfügbaren primären Replikas
Data Storage
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
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
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
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
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
Querying Data
Querying Data
Es gibt prinzipiell drei Möglichkeiten
MapReduce
Riak Serach
Riak 2i
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
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)
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
Resources
Infos zu Riak / Dokumentation: http://wiki.basho.com/
Riak Handbook, Mathias Meyer (eBook)
gute Videos, Vorträge, usw: http://basho.com/resources
Thanks! Q & A?
?Sebastian Cohnen
@tisba
top related