HBase組成架構


HBase組成

HBase主要有以下四大組件:Zookeeper(高可用、元數據的統一入口地址、管理HRegionServer)、HMaster(管理HRegionserver、維護集羣的元數據信息和負載均衡)、HRegionServer(真正“幹活”的節點)、HDFS(多副本底層數據存儲服務)

Zookeeper

  • HBase通過Zookeeper來做HA高可用,Zk保存HMaster的地址和backup-master地址,ZK能保證集羣中只有1個master在運行,如果master異常,會通過競爭機制選舉新的master。
  • Zookeeper管理HRegionServer,監控RegionServer的狀態、當RegionSevrer有異常的時候,通過回調的形式通知Master RegionServer上下限的信息。
  • Zookeeper存儲元數據的統一入口地址(znode:/hbase/meta-region-server),這就說明zk很重要,把zk關掉你就不能讀取數據了。因爲你讀取數據所需要的元數據表在zk上。

HMaster

  • 管理HRegionServer:爲RegionServer分配Region,當RegionSever失效的時候,協調對應Hlog的拆分,將失效的Region分配到正常的RegionServer上。
  • 維護集羣的元數據信息,維護集羣負載均衡。

HRegionServer

  • 直接對接來自客戶端的讀寫請求,是真正的“幹活”的節點,比如表的增刪改查數據,和HDFS交互,存取數據。
  • 管理Master爲其分配的Region。
  • 負責和底層HDFS的交互,存儲數據到HDFS。
  • 負責Region變大以後的拆分。
  • 負責Storefile的合併工作。

HDFS

  • HDFS爲HBase提供底層數據存儲服務,元數據和表數據都存儲在HDFS中,同時爲HBase提供高可用(Hlog存儲在HDFS)的支持。
  • HDFS數據多副本機制能保證HBase的高可靠性。

HBase架構

在這裏插入圖片描述

  • 首先HBase中的Table是會分成Region的,比如,user表中有10條記錄,那麼可能前5條在一個Region中,後5條在另一個Region裏,類似於分區的概念,分佈式系統中到處可見分區,下篇會具體講解HBASE中的Region。
  • HMaster會爲HRegionServer分配Region,分配後Region落地到HRegionServer上,即圖中的HRegion。
  • HRegionServer除了由HRegion組成外,還有一個很重要的東西:Hlog。HBase所有涉及到數據的變更都會寫到HLog中。它的作用就是保證數據安全。當RegionServer出現問題的時候,能跟進Hlog來做數據恢復。
  • HRegion由store(memstore,storefile(hfile))組成。寫文件時並不直接寫入HDFS,而是先停留在MemStore緩衝區,達到一定的量再Flush到StoreFile中,StoreFile是存儲HFile的地方,而HFile是真正存儲數據的文件。

現在具體來講解這些組件:

MemStore

MemStore是內存緩衝區,HBase寫入數據的時候會先停留在MemStore中,達到一定的時候纔會刷盤到StoreFile中。
爲什麼要有MemStore的存在呢?

  1. 不需要立即寫入HDFS,先寫內存,內存滿了再寫HDFS。可以提高寫的性能
  2. 可以進行排序。HBase寫入到HDFS上的數據是需要按照RowKey進行排序的,而HBase是隨機的讀寫,因此HBase通過MemStore在持久化到HDFS之前完成排序,然後再快速的順序寫入HDFS。主要原理是LSM。
  3. 優化數據的存儲,比如一個記錄添加之後馬上被刪除了,在Flush的時候就可以直接不把這個數據寫到HDFS中。

爲什麼要達到一定的時候再刷盤?
那是爲了提高HBase的寫入性能,所以當寫請求寫入MemStore後,不會立即刷盤。那麼哪些場景會觸發刷盤的操作呢?總結如下:

  • Region級別的觸發刷寫
    hbase.hregion.memstore.flush.size
    當MemStore的大小達到hbase.hregion.memstore.flush.size大小的時候會觸發刷盤,默認128M。
  • 全局內存控制
    hbase.regionserver.global.memstore.size //在新的更新被阻止並強制flush之前,RegionServer的全部memstore最大值(默認爲堆內存的40%,直到RegionServer中的所有 memstore 的大小達到 hbase.regionserver.global.memstore.size.lower.limit,更新將被阻止並強制flush)
    hbase.regionserver.global.memstore.size.lower.limit //強制刷新之前,RegionServer中所有memstore的最大大小(默認值爲:hbase.regionserver.global.memstore.size 的95%),當由於內存限制而導致更新被阻塞時,系統會以儘可能小的刷新量刷新數據)
    舉例,比如你配置的hbase.regionserver.global.memstore.size.lower.limit=0.95 hbase.regionserver.global.memstore.size=0.4,堆內存總共是64G,那麼
    觸發刷寫的閾值是:640.40.95=24.32
    觸發阻塞的閾值是:64*0.4=25.6
  • HLog引發的刷盤
    HLog中包含了所有已經寫入Memstore但還未Flush到HFile的更改。在Memstore中數據還沒有持久化,當RegionSever宕掉的時候,可以使用HLog恢復數據。可是當HLog很大的時候,恢復的時候就需要很長的時間。因此,對HLog的大小也有一些限制,當達到這些限制的時候,就會觸發Memstore的flush。Memstore flush會使HLog減少,因爲數據持久化之後(寫入到HFile),就沒有必要在HLog中再保存這些修改了。有兩個屬性可以配置:
    hbase.regionserver.hlog.blocksize//HLog塊大小
    hbase.regionserver.maxlogs//HLog的最大個數
    這兩個相乘就決定了hlog的最大大小。

HLog

HLog是HBase實現WAL(Write ahead log)方式產生的日誌信息,內部是一個簡單的順序日誌。每個RegionServer對應1個HLog(備註:1.x版本的可以開啓MultiWAL功能,允許多個HLog),因此是多個Region對應同一個HLog。所有對於該RegionServer的寫入都被記錄到HLog中。HLog功能就是爲了保證數據安全。當RegionServer出現問題的時候,能跟進HLog來做數據恢復
數據到達Region是先寫入WAL然後再被加載到MemStore中的。
HLog持久化在HDFS之上, HLog存儲位置查看:
在這裏插入圖片描述
我們看到,有一個oldWAL目錄,這是啥?剛剛提到,爲了避免恢復的時候因爲HLog過大導致的效率低下,HLog過大時就會觸發強制刷盤操作。對於已經刷盤的數據,其對應的HLog會過期,過期的HLog會被移動到oldWAL。
HLog架構圖:
在這裏插入圖片描述
由圖可知,HLog=HLogkey+WALEdit。HLogkey=sequenceid+timestamp+cluster ids+regionname+tablename等組成,WALEdit是由一系列的KeyValue組成。
其中sequenceid非常重要,sequenceid是一個自增序列號,region的數據恢復和HLog過期清除都要依賴它。
HLog的過期依賴於對sequenceid的判斷。HBase會將HLog的sequenceid和HFile最大的sequenceid(刷新到的最新位置)進行比較,如果該HLog文件中的sequenceid比刷新的最新位置的sequenceid都要小,那麼這個HLog就過期了,過期了以後,對應HLog會被移動到oldWAL目錄。
當RegionServer出現故障的時候,需要對HLog進行回放來恢復數據。回放的時候會讀取HFile的sequenceid和HLog中的sequenceid進行比較,小於sequenceid的就直接忽略,大於等於的就進行重做。回放完成後,就完成了數據的恢復工作。舉例,HFile中sequenceid=10,HLog中sequenceid=15,1-10的在HFile中已經持久化了就不需要恢復了,那麼就是恢復11-15的數據。

如何打開和關閉WAL
默認是打開的。Mutation.setDurability(Durability.SKIP_WAL)可以關閉它。這樣可以讓數據操作快一點,但是最好不要這麼做,因爲當服務器宕機,數據會丟失。
WAL滾動
WAL是一個環狀的滾動日誌結構,這樣可以保證寫入效果最高並且保證空間不會持續變大。
觸發滾動的條件:

  1. WAL的檢查間隔:hbase.regionserver.logroll.period。默認一小時,上面說了,通過sequenceid,把當前WAL的操作和HDFS對比,看哪些操作已經被持久化了。就被移動到oldWAL目錄中。
  2. 當WAL文件所在的塊block快要滿了
  3. 當WAL所佔的空間大於或者等於某個閾值(hbase.regionserver.hlog.blocksize乘hbase.regionserver.logroll.multiplier)blocksize是存儲系統的塊大小,如果你是基於HDFS只要設定爲HDFS的塊大小即可,multiplier是一個百分比,默認0.95,即WAL所佔的空間大於或者等於95%的塊大小,就被歸到oldWAL文件中。

oldWAL何時刪除
oldWAL什麼時候被徹底刪除呢?Master會定期的去清理這個文件,如果當這個WAL不需要作爲用來恢復數據的備份,那麼就可以刪除。兩種情況下,可能會引用WAL文件,此時不能刪除

  1. TTL進程:該進程會保障WAL文件存活到hbase.master.logcleaner.ttl定義的超時時間爲止,默認10分鐘。
  2. 備份機制:如果你開啓了備份機制replication(把一個集羣的數據實時備份到裏另一個集羣),那麼HBASE要保障備份集羣已經完全不需要這個文件了。如果你手頭就一個集羣,那麼就不需要考慮這個文件了

StoreFile和HFile

StoreFile是對HFile進行了輕量級的包裝。HFile是實際數據的存儲。
HFile包括:

  • Data:數據塊
  • Meta:元數據塊
  • Fileinfo:文件信息
  • DataIndex:Data塊索引信息
  • MetaIndex:Meta塊索引信息
  • Trailer:存儲了Fileinfo Dataindex Metaindex的偏移值

本文轉載至:http://bigdata-star.com/archives/1175

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