天天看點

Riak學習(3):Riak對比HBase(轉)

對比的riak版本是1.1.x,hbase是0.94.x。

riak 與 hbase 都是基于 apache 2.0 licensed 釋出

riak 的實作是基于 amazon 的 dynamo 論文,hbase 是基于 google 的 bigtable

riak 主要用 erlang 寫成,包括一部分的c,而 hbase 是用 java 寫的。

功能點

riak

hbase

資料模型

riak 通過bucket作為命名空間,存儲 key-value 資訊

<a target="_blank" href="http://wiki.basho.com/concepts.html#buckets%2c-keys%2c-and-values">buckets, keys, and values</a>

hbase 按預先定義好的 column family 結構來存儲資料(每一條資料有一個key以及若幹個列屬性值組成,每列的資料都有自己的版本資訊)。hbase 中的資料是按列進行有序存儲的(不像關系型資料庫中按行存儲)。

<a target="_blank" href="http://hbase.apache.org/book/datamodel.html">hbase data model</a>

<a target="_blank" href="http://hbase.apache.org/book/supported.datatypes.html">supported data types</a>

存儲引擎

riak 采用子產品化的思想,将存儲層作為引擎挂到系統上。你可以根據自己的需要選擇不同的存儲引擎。

<a target="_blank" href="http://wiki.basho.com/storage-backends.html">riak 支援的存儲引擎</a>

hbase 是存在于 hdfs之上的,其資料檔案存在hdfs中。與bigtable 類似,資料存儲分為記憶體中的 memstore 和落地存儲的 storefiles。其資料檔案稱為hfile,基于bigtable 的sstable。可以直接使用jvm的 檔案系統io操作來對資料檔案進行操作。

<a target="_blank" href="http://hadoop.apache.org/hdfs/">hdfs</a>

<a target="_blank" href="http://hbase.apache.org/book/arch.hdfs.html">hadoop uses hdfs</a>

資料通路接口

除了直接使用 erlang 之外,riak 還提供了兩種資料通路接口,rest方式和 protocol buffer :

<a target="_blank" href="http://wiki.basho.com/http-api.html">http</a>

<a target="_blank" href="http://wiki.basho.com/pbc-api.html">protocol buffers</a>

riak 的用戶端都是基于上面的api來實作,目前對主流的語言支援很好。

<a target="_blank" href="http://wiki.basho.com/client-libraries.html">client-libraries</a>

<a target="_blank" href="http://wiki.basho.com/community-developed-libraries-and-projects.html">community developed libraries and projects</a>

hbase 的操作主要通過在jvm中直接執行代碼。hbase 也提供了外部資料通路方式,包括rest方式以及thrift協定的通路。

<a target="_blank" href="http://hbase.apache.org/book/architecture.html">java interface</a>

<a target="_blank" href="http://wiki.apache.org/hadoop/hbase/stargate">rest</a>

<a target="_blank" href="http://thrift.apache.org/">thrift</a>

資料操作方式

riak中支援下面四種方式的操作

對主鍵進行直接操作 (get, put, delete,update)

<a target="_blank" href="http://wiki.basho.com/mapreduce.html">mapreduce 方式</a>

<a target="_blank" href="http://wiki.basho.com/secondary-indexes.html">riak 還提供 secondary indexes</a>

<a target="_blank" href="http://wiki.basho.com/riak-search.html">riak search 插件</a>

<a target="_blank" href="http://wiki.basho.com/mapreduce-search-2i-comparison.html">上面幾種方式的對比文章</a>

hbase 有兩種方式的資料操作,通過對有序key值進行掃描查詢,擷取value值,或者借助強大的hadoop來進行mapreduce查詢

<a target="_blank" href="http://hbase.apache.org/book/client.filter.html">scanning</a>

<a target="_blank" href="http://hbase.apache.org/book/mapreduce.html">mapreduce</a>

<a target="_blank" href="http://hbase.apache.org/book/secondary.indexes.html">secondary indexes</a>

資料一緻性問題

riak 通過 vector clock的方式來維護資料版本,處理不一緻的情況。同時你也可以不使用vector clock,而是采用基于時間戳的 “last-write-wins” 政策

<a target="_blank" href="http://wiki.basho.com/vector-clocks.html">vector clocks</a>

<a target="_blank" href="http://basho.com/blog/technical/2010/01/29/why-vector-clocks-are-easy/">why vector clocks are easy</a>

<a target="_blank" href="http://basho.com/blog/technical/2010/04/05/why-vector-clocks-are-hard/">why vector clocks are hard</a>

hbase 采用了強一緻性的讀寫保證。資料會在多個不同的region中進行儲存。column families 可以包含無限多個資料版本,每個版本可以有自己的ttl

<a target="_blank" href="http://hbase.apache.org/book/architecture.html#arch.overview.nosql">consistent architecture</a>

<a target="_blank" href="http://wiki.basho.com/.html">time to live</a>

并發

riak 叢集中的所有節點都能同時進行讀寫操作,riak隻負責進行資料的寫入操作(基于vector clock進行帶版本控制的儲存),在資料讀取的時候再來定義資料沖突的處理邏輯。

hbase 通過行級鎖來保證寫操作的原子性,但是不支援多行寫操作的事務性。資料掃描操作不保證一緻性。

<a target="_blank" href="http://hbase.apache.org/acid-semantics.html">consistency guarantees</a>

複制

riak 的資料複制系統的理論來源主要是dynamo 的論文和 eric brewer 博士的 cap 理論。riak 采用一緻性hash對資料進行分片,同一份資料會在多個節點中儲存備份。在一緻性hash的理論支援下,riak采用的是虛拟節點的方式來實作資料的複制并進行資料平衡配置設定的保證。引入虛拟節點使得資料與實際節點間能夠保持松耦合

<a target="_blank" href="http://wiki.basho.com/replication.html">replication</a>

<a target="_blank" href="http://wiki.basho.com/concepts.html#clustering">clustering</a>

riak 的api 提供在一緻性和可用性之間的自由選擇,你可以根據自己的應用場景選擇不同政策。在最初存儲資料到riak中時,可以按bucket為機關進行複制方式的配置。在後續的讀寫操作中,每次都能夠再進行複制份數的設定。

<a target="_blank" href="http://wiki.basho.com/concepts.html#reading%2c-writing%2c-and-updating-data">reading, writing, and updating data</a>

hbase 是典型的最終一緻性實作,資料複制通過 master向slave的推送來實作。最近hbase也添加了master-master 的實作。

<a target="_blank" href="http://hbase.apache.org/replication.html">replication</a>

擴充性

riak 支援動态添加我删除節點,所有節點都對等,不存在主從的差別。當向riak 中添加一個節點後,叢集會通過gossiping 發現節點并配置設定對應的資料範圍并進行資料遷移。移除節點的過程相反。riak提供了一系列工具來完成節點的增删操作。

<a target="_blank" href="http://wiki.basho.com/adding-and-removing-nodes.html">adding and removing nodes</a>

<a target="_blank" href="http://wiki.basho.com/command-line-tools.html">command line tools</a>

<a target="_blank" href="http://hbase.apache.org/book/node.management.html">node management</a>

<a target="_blank" href="http://hbase.apache.org/book/architecture.html">hbase architecture</a>

多資料中心的資料同步

隻有riak的企業版才支援多資料中心的部署方案,通常使用者僅支援單資料中心的部署。

<a target="_blank" href="http://basho.com/products/riak-enterprise/">riak enterprise</a>

hbase通過region來進行分片,天然就支援多資料中心的部署。

<a target="_blank" href="http://hbase.apache.org/replication.html">node management</a>

圖形化的監控管理工具

從riak 1.1.x 開始,riak 釋出了 riak control,這是一個針對riak的開源的圖形化管理工具。

<a target="_blank" href="http://wiki.basho.com/riak-control.html">riak control</a>

<a target="_blank" href="http://basho.com/blog/technical/2012/02/22/riak-control/">introducing riak control</a>

hbase 有一些開源社群開發的圖形化工具,同時也有一個指令行的控制終端能用。

<a target="_blank" href="http://hbase.apache.org/book/ops_mgt.html#tools">admin console tools</a>

<a target="_blank" href="http://wiki.apache.org/hadoop/hbase/eclipseenvironment">eclipse dev plugin</a>

<a target="_blank" href="http://sourceforge.net/projects/hbasemanagergui/">hbase manager</a>

<a target="_blank" href="https://github.com/zaharije/hbase-gui-admin">gui admin</a>

繼續閱讀