HBase體系架構
HBase是基於Hadoop的開源分散式資料庫。體系架構為master/slave架構。
HBase系統架構
Client
HBase Client使用HBase的RPC機制與HMaster和HRegionServer進行通訊,對於管理類操作,Client與HMaster進行RPC;對於資料讀寫類操作,Client與HRegionServer進行RPC
Zookeeper
Zookeeper Quorum中除了儲存了-ROOT-表的地址和HMaster的地址,HRegionServer也會把自己以Ephemeral方式註冊到Zookeeper中,使得HMaster可以隨時感知到各個HRegionServer的健康狀態。此外,Zookeeper也避免了HMaster的單點問題,見下文描述
HMaster
HMaster沒有單點問題,HBase中可以啟動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master執行,HMaster在功能上主要負責Table和Region的管理工作:
- 管理使用者對Table的增、刪、改、查操作
- 管理HRegionServer的負載均衡,調整Region分佈
- 在Region Split後,負責新Region的分配
- 在HRegionServer停機後,負責失效HRegionServer 上的Regions遷移
HRegionServer
HRegionServer主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料,是HBase中最核心的模組。
以下內容轉自csdn部落格:
HRegionServer包含多個HRegion,由WAL(HLog)、BlockCache、MemStore、HFile組成。
1.WAL即Write Ahead Log,在早期版本中稱為HLog,它是HDFS上的一個檔案,如其名字所表示的,所有寫操作都會先保證將資料寫入這個Log檔案後,才會真正更新MemStore,最後寫入HFile中。採用這種模式,可以保證HRegionServer宕機後,我們依然可以從該Log檔案中讀取資料,Replay所有的操作,而不至於資料丟失。這個Log檔案會定期Roll出新的檔案而刪除舊的檔案(那些已持久化到HFile中的Log可以刪除)。WAL檔案儲存在/hbase/WALs/${HRegionServer_Name}的目錄中(在0.94之前,儲存在/hbase/.logs/目錄中),一般一個HRegionServer只有一個WAL例項,也就是說一個HRegionServer的所有WAL寫都是序列的(就像log4j的日誌寫也是序列的),這當然會引起效能問題,因而在HBase 1.0之後,通過HBASE-5699實現了多個WAL並行寫(MultiWAL),該實現採用HDFS的多個管道寫,以單個HRegion為單位。關於WAL可以參考Wikipedia的Write-Ahead Logging。順便吐槽一句,英文版的維基百科竟然能毫無壓力的正常訪問了,這是某個GFW的疏忽還是以後的常態?
2.BlockCache是一個讀快取,即“引用區域性性”原理(也應用於CPU,分空間區域性性和時間區域性性,空間區域性性是指CPU在某一時刻需要某個資料,那麼有很大的概率在一下時刻它需要的資料在其附近;時間區域性性是指某個資料在被訪問過一次後,它有很大的概率在不久的將來會被再次的訪問),將資料預讀取到記憶體中,以提升讀的效能。HBase中提供兩種BlockCache的實現:預設on-heap LruBlockCache和BucketCache(通常是off-heap)。通常BucketCache的效能要差於LruBlockCache,然而由於GC的影響,LruBlockCache的延遲會變的不穩定,而BucketCache由於是自己管理BlockCache,而不需要GC,因而它的延遲通常比較穩定,這也是有些時候需要選用BucketCache的原因。這篇文章BlockCache101對on-heap和off-heap的BlockCache做了詳細的比較。
3.HRegion是一個Table中的一個Region在一個HRegionServer中的表達。一個Table可以有一個或多個Region,他們可以在一個相同的HRegionServer上,也可以分佈在不同的HRegionServer上,一個HRegionServer可以有多個HRegion,他們分別屬於不同的Table。HRegion由多個Store(HStore)構成,每個HStore對應了一個Table在這個HRegion中的一個Column Family,即每個Column Family就是一個集中的儲存單元,因而最好將具有相近IO特性的Column儲存在一個Column Family,以實現高效讀取(資料區域性性原理,可以提高快取的命中率)。HStore是HBase中儲存的核心,它實現了讀寫HDFS功能,一個HStore由一個MemStore 和0個或多個StoreFile組成。
● MemStore是一個寫快取(In Memory Sorted Buffer),所有資料的寫在完成WAL日誌寫後,會 寫入MemStore中,由MemStore根據一定的演算法將資料Flush到地層HDFS檔案中(HFile),通常每個HRegion中的每個 Column Family有一個自己的MemStore。
● HFile(StoreFile) 用於儲存HBase的資料(Cell/KeyValue)。在HFile中的資料是按RowKey、Column Family、Column排序,對相同的Cell(即這三個值都一樣),則按timestamp倒序排列。