HBase的服務器體系結構遵循簡單的主從服務器架構,它由HRegion服務器(HRegion Server)羣和HBase Master服務器(HBase Master Server)構成。HBase Master服務器負責管理全部的HRegion服務器,而HBase中全部的服務器都是經過ZooKeeper來進行協調,並處理HBase服務器運行期間可能遇到的錯誤。HBase Master Server自己不存儲HBase中的任何數據,HBase邏輯上的表可能會被劃分爲多個HRegion,而後存儲到HRegion Server羣中,HBase Master Server中存儲的是從數據到HRegion Server中的映射。html
HBase Client使用HBase的RPC機制與HMaster和HRegionServer進行通訊,對於管理類操做,Client與HMaster進行RPC;對於數據讀寫類操做,Client與HRegionServer進行RPC數據庫
Zookeeper Quorum中除了存儲了-ROOT-表的地址和HMaster的地址,HRegionServer也會把本身以Ephemeral方式註冊到Zookeeper中,使得HMaster能夠隨時感知到各個HRegionServer的健康狀態。此外,Zookeeper也避免了HMaster的單點問題,見下文描述數組
每臺HRegion服務器都會和HMaster服務器通訊,HMaster的主要任務就是要告訴每臺HRegion服務器它要維護哪些HRegion。緩存
當一臺新的HRegion服務器登陸到HMaster服務器時,HMaster會告訴它先等待分配數據。而當一臺HRegion死機時,HMaster會把它負責的HRegion標記爲未分配,而後再把它們分配到其餘HRegion服務器中。服務器
HRegionServer主要負責響應用戶I/O請求,向HDFS文件系統中讀寫數據,是HBase中最核心的模塊。 架構
全部的數據庫數據通常是保存在Hadoop分佈式文件系統上面的,用戶經過一系列HRegion服務器來獲取這些數據,一臺機器上面通常只運行一個HRegion服務器,且每個區段的HRegion也只會被一個HRegion服務器維護。分佈式
當用戶須要更新數據的時候,他會被分配到對應的HRegion服務器上提交修改,這些修改顯示被寫到Hmemcache(內存中的緩存,保存最近更新的數據)緩存和服務器的Hlog(磁盤上面的記錄文件,他記錄着全部的更新操做)文件裏面。在操做寫入Hlog以後,commit()調用纔會將其返回給客戶端。oop
在讀取數據的時候,HRegion服務器會先訪問Hmemcache緩存,若是緩存裏沒有改數據,纔會回到Hstores磁盤上面尋找,每個列族都會有一個HStore集合,每個HStore集合包含不少HstoreFile文件,以下圖:性能
HStore存儲是HBase存儲的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用戶寫入的數據首先會放入MemStore,當MemStore滿了之後會Flush成一個StoreFile(底層實現是HFile),當StoreFile文件數量增加到必定閾值,會觸發Compact合併操做,將多個StoreFiles合併成一個StoreFile,合併過程當中會進行版本合併和數據刪除,所以能夠看出HBase其實只有增長數據,全部的更新和刪除操做都是在後續的compact過程當中進行的,這使得用戶的寫操做只要進入內存中就能夠當即返回,保證了HBase I/O的高性能。當StoreFiles Compact後,會逐步造成愈來愈大的StoreFile,當單個StoreFile大小超過必定閾值後,會觸發Split操做,同時把當前Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster分配到相應的HRegionServer上,使得原先1個Region的壓力得以分流到2個Region上。spa
當表的大小超過設置值的是偶,HBase會自動地將表劃分爲不一樣的區域,每一個區域包含全部行的一個子集。對用戶來講,每一個表是一堆數據的集合,靠主鍵來區分。從物理上來講,一張表被拆分紅了多塊,每一塊就是一個HRegion。咱們用表名+開始/結束主鍵來區分每個HRegion,一個HRegion會保存一個表裏某段連續的數據,從開始主鍵到結束主鍵,一張完整的表是保存在多個HRegion上面的。
HBase中的全部數據文件都存儲在Hadoop HDFS文件系統上,主要包括上述提出的兩種文件類型:
1. HFile, HBase中KeyValue數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile作了輕量級包裝,即StoreFile底層就是HFile
2. HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File
HFile已經介紹了,接下來就是介紹HLog File。
在分佈式系統環境中,沒法避免系統出錯或者宕機,所以一旦HRegionServer意外退出,MemStore中的內存數據將會丟失,這就須要引入HLog了。每一個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操做寫入MemStore的同時,也會寫一份數據到HLog文件中(HLog文件格式見後續),HLog文件按期會滾動出新的,並刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止後,HMaster會經過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不一樣Region的Log數據進行拆分,分別放到相應region的目錄下,而後再將失效的region從新分配,領取 到這些region的HRegionServer在Load Region的過程當中,會發現有歷史HLog須要處理,所以會Replay HLog中的數據到MemStore中,而後flush到StoreFiles,完成數據恢復。
下圖是HFile的存儲格式:
首先HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer中有指針指向其餘數據塊的起始點。File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index塊記錄了每一個Data塊和Meta塊的起始點。
Data Block是HBase I/O的基本單元,爲了提升效率,HRegionServer中有基於LRU的Block Cache機制。每一個Data塊的大小能夠在建立一個Table的時候經過參數指定,大號的Block有利於順序Scan,小號Block利於隨機查詢。每一個Data塊除了開頭的Magic之外就是一個個KeyValue對拼接而成, Magic內容就是一些隨機數字,目的是防止數據損壞。後面會詳細介紹每一個KeyValue對的內部構造。
HFile裏面的每一個KeyValue對就是一個簡單的byte數組。可是這個byte數組裏麪包含了不少項,而且有固定的結構。咱們來看看裏面的具體結構:
開始是兩個固定長度的數值,分別表示Key的長度和Value的長度。緊接着是Key,開始是固定長度的數值,表示RowKey的長度,緊接着是RowKey,而後是固定長度的數值,表示Family的長度,而後是Family,接着是Qualifier,而後是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這麼複雜的結構,就是純粹的二進制數據了。
上圖中示意了HLog文件的結構,其實HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是「寫入時間」,sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number。
HLog Sequece File的Value是HBase的KeyValue對象,即對應HFile中的KeyValue,可參見上文描述。
參考 http://www.cnblogs.com/NicholasLee/archive/2012/09/13/2683223.html