nosql cgn: riak (01/2012)

Post on 05-Dec-2014

1.703 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

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

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