HBase 架構與工做原理2 - HBase 組件

1、HBase 組件概覽

Master-Slave 模式: HBase 體系結構遵循傳統的 master-slave 模式,由一位掌握決策的主設備和一個或多個真正處理任務的從設備組成。在 HBase 中,主設備稱爲 HMaster,從設備被稱爲 HRegionServers,主從設備之間則經過 Zookeeper 共享狀態信息。html

HBase 組成: 從物理層面,HBase 由 3 個部分:算法

  • Region Servers
  • HBase Master
  • Zookeeper

它們在程序中的實現分別爲:apache

  • HRegionServers 節點
  • HMaster 節點
  • Zooeeper 節點

Region Servers 爲客戶端的讀寫提供數據,訪問數據時,客戶端直接與 Region Servers 通訊。Region 分配、DDL(建立、刪除表)操做則由 HBase Master 處理。Zookeeper 做爲 HDFS 的一部分,維護者一個活動的集羣的狀態。數組

全部的 HBase 數據都存儲在 HDFS 中,即 DataNode 負責存儲 RegionServers 正在管理的數據。實際的架構中,會在每一個 DataNode 節點上部署一個對應的 RegionSevers,這使得 RegionSevers 所管理的數據距離實際的存儲更接近,這也符合了 HDFS 目標之一:移動計算而非移動數據。緩存

這裏寫圖片描述

HRegionServers

RegionServers 主要負責服務和管理 Regions,它提供面向數據和 Region 維護的方法,其中包括:服務器

  • 數據的讀寫、刪除等
  • Region 的分離(Split)、壓縮(compact)等

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

HMaster 是 Master Server 的實現,它負責監視集羣中的全部 RegionServer 實例,而且提供全部元數據更改的接口。HMaster 主要功能包括:負載均衡

  • 協調 RegionServer
    • 在啓動時分配 Region、從新分配 Region 以恢復或負載均衡
    • 監控集羣中的全部 RegionServers 節點(偵聽來自 Zookeeper 的通知)
  • 管理功能
    • 提供建立、修改、刪除、啓動、禁用 table 的接口
    • 管理 namesapce 和 table 的元數據
    • 管理 Region 的移動、分配、取消分配
    • 權限控制

這裏寫圖片描述

同時,HMaster 運行着幾個後臺進程,包括:分佈式

  • 負載平衡器(LoadBalancer): 按期地,若是沒有任何 Region 被轉換時,負載平衡器將運行並移動 Region 平衡集羣負載;
  • Catalog Janitor: 按期檢查並清理 .META 表。

Zookeeper

HBase 使用 Zookeeper 做爲分佈式協調服務來維護集羣中的服務器狀態。Zookeeper 維護哪些服務器處於活動狀態並可用,並提供服務器故障通知。Zookeeper 使用共識來保證共同的共享狀態。根據 Zookeeper 使用的 Paxos 算法特性,至少應該有三至五臺機器達成共識。

這裏寫圖片描述

2、組件間如何協同工做

使用 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 將變爲活動狀態。

3、RegionServers 的組件

RegionServer 做爲管理 Region,並直接與客戶端傳輸數據的節點,其運行在 HDFS 的 DataNode 節點之上,並具備如下組件:

  • WAL: 預寫日誌,用於存儲還沒有被永久保存的新數據,它以文件的形式存儲在分佈式文件系統(一般是 HDFS)上,其主要做用是用於故障後的恢復;
  • BlockCache: 讀取緩存,它將頻繁讀取的數據存儲在內存中,用以加快客戶端的讀取速度。最近最少使用的數據將在 BlockCache 滿時被逐出,其默認的最大值爲 Java 堆大小 * 0.4,默認的緩存方式爲 LruBlockCache(一種徹底在 Java 堆內的緩存,另一種方式爲 BucketCache);
  • MemStore: 寫入緩存,它存儲還沒有寫入磁盤的新數據,用以減小磁盤 IO 頻率。它在寫入磁盤以前將進行排序。++每一個 Region 的每一個列族都有一個 MemStore。++
  • HFiles: 用於將行數據做爲已排序的 KeyValues 結構存儲在磁盤上的最終文件,一個 Region 一般包含多個 HFile。

這裏寫圖片描述

HFile (StoreFile)

HBase 的數據最終被存儲在 HFile 中,HFile 是保存在 HDFS 中的物理文件(默認大小爲 128M),它包含已經排序過的 KeyVelue 數據。

注:HFile 中的數據是有序的,但同一個 Region 下的全部 HFile 並不必定是連續有序的。

當 MemStore 累積足夠的數據時(默認爲128M),整個已排序的 KeyValues 集將被寫入 HDFS 中的新的 HFile 文件中(這是一個順序寫入,避免了移動磁盤驅動器磁頭,因此它的速度會很是快)。

這裏寫圖片描述

KeyVelue

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,便表明了此數據被刪除。

Block

StoreFile(HFile) 由 block 組成,block 的大小基於每一個 ColumnFamily 進行配置,可在建立表時指定,默認大小爲 64 KB。數據壓縮也是發生在 block 級別。

HFile 結構

HFile 包含一個多層索引,它容許 HBase 在沒必要讀取整個文件的狀況下查找數據。多級索引就像一顆 B+ 樹,它具備以下特色:

  • KeyValue 對按升序存儲
  • 索引指向包含 KeyValue 數據的「block」(默認大小爲 64KB)
  • 每一個 block 都有本身的葉子索引(Leaf ndex)
  • 每一個 block 的最後一個 key 放在中間索引(Intermediate index)中
  • 根索引指向中間索引

同時,文件的結尾包含一個 trailer 信息,它指向全部的塊。而且該 tariler 還具備 Bloom 過濾器和時間範圍等信息。Bloom 過濾器有助於跳過不包含某個行鍵的文件。若是文件再也不讀取的時間範圍內,則時間範圍信息對於跳過該文件很是有用。

注:一個 keyValue 不會在 block 之間被拆分,即若是一個 KeyValue 大小爲 8M,即便 block 大小設置是 64KB,這個 KeyValue 也將做爲一個連貫的 block 被存儲。

HFile 結構

HFile 索引

HFile 的索引是在 HFile 打開並保存在內存中時被加載的,它被保存在 BlockCache(即讀取緩存)中,這就容許經過單個磁盤尋道來執行查找功能。

這裏寫圖片描述

參考連接

相關文章
相關標籤/搜索