Riak Pronounced REE-ahk Elosztott adattároló eszköz Molnár Péter molnarp@ilab.sztaki.hu
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 LevelDB 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 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 ó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.