歡迎光臨
每天分享高質量文章

HBase 的架構及設計

(點選上方公眾號,可快速關註)


來源:liweisnake ,

blog.csdn.net/liweisnake/article/details/78086262

hbase是強一致性的海量資料庫,無論是讀寫效能,或是資料容量,還是一致性方面,hbase都有非常優秀的表現。

本文從架構方面探討hbase的主要設計,從而在需要hbase的場合能夠更好的設計和判斷。

首先,先來看看hbase的整體架構。除了DFS元件,hbase的基本元件圖實際上就是Zookeeper,HMaster,RegionServer。

其中,RegionServer作為資料的實際存取伺服器,主要負責資料的最終存取,一般情況都是多臺;

RegionServer根據不同的row key劃分為許多region,每個region按順序存放從startKey到endKey的資料。每個RegionServer有下麵這些元件:

  • 一個WAL: write ahead log. 聽名知其意,該檔案是落庫前先寫的日誌檔案,它最主要的作用是恢復資料用,類似於mysql的binlog。儲存在HDFS中;

  • 一個BlockCache: regionServer的讀快取。儲存使用最頻繁的資料,使用LRU演演算法換出不需要的資料;

  • 多個Region: 每個region包含多個store,每個CF擁有一個store;

  • store: 每個store包含多個storeFile和一個memstore;

  • Memstore: region的寫快取。儲存還未寫入HFile的資料,寫入資料前會先做排序,每個region每個CF都會擁有一個Memstore,這就是為什麼CF不能建太多的原因;

  • storeFile: 真正儲存keyvalue資料的檔案,其儲存的檔案是排序過的。一個storeFile對應一個HFile。儲存在HDFS中

HFile分為資料塊,索引塊,bloom過濾器以及trailer。

  • Trailer主要記錄了HFile的基本資訊,各個部分的偏移和地址資訊。

  • Data block主要儲存使用者的key-value資料.

  • Bloom filter主要用來快速定位檔案是否不在資料塊。

比較容易混淆的是zookeeper和hmaster。

Zookeeper負責保持多臺Hmaster中只有一臺是活躍的;儲存Hbase的schema,table,CF等元資訊;儲存所有的region入口;監控regionServer的狀態,並將該資訊通知hmaster。可以看出來,zookeeper幾乎是負責整個叢集的關鍵資訊存取以及關鍵狀態監控。如果zookeeper掛了,那麼整個hbase叢集幾乎就是不可用的狀態。

Hmaster則是負責對table元資料的管理;對HRegion的負載均衡,調整HRegion的佈局,比如分裂和合併;包括恢復資料的遷移等。Hmaster相當於對RegionServer的後臺管理,對於一些定製的管理行為,zookeeper不可能幫你完成,於是乎才有了hmaster。如果hmaster掛了,除了不能對table進行管理配置,不能擴充套件region,並不會影響整體服務的可用性。

接下來我們來關註一些關鍵流程。

客戶端首次讀寫的流程:

1. 客戶端首先從zookeeper中得到META table的位置,根據META table的儲存位置得到具體的RegionServer是哪臺

2. 詢問具體的RegionServer

寫流程:

1. 首先寫入WAL日誌,以防crash。

2. 緊接著寫入Memstore,即寫快取。由於是記憶體寫入,速度較快。

3. 立馬傳回客戶端表示寫入完畢。

4. 當Memstore滿時,從Memstore掃清到HFile,磁碟的順序寫速度非常快,並記錄下最後一次最高的sequence號。這樣系統能知道哪些記錄已經持久化,哪些沒有。

讀流程:


1. 首先到讀快取BlockCache中查詢可能被快取的資料

2. 如果未找到,到寫快取查詢已提交但是未落HFile的資料

3. 如果還未找到, 到HFile中繼續查詢資料

資料緊湊:

資料從memStore掃清到HFile時,為了保持簡單,都是每個memStore放一個HFile,這會帶來大量小HFile檔案,使得查詢時效率相對較低,於是,採用資料緊湊的方式將多個小檔案壓縮為幾個大檔案。其中,minor compaction是自動將相關的小檔案做一些適當的緊湊,但不徹底;而major compaction則是放在午夜跑的定時任務,將檔案做最大化的緊湊。

資料恢復流程:

當RegionServer掛了,zookeeper很快就能檢測到,於是將其下的region狀態設定為不可用。Hmaster隨即開始恢復的流程。

1. HFile本身有2個備份,而且有專門的HDFS來管理其下的檔案。因此對HFile來說並不需要恢復。

2. Hmaster重置region到新的regionServer

3. 之前在MemStore中丟失的資料,透過WAL分裂先將WAL按照region切分。切分的原因是WAL並不區分region,而是所有region的log都寫入同一個WAL。

4. 根據WAL回放並恢復資料。回放的過程實際上先進MemStore,再flush到HFile

看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,看技術乾貨

贊(0)

分享創造快樂