Riak - SZTAKIMi a Riak? A Database A Data Store A key/value store A “NoSQL” database Schemaless...

27
Riak Pronounced “REE-ahk” Elosztott adattároló eszköz Molnár Péter [email protected]

Transcript of Riak - SZTAKIMi a Riak? A Database A Data Store A key/value store A “NoSQL” database Schemaless...

RiakPronounced “REE-ahk”

Elosztott adattároló eszköz

Molnár Pé[email protected]

Mi a Riak?

A Database A Data Store A key/value store A “NoSQL”

database Schemaless and

data-type agnostic Written (primarily)

in Erlang

„Simply put, Riak is a distributed, scalable, open source key/value store. We like to say that Riak is the most powerful open-source, distributed database you’ll ever put into production. Riak scales predictably and easily and simplifies development by giving users the ability to quickly prototype, test, and deploy their applications.”

Kik használják? GitHub Pages, Git.io AOL Advertising, AdLearn: Ad campaign cache,

fájl index Comcast: internal object storage, XFINITY TV

iOS app Mozilla Labs Test Pilot: felhasználói adatok

elemzése felhasználói élmény fejlesztése céljából

Bestbuy, stb.Forrás: http://basho.com/company/production-users/

Támogatás

Open source (Apache License 2.0) Riak Community

Dokumentáció: Riak Wiki (http://wiki.basho.com)

Levelező lista GitHub repository IRC, news, blogok, ...

Üzleti támogatás: Basho Technologies Inc.

Interfészek

Nyelvi kötések Erlang Java PHP Python Ruby C/C++

HTTP API: GET, PUT, POST, DELETE Protocol buffer client

Szoftver komponensek

Riak_core: Node-ok állapotának követése, ki- és

beléptetés; szolgáltatások hirdetése, és lokalizálása; eseménykövetés, értesítés

Partícionálás és terheléselosztás Globális állapot követés, továbbítás

Riak_kv: key-value store Riak_search: fulltext index (Luwak: large file storage – már nem aktívan

fejlesztett)

Felépítés

160-bites egész tér: a gyűrű, egyenlő méretű partíciókra osztva

Fizikai szerverek a node-ok Node-ok egyenrangúak Node-okon vnode-ok futnak, vnode-ok

összes száma megegyezik a partíciók számával

N darab node és K darab partíció esetén egy node ~ K/N vnode-ot futtat

Felépítés

Replikáció

Logikai felépítés

Vödrök Lapos, különálló névterek, egy kulcs

vödrönként egyszer szerepelhet Implicit vagy explicit létrehozás N paraméter: replikák száma R paraméter: hány node egybehangzó

válasza kell a sikeres olvasáshoz W paraméter: mint R, csak írásra Konfliktus-feloldás paraméterezése

létrehozáskor

Logikai felépítés

Vödrök Pre/postcommit hook-ok

● Erlang vagy javascript függvények, amelyek automatikusan meghívódnak egy érték beírása előtt vagy után

● Riak-search is így működik

Kulcsok és értékek

Kulcs: tetszőleges bináris érték, jellemzően String

Objektum (= érték) Vödör Kulcs Vektor óra Értékek listája (testvérek)

Konfliktus detektálás és feloldás

Vödrönként paraméterezhető allow_mult: engedjük-e, hogy több érték

változatot (sibling) tároljon a Riak egy kulcshoz

last_write_wins: az utoljára beírt érték lesz mindig érvényes

Vektor óra alapján Kliens eldöntheti, hogy melyik legyen

érvényes Automatikus (sibling explosion, vector clock

explosion)

Tárak

Lényegében bármilyen kulcs-érték pár tároló használható lenne.

Bitcask Innostore LevelDB Memory Multi

Bitcask

Alapértelmezett tár megoldás Natív Erlang implementáció Low latency, append only High throughput, random értékek gyors

írása Alacsony keresési és beszúrási idő Crash recovery, backup egyszerű

Bitcask

Más tárak

Innostore Jó teljesítmény; kulcsok mérete lehet

nagyobb, mint a memória Kulcsok mérete max 255 byte lehet;

beszúrás előtt rendezni kell az adatot; magas diszk használat

LevelDB Adattömörítés, szöveges adaton hatékony; Másodlagos indexek Olvasás lassú, ha a szintek száma nagy

MapReduce

Beépített feature POST /mapred Bemenet: [Bucket,Key,KeyData], filterek Fázisokra osztott

Map: függvény, nyelv előírása, keep Reduce: ua. mint a map Link: vödör, tag, keep

{ "inputs":{ "bucket":"invoices", "key_filters":[["ends_with", "0603"]] }}

Link bejárás

Pehelysúlyú gráf tárolási megoldás Objektumok közötti egyirányú kapcsolat Tag: link „osztály” Nem ellenőrzött Tetszőleges szintig bejárható, akár körökön

is.

$ curl -v http://127.0.0.1:8091/riak/people/timoreilly/people,friend,1

$ curl -v localhost:8091/riak/people/davethomas/_,friend,_/_,friend,_/

Másodlagos indexek

Csak LevelDB backend támogatja Index-érték tag-en keresztül definiált Típusok: bináris, integer Érték és index-értékek függetlenek

curl -v -X PUT \-d 'data1' \-H "x-riak-index-field1_bin: val1" \-H "x-riak-index-field2_int: 1001" \http://127.0.0.1:8098/riak/mybucket/mykey1

"inputs":{ "bucket":"mybucket", "index":"field1_bin", "key":"val3"}"inputs":{ "bucket":"mybucket", "index":"field1_bin", "start":"val2", "end":"val4"}

Mozilla Labs Test Pilot

Cél: felhasználói adatok tárolása Tipikus objektum méret: 25 KB 1 hetes időtartam alatt érkeznek be, az

adat nagy része az első 48 órában ~100 GB – 2 TB össz adatmennyiség 4x Intel 16 mag, 24 GB memória, dual sata

diszkek, Linux

Adatméret: ~25K; Időtartam: 1 óraMedian Throughput: 2307.7 ops/sec; Median Latency: 4.87 msLatency at 99th percentile: 20.60 ms; Latency at 99.9th percentile: 165.10 ms

Joyent Technologies benchmark

Cél: lineáris skálázhatóság mérése Node-ok száma: 8, 10, 12, 14 Objektumok mérete: min. 500 Byte, Pareto-

eloszlás szerint Kulcsok száma: 10 millió R/W arány 1

http://joyeur.com/2010/10/31/riak-smartmachine-benchmark-the-technical-details/

● Node-ok számával becsülhető az átbocsátó képesség● Node-ok egyenkénti átbocsátó képessége nagyjából konstans.