整個Hadoop生態中大量使用了master-slave的主從式架構,如同HDFS中的namenode和datanode,MapReduce中的JobTracker和TaskTracker,YARN中的資源管理器和節點管理器,Zookeeper中的leader和follower。我們將看到HBase同樣是基於這種主從式的一種運行機制。
1、HBase實現原理
正如前面所說,HBase將表水平分裂為區域,集群中的每個節點管理若干個區域,區域是HBase集群上分布數據的最小單位,因此存儲數據的節點就構成了一個個的區域服務器,叫做RegionServer。
在HBase中,同樣采用了主從式的架構,用一個master節點協調管理多個RegionServer從屬機,主控機負責啟動安裝,將區域分配給注冊的RegionServer,恢復RegionServer的故障,管理和維護HBase表的分區信息,master 的負載很輕。而區域服務器RegionServer負責存儲和維護分配給自己的Region,響應客戶端的讀寫請求。

客戶端並不是直接從Master主服務器上讀取數據,而是在獲得Region的存儲位置信息后,直接從Region服務器上讀取數據,因此主控機的負載很輕。
那么這里我們需要理清的一個重要問題就是如何定位區域在哪個服務器上,即Region的定位問題。
【Region是如何定位的?】
在HBase內部維護了一張名為hbase:meta的特殊目錄表,這張表記錄了當前集群上所有區域的列表、狀態和位置,這張表的行鍵是區域名,即meta表的結構是:<區域名,位置,狀態>,而區域名是由所屬表名,區域的起始行,創建時間以及對前三者進行MD5哈希之后的結果共同組成的。
如表TestTable中起始行為xyz的區域的名稱是:TestTable,xyz,1279729913622,1b6e176fb8.........(哈希值)
有了meta這張表,表是根據行鍵排序的,所以要查詢某一行只需要與行鍵進行比較,即可得到對應的區域,進而得到對應的位置,然后直接到那個服務器上去讀取數據。
更進一步,我們考慮這樣的問題:meta表保存着所以區域的位置信息,因此這張表是很重要的,而且當數據量很大,區域很多時,這張表也可能大到一個區域無法保存,因此HBase實際上是有一個三層結構來完成區域定位的。

理解這個三層結構可以類別文件系統的多級索引機制,首先在Zookeeper中用一個文件保存Root表的位置,Root表中記錄meta表的區域位置信息,meta表中記錄數據的區域位置。
層次 | 名稱 | 作用 |
---|---|---|
第一層 | Zookeeper文件 | 記錄了-ROOT-表的位置信息 |
第二層 | -ROOT-表 | 記錄了.META.表的Region位置信息 -ROOT-表只能有一個Region通過-ROOT-表,就可以訪問.META.表中的數據 |
第三層 | .META.表 | 記錄了用戶數據表的Region位置信息,.META.表可以有多個Region,保存了HBase中所有用戶數據表的Region位置信息 |
總結起來,我們可以看到每個行操作可能需要三次遠程訪問,一次是連接Root所在節點,一次是連接meta所在節點,還有一次是連接需要的RegionServer,為了節省這些開銷,客戶端可以通過緩存來存儲之前訪問meta表得到的信息,這樣,后續可以現在緩存中查找,節省多次遠程訪問的開銷。
2、HBase系統架構
實際上通過前面的實現原理,我們對HBase已經基本了解,再來從整體的角度理解其系統的架構。

如圖所示,HBase的整體系統架構如圖所示,其中包含了客戶端、Zookeeper、Master、RegionServer、HDFS這些基本實體。我們來做一個總結:
客戶端:客戶端包含訪問HBase的接口,同時在緩存中維護着已經訪問過的Region位置信息,用來加快后續數據訪問過程。
Zookeeper服務器:HBase依賴於Zookeeper,它管理一個Zookeeper實例,作為集群的權威機構,之前我們看到root表的位置信息保存在Zookeeper服務器上,客戶端通過Zookeeper才可以得到meta目錄表的位置以及主控機的地址等信息,也就是說Zookeeper是整個HBase集群的注冊機構,另外,Zookeeper可以幫助選舉出一個Master作為集群的總管,並保證在任何時刻總有唯一一個Master在運行,這就避免了Master的“單點失效”問題。
主控機Master:主服務器Master主要負責表和Region的管理工作:管理用戶對表的增加、刪除、修改、查詢等操作、實現不同Region服務器之間的負載均衡、在Region分裂或合並后,負責重新調整Region的分布、對發生故障失效的Region服務器上的Region進行遷移等。
Region服務器:Region服務器是HBase中最核心的模塊,負責維護分配給自己的Region,並響應用戶的讀寫請求。
HDFS:我們在一開始提到:HBase是基於HDFS開發的,也提到過一個列族的數據在磁盤上作為一個文件存儲在一起,這里實際就是使用HDFS來持久化存儲數據,是實際的數據存儲的地方。