3 HBase架构
文章目錄
- 架構圖
- 架構解析
- Client
- Zookeeper
- HMaster
- HRegionServer
- Store
- Storefile
- MemStore
- Hlog
架構圖
HBase有三個主要組成部分:客戶端庫,主服務器和區域服務器。區域服務器可以按要求添加或刪降架構細解
架構解析
Client
- 客戶端負責發送請求到數據庫
- 客戶端連接的方式有很多種
- hbase shell
- 類JDBC
- 發送的請求主要包括
- DDL:數據庫定義語言(表的建立,刪除,添加刪除列族,控制版本)。
- DML:數據庫操作語言(增刪改)
- DQL:數據庫查詢語言(查詢–全表掃描–基于主鍵–基于過濾器)
- client維護著一些cache來加快對hbase的訪問,比如regione的位置信息。
Zookeeper
- 保證任何時候,集群中只有一個master
- 存貯所有Region的尋址入口,存儲所有的的元數據信息。
- 實時監控Region Server的狀態,將Region server的上線和下線信息實時通知給Master
- 存儲Hbase的schema,包括有哪些table,每個table有哪些column family
HMaster
- HBase集群的主節點,HMastert也可以實現高可用(active–standby)。
- 通過Zookeeper來維護主副節點的切換
- 為Region server分配region
- 負責region server的負載均衡
- 管理用戶對table的結構創建,刪除,修改(ddl)操作。
- 表的元數據信息–》Zookeeper上面
- 表的數據–》HRegionServer上
- 當HRegionServer下線的時候,HMaster會將當前HRegionServer上的Region轉移到其他的HRegionServer
HRegionServer
- Region server屬于HBase具體數據的管理者
- Region server維護Master分配給它的region,處理對這些region的IO請求
- 會實時的和Haster保持心跳,匯報當前節點的信息
- 當接收到Hmaster命令創建表的時候,分配一個Region對應一張表
- Region server負責切分在運行過程中變得過大的region
- 當客戶端發送DML和DQL操作的時候,HRegionServer負責和客戶端建立連接
- 當意外關閉的時候,當前節點的Region會被其他HRegionServer管理,一個節點只有一個HRegionServer
HRegion
- HRegion是HBase中分布式存儲和負載均衡的最小單元。最小單元就表示不同的HRegion可以分布在不同的HRegion server上。
- HBase自動把表水平劃分成多個區域(region),每個region會保存一個表里面某段連續的數據
- 每個表一開始只有一個region,一個Region只屬于一張表,隨著數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region(裂變)
- hbase.hregion.max.filesize 通過設置這個參數可以設置閾值大小
- 當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表被保存在多個Regionserver上。一張表后期有可能有多個Region
- 因為隨著時間的推移,Region會越來越大
- Region達到閾值10G的時候會被平分(邏輯上平分,盡量保證數據的完整性)。
- 會將切分后的其中一個Region轉移到其他的HRegionServer上管理
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Bu9Dr2FS-1627040857644)(https://cdn.jsdelivr.net/gh/ShaneCheng0202/image-hosting@master/hbase/region_change_process.3fet67vbjc60.png)]
- 為了防止前期數據的處理都集中在一個HRegionServer,我們可以根據自己的業務進行預分區
Store
-
HRegion是表獲取和分布的基本元素,由一個或者多個Store組成,每個store保存一個columns family
-
每個Store又由1個memStore和0或多個StoreFile組成。
- Table (HBase table)Region (Regions for the table) Store (Store per ColumnFamily for each Region for the table)memStore (MemStore for each Store for each Region for the table)StoreFile (StoreFile for each Store for each Region for the table)Block (Blocks within a StoreFile within a Store for each Region)
-
HFile是Hbase在HDFS中存儲數據的格式,它包含多層的索引,這樣在Hbase檢索數據的時候就不用完全的加載整個文件。
-
索引的大小(keys的大小,數據量的大小影響block的大小,在大數據集的情況下,block的大小設置為每個RegionServer 1GB也是常見的。
Storefile
- Data Blocks段-保存表中的數據,這部分可以被壓縮
- Meta Blocks 段(可選的)-保存用戶自定義的kv對,可以被壓縮。
- File Info段-Hfile的元信息,不被壓縮,用戶也可以在這一部分添加自己的元信息。
- Data Block Ilnex段-Data Block的索引。每條索引的key是被索引的block的第一條記錄的key
- Meta Block Index段(可選的)-Meta Block的索引。
- Trailer-這一段是定長的。
- 保存了每一段的偏移量,讀取一個HFile時,會首先讀取Trailer
- Trailer保存了每個段的起始位置(段的Magic Number用來做安全check)
- 然后,DataBlock Index會被讀取到內存中,這樣,當檢索某個key時,不需要掃描整個HFile,而只需從內存中找到key所在的block
- 通過一次磁盤io將整個block讀取到內存中,再找到需要的key。DataBlock Index采用LRU機制淘汰。
MemStore
-
HFile中并沒有任何Block,數據首先存在于MemStore中。Flush發生時,創建HFile Writer
-
當操作數據的時候,第一個空的Data Block初始化,初始化后的Data Block中為Header部分預留了空間,
Header部分用來存放一個Data Block的元數據信息。
-
位于MemStore中的KeyValues被一個個append到位于內存中的第一個Data Block中:
- 注:如果配置了Data Block Encoding,則會在Append Keyalue的時候進行同步編碼,編碼后的數據不再是單純的Keyvalue模式。
- Data Block Encoding是HBase為了降低KeyValue結構性膨脹而提供的內部編碼機制。
Hlog
-
Write After Log做任何操作之前先寫日志
-
HLog文件就是一個普通的Hadoop Sequence File (sequenceFile文件是Hadoop用來存儲二進制形式的[Key,Value]對而設計的一種平面文件)
- sequeceFile的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息工除了table和region名字外,同時還包括sequence number和timestamp
- timestamp是”寫入時間”,
- sequence number的起始值為0,或者是最近一次存入文件系統中sequence number
- SequeceFile的value是HBase的KeyValue對象,即對應HFile中的KeyValue。
-
日志直接存放到HDFS上,寫入的數據就是
- 當前的日志序列號(Sequence)
- 本次的操作
-
當memStore達到閾值的時候開始寫出到文件之后,會在日志中對應的位置標識一個檢查點
-
一個HRegionServer只有一個Log文檔
-
MasterProcWAL: HMaster記錄管理操作,比如解決沖突的服務器,表創建和其它DDLs等操作到它的WAL文件中,這個WALs存儲在MasterProcWALs目錄下,它不像RegionServer的WALs,HMaster的WAL也支持彈性操作,就是如果Master服務器掛了,其它的Master接管的時候繼續操作這個文件。
注:WAL(Write Ahead Log)預寫日志,是數據庫系統中常見的一種手段,用于保證數據操作的原子性和持久性。
-
WAL記錄所有的Hbase數據改變,如果一個RegionServer在MemStore進行FLush的時候掛掉了,WAL可以保證數據的改變被應用到。如果寫WAL失敗了,那么修改數據的完整操作就是失敗的。
- 通常情況,每個RegionServer只有一個WAL實例。在2.0之前,WAL的實現叫做HLogo
- WAL位于/hbase/WALs/目錄下
- MultiWAL:如果每個RegionServer只有一個WAL,由于HDFs必須是連續的,導致必須寫WAL連續的,然后出現性能問題。MultiWAL可以讓RegionServer同時寫多個WAL并行的,通過HDFS底層的多管道,最終提升總的吞吐量,但是不會提升單個Region的吞吐量。
- 由于HDFS必須是連續的,導致必須寫WAL連續的,然后出現性能問題。MultiWAL可以讓RegionServer同時寫多個WAL并行的,通過HDFS底層的多管道,最終提升總的吞吐量,但是不會提升單個Region的吞吐量。
總結
- 上一篇: 2 HBase数据模型
- 下一篇: 4 HBase搭建