2013年10月3日 星期四

Riak介紹及原理

Hadoop在台灣最近很HOT(一如往常的,台灣在資訊技術上總是慢了國外五年以上的時間),但是在survey相關資料時,發現Hadoop的學習曲線實在異常陡峭,而且如果我只想要分散式儲存及map/reduce機制,對HDFS這種專為大檔案設計的儲存機制沒有特別需求,但是HBase是depend on it的。如果考慮使用Hadoop作為解決方案的朋友可以先參考這篇文章再做決定:「你不需要 Hadoop 做数据分析的 10 个理由
如果需求相當簡單只需要做分散式儲存,很多NOSQL都能做得相當好而且非常容易做擴充,甚至可以提供MapReduce的機制,如MongoDB、CouchDB以及今天我要介紹的Riak


Riak的優點


1. 很容易架設cluster,做擴充
2. 支援 HTTP/RESTful 介面,操作方便
3. 支援Map/Reduce (JavaScript 或 Erlang)
4. 可以下Secondary Index,幫助搜尋(可以想像成是下tag)
5. 社群支援度高,各種語言的client套件齊全
6. Document詳細


Riak的儲存機制

Ring 環

Riak是採用buckets和keys來記錄和分類資料,舉例來說:「student(bucket) / kevin(key)」,這是我們表面看到的,但是在底層的實作上,Riak是將bucket和key做hash以後得到一個新的key(160-bit binary),再將所有的新key聚在一起,成為一個「Ring」。這個Ring會依你的設定被分割為多個Partition,每個partition都由一個vnode負責。

什麼是vnode?

Riak主打的就是他的延伸性,也就是能輕鬆的結成一個cluster。在這個cluster裡面每個Riak instance都是一個node,每個node上又跑了好幾個virtual node,也就是vnode,每個node都有差不多數量的vnode。舉例來說,我有一個4個node所組成的riak cluster,當我設定這個cluster的ring需要被切割為16個partitions時,整個cluster也會需要產生16個vnode來對應這些partition,在這個情況下,每個node會平均開啟8個vnode來認領(claim)這些partition。

資料備份數目

每個Bucket都可以設定他所儲存的資料要被保存幾份(N),以確保整個cluster的容錯能力。所以當有新資料要被插入或更新到這個cluster時,會看這筆資料所在的partition是屬於哪幾個vnode,將這個新增或更新的request PUT到這些vnode。
當要取得資料時,這個request也會被送到所屬的nodes。特別的是,這個request可以要求這個cluster必須在R個node都回應以後才將response吐回去。(R<=N)


Reference: