本文系轉載,若有侵權,請聯繫我:likui0913@gmail.comhtml
Master-Slave 模式: HBase 體系結構遵循傳統的 master-slave 模式,由一位掌握決策的主設備和一個或多個真正處理任務的從設備組成。在 HBase 中,主設備稱爲 HMaster,從設備被稱爲 HRegionServers,主從設備之間則經過 Zookeeper 共享狀態信息。算法
HBase 組成: 從物理層面,HBase 由 3 個部分:apache
它們在程序中的實現分別爲:數組
Region Servers 爲客戶端的讀寫提供數據,訪問數據時,客戶端直接與 Region Servers 通訊。Region 分配、DDL(建立、刪除表)操做則由 HBase Master 處理。Zookeeper 做爲 HDFS 的一部分,維護者一個活動的集羣的狀態。緩存
全部的 HBase 數據都存儲在 HDFS 中,即 DataNode 負責存儲 RegionServers 正在管理的數據。實際的架構中,會在每一個 DataNode 節點上部署一個對應的 RegionSevers,這使得 RegionSevers 所管理的數據距離實際的存儲更接近,這也符合了 HDFS 目標之一:移動計算而非移動數據。服務器
RegionServers 主要負責服務和管理 Regions,它提供面向數據和 Region 維護的方法,其中包括:數據結構
Region 是 Table 可用性和分佈的基本元素,由每一個列族(ColumnFamily)的一個庫(Store) 組成。其對象層級以下:架構
- Table
- Region
- Store(由每一個 Region 中的列族組成的存儲塊)
- MemStore(每一個 Region 中存儲在內存中的 Store)
- StoreFile(每一個 Region 中被持久化後的 Store)
- Block (StoreFile 內被分塊存儲後的塊)
分區存儲: HBase 按照行鍵(RowKey)範圍水平劃分 Regions,一個 Region 包含了該 Region 的 startKey (開始鍵)到 endKey (結束鍵)之間的全部行。這些 Region 被分配給各個 RegionServers,每一個 RegionServer 能夠服務約 1000 個 Region。負載均衡
HMaster 是 Master Server 的實現,它負責監視集羣中的全部 RegionServer 實例,而且提供全部元數據更改的接口。HMaster 主要功能包括:分佈式
同時,HMaster 運行着幾個後臺進程,包括:
HBase 使用 Zookeeper 做爲分佈式協調服務來維護集羣中的服務器狀態。Zookeeper 維護哪些服務器處於活動狀態並可用,並提供服務器故障通知。Zookeeper 使用共識來保證共同的共享狀態。根據 Zookeeper 使用的 Paxos 算法特性,至少應該有三至五臺機器達成共識。
使用 Zookeeper 共享成員信息: HBase 使用 Zookeeper 來協調 HMasters 與 RegionServers 成員的共享狀態信息。RegionServers 和活動狀態的 HMaster 經過會話鏈接到 Zookeeper,並在 Zookeeper 上建立一個臨時節點以表示其處於活動狀態。Zookeeper 則經過接收各成員的心跳信息來維護會話的臨時節點,若是RegionServers 或活動的 HMaster 未能向 Zookeeper 發送心跳,則表明會話過時,Zookeeper 將刪除相應的臨時節點。HMaster 經過監聽 Zookeeper 上 RegionServer 建立的臨時節點來發現可用的 RegionServer,並監控這些節點的服務器故障。
HMaster 選舉: HMaster 經過爭奪建立一個短暫的節點,Zookeeper 會選擇第一個來確保只有一個 HMaster 處於活動狀態。活動的 HMaster 將心跳發送到 Zookeeper,非活動狀態的 HMaster 將監聽活動的 HMaster 故障的通知,一旦發現活動的 HMaster 失敗,則非活動的 HMaster 將變爲活動狀態。
RegionServer 做爲管理 Region,並直接與客戶端傳輸數據的節點,其運行在 HDFS 的 DataNode 節點之上,並具備如下組件:
HBase 的數據最終被存儲在 HFile 中,HFile 是保存在 HDFS 中的物理文件(默認大小爲 128M),它包含已經排序過的 KeyVelue 數據。
注:HFile 中的數據是有序的,但同一個 Region 下的全部 HFile 並不必定是連續有序的。
當 MemStore 累積足夠的數據時(默認爲128M),整個已排序的 KeyValues 集將被寫入 HDFS 中的新的 HFile 文件中(這是一個順序寫入,避免了移動磁盤驅動器磁頭,因此它的速度會很是快)。
KeyVelue 類是 HBase 中數據存儲的核心。KeyVelue 包裝一個字節數組,並將偏移量和長度放入傳遞的數組中,指定將內容開始解釋爲 KeyVelue 的位置。
字節數組中的 KeyVelue 數據結構表現爲:
{ keylength, valuelength, key: { rowLength, row (i.e., the rowkey), columnfamilylength, columnfamily, columnqualifier, timestamp, keytype (e.g., Put, Delete, DeleteColumn, DeleteFamily) } value }
注:keytype 用來標識數據操做類型,當刪除操做發生時,HBase 新建一條相同的數據,並使 keytype=delete,便表明了此數據被刪除。
StoreFile(HFile) 由 block 組成,block 的大小基於每一個 ColumnFamily 進行配置,可在建立表時指定,默認大小爲 64 KB。數據壓縮也是發生在 block 級別。
HFile 包含一個多層索引,它容許 HBase 在沒必要讀取整個文件的狀況下查找數據。多級索引就像一顆 B+ 樹,它具備以下特色:
同時,文件的結尾包含一個 trailer 信息,它指向全部的塊。而且該 tariler 還具備 Bloom 過濾器和時間範圍等信息。Bloom 過濾器有助於跳過不包含某個行鍵的文件。若是文件再也不讀取的時間範圍內,則時間範圍信息對於跳過該文件很是有用。
注:一個 keyValue 不會在 block 之間被拆分,即若是一個 KeyValue 大小爲 8M,即便 block 大小設置是 64KB,這個 KeyValue 也將做爲一個連貫的 block 被存儲。
HFile 的索引是在 HFile 打開並保存在內存中時被加載的,它被保存在 BlockCache(即讀取緩存)中,這就容許經過單個磁盤尋道來執行查找功能。