Hbase物理儲存
物理模型
- 每個column family儲存在HDFS上的一個單獨檔案中,空值不會被儲存。
- Key 和 Version number在每個column family中均有一份;
- HBase為每個值維護了多級索引,即:<key, columnfamily, columnname, timestamp>;
- 表在行的方向上分割為多個Region;
- Region是Hbase中分散式儲存和負載均衡的最小單元,不同Region分佈到不同RegionServer上。
- Region按大小分割的,隨著資料增多,Region不斷增大,當增大到一個閥值的時候,Region就會分成兩個新的Region;
- Region雖然是分散式儲存的最小單元,但並不是儲存的最小單元。每個Region包含著多個Store物件。每個Store包含一個MemStore或若干StoreFile,StoreFile包含一個或多個HFile。MemStore存放在記憶體中,StoreFile儲存在HDFS上。
Region的數量設計
這裡需要提一下,每個regionsServer的region數量不要太多,以免造成RS不響應或其它問題。Region的數量由memstore記憶體使用情況來決定的,
每個region都有至少一個memstore,這個儲存的值可分配,一般來說都是128M-256M範圍,每個memstore佔堆記憶體的預設值為40%
以下是region的計算公式。
MemStore
將修改資訊快取在記憶體當中
資訊格式為Cell/KeyValue
當flush觸發時,MemStore會生成快照儲存起來,新的MemStore會繼續接收修改資訊,指導flush完成之後快照會被刪除
當一個MemStore flush發生時,屬於同一個region的memStore會一起flush
MemStore Flush刷入觸發機制
MemStore的大小達到單個MemStore閥值
hbase.hregion.memstore.flush.size
RegionServer中所有MemStore的使用率超過RS中MemStore上限值,該Server上所有MemStore會執行flush直到完成或者小於RS中MemStore安全值
hbase.regionserver.global.memstore.upperLimit
或者
hbase.regionserver.global.memstore.size
RegionServer中WAL超過WAL閥值
hbase.regionserver.max.logs
ROOT表和META表
HBase的所有Region元資料被儲存在.META.表中,隨著Region的增多,.META.表中的資料也會增大,並分裂成多個新的Region。為了定位.META.表中各個Region的位置,把.META.表中所有Region的元資料儲存在-ROOT-表中,最後由Zookeeper記錄-ROOT-表的位置資訊。所有客戶端訪問使用者資料前,需要首先訪問Zookeeper獲得-ROOT-的位置,然後訪問-ROOT-表獲得.META.表的位置,最後根據.META.表中的資訊確定使用者資料存放的位置,如下圖所示。
-ROOT-表永遠不會被分割,它只有一個Region,這樣可以保證最多隻需要三次跳轉就可以定位任意一個Region。為了加快訪問速度,.META.表的所有Region全部儲存在記憶體中。客戶端會將查詢過的位置資訊快取起來,且快取不會主動失效。如果客戶端根據快取資訊還訪問不到資料,則詢問相關.META.表的Region伺服器,試圖獲取資料的位置,如果還是失敗,則詢問-ROOT-表相關的.META.表在哪裡。最後,如果前面的資訊全部失效,則通過ZooKeeper重新定位Region的資訊。所以如果客戶端上的快取全部是失效,則需要進行6次網路來回,才能定位到正確的Region。
一個完整分散式的HBase的組成示意圖如下
Hbase高可用
Write-Ahead-Log(WAL)保障資料高可用
由於HBase的資料是先寫入記憶體,資料累計達到記憶體閥值時才往磁碟中flush資料,所以,如果在資料還沒有flush進硬碟時,regionserver down掉了,記憶體中的資料將丟失。要想解決這個場景的問題就需要用到WAL(Write-Ahead-Log),tableDesc.setDurability(Durability. SYNC_WAL ) 就是設定寫WAL日誌的級別,該方式安全性較高,但無疑會一定程度影響效能,請根據具體場景選擇使用;
我們理解下HLog的作用。HBase中的HLog機制是WAL的一種實現,而WAL(一般翻譯為預寫日誌)是事務機制中常見的一致性的實現方式。每個RegionServer中都會有一個HLog的例項,RegionServer會將更新操作(如 Put,Delete)先記錄到 WAL(也就是HLog)中,然後將其寫入到Store的MemStore,最終MemStore會將資料寫入到持久化的HFile中(MemStore 到達配置的記憶體閥值)。這樣就保證了HBase的寫的可靠性。如果沒有 WAL,當RegionServer宕掉的時候,MemStore 還沒有寫入到HFile,或者StoreFile還沒有儲存,資料就會丟失。或許有的讀者會擔心HFile本身會不會丟失,這是由 HDFS 來保證的。在HDFS中的資料預設會有3份。因此這裡並不考慮 HFile 本身的可靠性。
HFile由很多個數據塊(Block)組成,並且有一個固定的結尾塊。其中的資料塊是由一個Header和多個Key-Value的鍵值對組成。在結尾的資料塊中包含了資料相關的索引資訊,系統也是通過結尾的索引資訊找到HFile中的資料。
元件高可用
- Master容錯:Zookeeper重新選擇一個新的Master。如果無Master過程中,資料讀取仍照常進行,但是,region切分、負載均衡等無法進行;
- RegionServer容錯:定時向Zookeeper彙報心跳,如果一旦時間內未出現心跳,Master將該RegionServer上的Region重新分配到其他RegionServer上,失效伺服器上“預寫”日誌由主伺服器進行分割並派送給新的RegionServer;
- Zookeeper容錯:Zookeeper是一個可靠地服務,一般配置3或5個Zookeeper例項。