30
An 10,000’ overview of a Dynamo-style KV-Store Sebastian Cohnen @tisba / tisba.de

NoSQL CGN: Riak (01/2012)

Embed Size (px)

DESCRIPTION

Ein Big-Picture zu Riak am 4.1.2012 auf der NoSQL UG Cologne (nosql-cologne.org)

Citation preview

Page 1: NoSQL CGN: Riak (01/2012)

An 10,000’ overviewof a Dynamo-style

KV-Store

Sebastian Cohnen@tisba / tisba.de

Page 2: NoSQL CGN: Riak (01/2012)

About Me

• Freier Entwickler

❤ Ruby/Rails & node.js

❤ Performance & Scalability Engineering

❤ Distributed Load Testing

❤ CouchDB, Redis & Riak

und ebenfalls interessiert an Erlang, AMQP, ...

Page 3: NoSQL CGN: Riak (01/2012)

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

Page 4: NoSQL CGN: Riak (01/2012)

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

Page 5: NoSQL CGN: Riak (01/2012)

...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

Page 6: NoSQL CGN: Riak (01/2012)

Basic Concepts

Page 7: NoSQL CGN: Riak (01/2012)

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

Page 9: NoSQL CGN: Riak (01/2012)

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

Page 10: NoSQL CGN: Riak (01/2012)

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

Page 11: NoSQL CGN: Riak (01/2012)

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

Page 12: NoSQL CGN: Riak (01/2012)

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

Page 13: NoSQL CGN: Riak (01/2012)

Tuning CAP in Riak

Page 14: NoSQL CGN: Riak (01/2012)

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

Page 15: NoSQL CGN: Riak (01/2012)

Quoren

Konfigurierbar pro Bucket oder pro Objekt

N - Anzahl der Replikas

W - Write Quorum

R - Read Quorum

Page 16: NoSQL CGN: Riak (01/2012)

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)

...

Page 17: NoSQL CGN: Riak (01/2012)

More QUorums

DW - Durable Write Quorum

Mindestanzahl persistenter Schreiboperationen

PW & PR - Primary Replica Write/Read Quorum

Mindestanzahl von verfügbaren primären Replikas

Page 18: NoSQL CGN: Riak (01/2012)

Data Storage

Page 19: NoSQL CGN: Riak (01/2012)

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

Page 20: NoSQL CGN: Riak (01/2012)

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

Page 21: NoSQL CGN: Riak (01/2012)

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

Page 22: NoSQL CGN: Riak (01/2012)

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

Page 23: NoSQL CGN: Riak (01/2012)

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

Page 24: NoSQL CGN: Riak (01/2012)

Querying Data

Page 25: NoSQL CGN: Riak (01/2012)

Querying Data

Es gibt prinzipiell drei Möglichkeiten

MapReduce

Riak Serach

Riak 2i

Page 26: NoSQL CGN: Riak (01/2012)

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

Page 27: NoSQL CGN: Riak (01/2012)

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)

Page 28: NoSQL CGN: Riak (01/2012)

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

Page 29: NoSQL CGN: Riak (01/2012)

Resources

Infos zu Riak / Dokumentation: http://wiki.basho.com/

Riak Handbook, Mathias Meyer (eBook)

gute Videos, Vorträge, usw: http://basho.com/resources

Page 30: NoSQL CGN: Riak (01/2012)

Thanks! Q & A?

?Sebastian Cohnen

@tisba