HBase read replicas 功能介紹系列
HBase read replicas
1.概述
對於這個模塊打算有幾篇文章組成一個系列,詳細的介紹這個功能,大概分read replicas綜述(本文)、正常情況下的讀寫流程分析、異常情況下的讀寫流程分析;
本文主要介紹的有:概述、讀流程鏈路、寫流程鏈路、如何使用read replicas,example。我們知道HBase是一個強一致的系統,最初是因為一個regionserver下負責的多個region的讀寫都是經歷這個regionserver去做處理,這樣的話,該regionserver是單點的做讀寫,不會存在數據不一致的問題。但是相應的該regionserver如果掛掉了,會造成該regionserver負責的region都不能提供服務。這個降低了整個流程的服務可用性。那麽為了解決該問題,HBase引入了 Read Replicas的功能,也就是對於一個region在多個節點上都有對應的副本,HBase可以通過balance保證各個region的各個副本在不同的機器,機架上。我們給主region 一個數字為0的replica_id,其余的副本都可以叫做secondary regions,他們的對應replica_id 是1、2、…,所有的寫請求都是replica_id為0的節點(regionserver)做處理,然後異步的發送到1、2、…等節點。有了這個功能HBase的讀流程的可用性就由原來的3個9變成了4個9。當然有利也有弊,我們做設計就是在做tradeoff,引入這個功能的話,對系統讀取數據的一致性有一點影響。不過這個主要看業務方可否接受,為了提高服務可用性,犧牲一點點數據一致性是否可以考慮。
2.讀流程鏈路
在HBase進行Get的時候,構造的Get對象裏面有一個Consistency的子項,默認是Consistency.STRONG,除此之外還有一個Consistency.TIMELINE的選項。我們文章涉及到的replicas主要和這個東西有關系。如果你希望讓你的讀操作具有更高的可用性,你就需要在Get對象進行一個設置,設置它的Consistency屬性為TIMELINE。那麽通過這個設置的話,讀請求就先會去replica_id為0的主replica上面去讀數據,如果在一定時間內,HBase client沒有等到主的響應,那麽就會並發的發送請求到備份的replicas,這個時間默認是10ms,可以通過在client端的配置文件裏面設置hbase.client.primaryCallTimeout.get來配置。那麽你可能就會問了,這個數據可能不是主上面的數據,可能是replica_id為1、2、等上面的數據,那麽這個數據不就存在老數據的可能麽?對!HBase 提供了一個接口用於判別數據是不是最新的,叫做isStale()。
但是如果用戶使用的是Consistency.STRONG這種的話,就不會存在讀到老數據的可能性。世上很難有完美的方案,那麽怎麽去做選擇,就是需要業務基於自己的需求做一定的選擇了。這個方案的有點是:提高了讀服務的可用性,同樣的會引入一些弊端,造成一定的內存開銷以及網絡開銷,因為數據需要在replicas上進行存儲,也存在請求到replicas上的可能性,那麽就會增加網絡開銷;
3.寫流程鏈路
上面概述裏面提到我們需要把HBase的寫的數據先經replica_id為0 的節點,然後異步分發到replicas上面去,那麽分發的過程是異步的,不然存在影響整個寫流程的體驗。既然設計的是異步的,在HBase 裏面存在2階段不同的實現方案,分別是在HBase1.0+和HBase1.1+這2個大版本上面實現的;在HBase的官方分別叫做: StoreFile Refresher 和 Asnyc WAL replication。
3.1.StoreFile Refresher
這種機制就是一個regionserver上一個特定的線程,階段性的將主replica上的store file 刷新到secondary replicas上面。開啟這個功能的配置是在HBase的裏面把hbase.regionserver.storefile.refresh.period進行一個配置,單位是毫秒級別的。通過設置這個,定時刷新線程會看到主上的memstore 的flush,以及compaction,bulck load 操作。那麽對於內存裏面的數據,可能就會在備份上面讀不到。
3.2.Asnyc WAL replication
在HBase1.1+的版本裏面新的一種數據被復制到secondary replicas的方式是:類似HBase replication,但是是單集群內部replicas之間的數據復制,由於主和secondary replicas之間的數據共享一份持久化數據,那麽數據備份到replicas的時候是需要保證內存之間的數據是相同的。主在做寫,compaction,bulkload等操作的時候會寫數據到wal log,然後通過這個機制secondary replicas會觀察到變化,然後講數據在本地內存回放。
這個功能默認情況下是被關閉的,通過設置“hbase.region.replica.replication.enabled” 為true即可開啟這個功能。
4.使用配置和使用步驟
如果要使用功能的話,分服務端和客戶端,下面這份配置是服務端的:
客戶端上面的配置更新:
新建一張具有region replica 的表:shell命令:
java的api操作:
讀取數據:shell命令:
java的api操作:
後續
後面的話會繼續從源碼級別進行該模塊的分析,敬請期待!
原文鏈接
HBase read replicas 功能介紹系列