如果需求相當簡單只需要做分散式儲存,很多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)