一、概述:最近,有一些工程師問我有關HBase的基本架構的問題,其實這個問題僅僅說架構是很是簡單,可是須要理解。在這裏,我以爲能夠用HDFS的架構做爲借鑑。(其實像Hadoop生態系統中的大部分組建的架構原理是相似,不信你往下看)node
二、介紹架構算法
(1)HDFS例子緩存
在這裏我以我比較熟悉的HDFS分佈式文件系統做爲一個例子來簡單說明一下。首先我對HDFS的架構作一個簡單的說明:架構
HDFS分佈式文件系統主要三個組建:NameNode和DataNode以及SecondaryNameNode。Namenode主要負責維護文件系統的元數據信息,DataNode則是負責實際存儲對應數據分片的節點。分佈式
它的主要工做原理是客戶端(client)經過發送一個請求(讀寫請求)時,首先會從NameNode中獲取對應的元數據信息,這個元數據信息包含了對應 請求的數據所在的位置、大小等信息。獲取到這些元數據信息後,client直接從對應的DataNode上執行對應的請求。這就是整個請求的響應過程。這 簡單吧。固然這裏並無講到SecondaryNameNode,它的做用主要是用來合併fsimage和edits文件來減小NameNode重啓的時 間,還能夠用來做爲數據的一個冷備份。oop
好了,HDFS分佈式文件系統的架構和原理簡單的理解就是上面的內容了。下面來看看HBase的架構和原理吧。性能
(2)HBase(正題)日誌
有了HDFS的基本原理對比以後,咱們用一樣的思惟看HBase:與HDFS同樣,HBase有Master和RegionServer(固然,這裏還 須要用到Zookeeper)。在這裏其實Zookeeper充當了相似NameNode的角色,Master的角色其實是維護整個列式存儲集羣的運行 (如分配或切分Region,檢查失效的RegionServer),RegionServer的角色固然跟Datanode的角色相似啦。blog
HBase的主要原理:客戶端(Client)發送對應的請求(增、刪、改、查),首先客戶端會從Zookeeper中獲取一個-ROOT-的表的元信 息(即-ROOT-的位置);第二步,客戶端就去讀取對應的-ROOT-表的信息,-ROOT-表中存儲了對應的Meta的元數據信息;第三步,客戶端知 道了Meta表元數據信息後就去讀取對應Meta表的信息,Meta表存儲了對應存放數據的RegionServer的位置信息等;第四步,就去獲取對應 RegionServer上的數據。排序
HBase中比較重要的RegionServer,它上面包含的內容有:WAL(HLog)、BlockCache、Region、MemStore、StoreFile(HFile新版本的改進),下面主要講一下這些個名詞的原理和含義:
a) WAL:Write Ahead Log即提早寫日誌(Log),根據字面意思就知道,在寫操做的時候,就是先要寫入到該日誌文件中。全部寫操做都會先保證將數據寫入這個Log文件後,才 會真正更新MemStore,最後寫入HFile中。這樣能夠在RegionServer掛掉後,經過WAL來恢復數據,從而避免數據的丟失。通常一個 RegionServer只有一個WAL實例,也就是說一個RegionServer的全部WAL寫都是串行的,你可能會以爲這會有性能問題,於是在 HBase 1.0以後,經過HBASE-5699實現了多個WAL並行寫(MultiWAL),該實現採用HDFS的多個管道寫,以單個HRegion爲單位。
b) BlockCache:它是一個讀緩存,即「引用局部性」原理。
c) Region:它是一個Table在一個RegionServer中的存儲單元,也是分佈式存 儲的最小單元。一個Table能夠有一個或多個Region,他們能夠在一個相同的RegionServer上,也能夠分佈在不一樣的 RegionServer上,一個RegionServer能夠有多個Region,他們分別屬於不一樣的Table。Region由多個Store構成, 每一個Store對應了一個Table在這個Region中的一個Column Family,即每一個Column Family就是一個集中的存儲單元,於是最好將具備相近IO特性的Column存儲在一個Column Family,以實現高效讀取(數據局部性原理,能夠提升緩存的命中率)。Store是HBase中存儲的核心,它實現了讀寫HDFS功能,一個 Store由一個MemStore 和0個或多個StoreFile組成。
d) MemStore是一個寫緩存(In Memory Sorted Buffer),全部數據的寫在完成WAL日誌寫後,再寫入MemStore中,由MemStore根據必定的算法將數據Flush到地層HDFS文件中 (HFile),一般每一個HRegion中的每一個 Column Family有一個本身的MemStore。
e) HFile(StoreFile) 用於存儲HBase的數據(Cell/KeyValue)。在HFile中的數據是按RowKey、Column Family、Column排序,對相同的Cell(即這三個值都同樣),則按timestamp倒序排列。