淺談HBase系統架構

一、HBase基本架構和核心功能模塊

這裏寫圖片描述

  • Client:

    1. 客戶端Client是HBase系統的入口,使用者直接通過客戶端操作HBase;
    2. Client使用HBase的RPC機制與HMaster和RegionServer進行通信,對HBase 管理類操作,Client與HMaster進行RPC通信;對數據讀寫類操作,Client與 RegionServer進行RPC交互;
    3. Client客戶端允許有多個,包括原生Java接口,還有Thrift,Avro,Rest等客戶端模式;
        
  • Zookeeper(協調服務組件):

    1. ZooKeeper Quorum隊列負責管理HBase中多個HMaster的選舉、服務器之間的狀態同步等,避免HMaster單點問題;
    2. HBase中ZooKeeper實例負責的協調工作有:存儲HBase元數據信息、實時監控RegionServer(感知各個HRegionServer的健康狀況)、存儲所有Region的尋址入口;
    3. 保證HBase集羣中有且只有一個HMaster節點;
  • HMaster:

    1. HMaster沒有單點問題,在HBase中可以啓動多個Hmaster,通過ZooKeeper 的Master(leader)選舉機制保證總有一個Master正常運行並提供服務,其餘HMaster作爲備選時刻準備提供服務;
    2. HMaster 主要負責Table和Region的管理工作;
    3. 管理用戶對Table的增刪改查操作;
    4. 管理RegionServer的負載均衡,調整Region分佈;
    5. 在Region分裂後,負責新的Region的分配;
    6. 在RegionServer宕機後,負責失效RegionServer上的Region遷移;
  • HRegionServer:

    1. HRegionServer主要負責響應用戶I/O請求,向HDFS文件系統中讀寫數據,是HBase中的核心存儲模塊;
    2. HRegionServer內部管理了一系列Hregion對象,每個Hregion對應了Table中的一個Region;
    3. HRegion由多個HStore組成,每個HStore對應了Table中的一個 Column Family的存儲;
    4. HBase中每個Column Family就是一個集中的存儲單元,因此設計時最好將具備共同IO特性的列放在同一個Column Family中,保證讀寫的高效性;

二、HRegionServer架構

這裏寫圖片描述

  • HStore是HBase的真實數據存儲結構,有兩部分組成:MemStore 和StoreFile(底層實現是HFile格式);

  • MemStore是Sorted Memory Buffer,用戶寫入的數據首先會放入 MemStore中,當MemStore滿了以後會Flush成一個StoreFile;

  • 當StoreFile文件數量增長到一定閾值,會觸發Compact操作,將多 個StoreFile合併成一個StoreFile,在合併過程中會進行版本合併和數據刪除,因此可以看出,HBase其實只有增加數據,所有的更新和刪除操作都是在後續的Compact過程中進行的,使得用戶的寫操作只要緩衝至內存即可返回,保證IO性能;

  • StoreFiles在觸發Compact操作後,會逐步形成越大的StoreFile,當單個StoreFile大小超過一定閾值後,會觸發Split操作,同時把當前 Region分裂成2個Region,父Region會下線,新分裂的2個子 Region會被Hmaster分配到相應的HRegionServer上,使得原來的 1個Region的負載壓力得以分流到2個Region上;

  • 每個HRegionServer中都有一個HLog對象,HLog是一個實現WAL 的類,每次操作寫入數據到MemStore時,也會寫一份數據到HLog 文件中,HLog文件定期會更新刪除舊的文件(已經持久化到StoreFile中的數據);

三、HRegionServer意外出錯或宕機

由上面我們知道HBase其實只有增加數據,所有的更新和刪除操作都是在後續的Compact過程中進行的,使得用戶的寫操作只要緩衝至內存即可返回,保證IO性能,但是如果在Compact之前HRegionServer宕機了,那在內存中的寫操作數據都將會丟失,下面說明一下HBase是如何做的。

其實HRegionServer中的HLog就是防止這種情況發生的。

工作機制:

  • 每個HRegionServer中都會有一個HLog對象,HLog是一個實現Write Ahead Log(WAL)的類,每次用戶操作寫入Memstore的同時,也會寫一份數據到HLog文件,HLog文件定期會滾動出新,並刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止後,HMaster會通過Zookeeper感知;
  • HMaster首先處理遺留的HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應的Region目錄下;
  • 然後再將失效的Region重新分配,領取到這些Region的HRegionServer在加載Region的過程中會發現有歷史HLog需要處理;
  • 最後新分配的HRegionServer會將HLog中的數據回滾到MemStore中,接着Flush到StoreFile中進行持久化存儲;

四、HBase存儲格式

HBase中的所有數據文件都存儲在Hadoop HDFS文件系統上,格式主要有兩種:

  • HFile HBase中KeyValue數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile ;

  • HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File;

1.HFile
這裏寫圖片描述

HFile裏面的每個KeyValue對就是一個簡單的byte數組。這個byte數組裏麪包含了很多項,並且有固定的結構。

HFile由六部分組成

1). Data Block 段:保存表中的數據,這部分可以被壓縮;每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成,Magic內容就是一些隨機數字,目的是防止數據損壞;爲了提高效率,HRegionServer中有基於LRU的Block Cache機制。

2). Meta Block段 (可選的):保存用戶自定義的kv對,可以被壓縮。

3). File Info 段:HFile的元信息,不被壓縮,用戶也可以在這一部分添加自己的元信息。

4). Data Block Index 段:Data Block的索引。每條索引的key是被索引的 block的第一條記錄的key。記錄了每個Data塊的起始點。

5). Meta Block Index段 (可選的):Meta Block的索引。記錄了每個Meta塊的起始點。

6). Trailer段:這一段是定長的。保存了每一段的偏移量,讀取一個HFile時會首先讀取Trailer,Trailer保存了每個段的起始位置(段的Magic Number用來做安全check),然後DataBlock Index會被讀取到內存中,這樣,當檢索 某個key時,不需要掃描整個HFile,而只需從內存中找到key所在的block,通過一次磁盤io將整個 block讀取到內存中,再找到需要的key。

  • Data Block Index採用LRU機制淘汰。
  • HFile的Data Block,Meta Block通常採用壓縮方式存儲,壓縮之後 可以大大減少網絡IO和磁盤IO,隨之而來的開銷當然是需要花費cpu 進行壓縮和解壓縮。

  • 目標Hfile的壓縮支持兩種方式:Gzip,Lzo。

2.HLog(WAL log)

這裏寫圖片描述

  • HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是“寫入時間”, sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number;

  • HLog Sequece File的Value是HBase的KeyValue對象,即對應HFile中的KeyValue;

五、-ROOT-與.META.表

  • -ROOT-表

表包含.META.表所在的區域列表,該表只會有一個HRegion,不會被切分;Zookeeper中記錄了-ROOT-表的location;

  • .META.表

表包含所有的用戶空間區域列表,以及RegionServer的服務器地址;

–>
因此查找數據的流程:
1. 通過Zookeeper找到-ROOT-的位置
2. 根據-ROOT-找到相關.META.對應的位置
3. .META.找到對應RegionServer的位置
4. 在RegionServer裏找到相關Region
5. 在Region中取得數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章