Riak Pronounced “REE-ahk” Elosztott adattároló eszköz Molnár Péter
[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
{ "inputs":{ "bucket":"invoices", "key_filters":[["ends_with", "0603"]] }
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
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 óra Median Throughput: 2307.7 ops/sec; Median Latency: 4.87 ms Latency 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, Paretoeloszlá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.