HBase複製

HBase複製是一種在不同HBase部署中複製數據的方法。它可以作爲一種故障恢復的方法,並提供HBase層次的高可用性。在實際應用中,例如,可以將數據從一個面向頁面的集羣複製到一個MapReduce集羣,後者可以同時處理新數據和歷史數據。然後再自動將數據傳回面向頁面請求的集羣。

HBase複製中最基本的架構模式是“主推送”(master-push),因爲每個region server都有自己的WAL(或HLog),所以很容易保存現在正在複製的位置。正如衆所周知的解決方案-Mysql的主/從複製,只使用二進制文件來跟蹤修改。一個主集羣可以將數據複製到任意數目的從集羣,每個region server都會參與複製自己的修改。更多的關於主/從複製或其他類型的複製,可以參考文章《How Google Serves Data From Multiple Datacenters》。

複製是異步進行的,意味着集羣可以是地理上彼此遠離的,它們之間的連接可以在某個時刻斷開,在主集羣上的修改不能馬上在從集羣上進行同步(最終一致性)。

這裏使用的複製格式從概念上和《MySQL’s statement-based replication》類似。和SQL語句不同,所有的WALEdits(包括來自客戶端的Put和Delete產生的多單元格操作)都會被複制以保證原子性。

來自每個region server的HLog是HBase複製的基礎,並且只要它們需要將數據複製到從集羣,它們就必須被保存到HDFS上。每個region server從它需要的最老的日誌開始複製,同時在zookeeper中保存當前恢復的位置來簡化錯誤恢復。每個從集羣恢復的位置可能不同,但它們處理的HLog隊列內容是相同的。

參與複製的集羣的規模可以不對等。主集羣會通過隨機分配儘量均衡從集羣的負載。

從0.92版本起,HBase還支持另外的兩種模式的複製:主<->主和循環複製。

下圖展示了複製的工作流程和架構。


集羣複製架構圖

HBase複製部署

1)編輯集羣中所有機器的${HBASE_HOME}/conf/hbase-site.xml文件,增加如下配置:

<property>
  <name>hbase.replication</name>
  <value>true</value>
</property>
修改完成後,重啓HBase集羣,使配置生效。

2)在HBase shell中運行如下命令:

hbase(main):003:0> add_peer 'ID' 'CLUSTER_KEY'
hbase(main):004:0> start_replication

第一條命令是爲從集羣設置zookeeper集羣信息,這樣可以使得修改被同步到從集羣上。第二條命令真正將修改過的記錄發佈到從集羣上。爲了保證工作能按照預期進行,用戶必須保證已經在從集羣上建立了一個相同的表的副本,表可以爲空,但必須有相同的模式和表名。

注意:hbase-0.96和hbase-0.98已經沒有了start_replication命令和stop_replication命令。hbase-0.98相較hbase-0.96,新增了set_peer_tableCFs、show_peer_tableCFs命令。在設定複製時,hbase-0.98需要使用set_peer_tableCFs設置。具體的有對應的幫助命令可供參考。

ID必須是一個短整數,CLUSTER_KEY的內容請參考以下模板:

hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent
比如,zk.server.com:2181:/hbase

注意:如果兩個集羣使用相同的zookeeper集羣,你不得不使用不同的 zookeeper.znode.parent,因爲它們不能寫入相同的文件夾中。

3)一旦你有一個對等(從)集羣,你需要在你的列簇上使複製可用,要想達到這樣的效果,可以在HBase shell中執行如下命令:

hbase(main):005:0> disable 'your_table'
hbase(main):006:0> alter 'your_table', {NAME => 'family_name', REPLICATION_SCOPE => '1'}
hbase(main):007:0> enable 'your_table'
scope值爲0(默認值)意味着它不會被複制,而scope值爲1意味着它將被複制。

4)運行如下命令可以列出所有配置的對等(從)集羣:

hbase(main):008:0> list_peers
5)運行如下命令將使對等(從)集羣不可用:

hbase(main):009:0> disable_peer 'ID'
運行完命令後,HBase將停止將向對等(從)集羣發送修改,但是它將一直跟蹤所有新的WALs文件,以便當從集羣可用時繼續複製。

6)可以運行如下命令將使之前設置爲不可用的對等(從)集羣可用:

hbase(main):010:0> enable_peer 'ID'
7)運行下面的命令,可以移除一個從集羣:

hbase(main):011:0> stop_replication
hbase(main):012:0> remove_peer 'ID'
需要注意的是,停止複製仍會完成所有已在隊列裏的修改的複製,但是之後所有的處理都被停止了。爲了確認你的配置都正常工作,你可以查看任何一個region server的日誌文件,看是否有類似下面幾行的內容:

Considering 1 rs, with ratio 0.1
Getting 1 rs from peer cluster # 0
Choosing peer 10.10.1.49:62020
這個例子表示有一個region server被選擇做複製。

和複製有關的其他一些配置項:

<property>
	<name>replication.source.nb.capacity</name>
	<value>5000</value>
<description> 主集羣每次像備集羣發送的entry最大的個數,推薦5000.可根據集羣規模做出適當調整,slave集羣服務器如果較多,可適當增大,默認是25000</description>
</property>

<property>
	<name>replication.source.size.capacity</name> 
	<value>4194304</value> 
	<description> 主集羣每次像備集羣發送的entry的包的最大值大小,不推薦過大,默認是64MB(64*1024*1024)</description>
</property>

<property>
	<name>replication.source.ratio</name>
	<value>1</value>
	<description> 主集羣裏使用slave服務器的百分比,默認是0.1</description>
</property>

<property>
	<name>hbase.regionserver.wal.enablecompression</name>
	<value>false</value>
	<description> 主集羣關閉hlog的壓縮</description>
</property>

<property>
	<name> replication.sleep.before.failover</name>
	<value>5000</value>
	<description> 主集羣在regionserver當機後幾毫秒開始執行failover</description>
</property>

轉載請註明出處:http://blog.csdn.net/iAm333
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章