Riak - SZTAKIMi a Riak? A Database A Data Store A key/value store A “NoSQL” database Schemaless...
Transcript of Riak - SZTAKIMi a Riak? A Database A Data Store A key/value store A “NoSQL” database Schemaless...
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
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ű
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/