HBase的伺服器體系架構
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中的對映。
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的單點問題,見下文描述
HBase Master伺服器
每臺HRegion伺服器都會和HMaster伺服器通訊,HMaster的主要任務就是要告訴每臺HRegion伺服器它要維護哪些HRegion。
當一臺新的HRegion伺服器登入到HMaster伺服器時,HMaster會告訴它先等待分配資料。而當一臺HRegion宕機時,HMaster會把它負責的HRegion標記為未分配,然後再把它們分配到其他HRegion伺服器中。
HRegion伺服器
HRegionServer主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料,是HBase中最核心的模組。
所有的資料庫資料一般是儲存在Hadoop分散式檔案系統上面的,使用者通過一系列HRegion伺服器來獲取這些資料,一臺機器上面一般只執行一個HRegion伺服器,且每一個區段的HRegion也只會被一個HRegion伺服器維護。
當用戶需要更新資料的時候,他會被分配到對應的HRegion伺服器上提交修改,這些修改顯示被寫到Hmemcache(記憶體中的快取,儲存最近更新的資料)快取和伺服器的Hlog(磁碟上面的記錄檔案,他記錄著所有的更新操作)檔案裡面。在操作寫入Hlog之後,commit()呼叫才會將其返回給客戶端。
在讀取資料的時候,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上。
HRegion
當表的大小超過設定值的是偶,HBase會自動地將表劃分為不同的區域,每個區域包含所有行的一個子集。對使用者來說,每個表是一堆資料的集合,靠主鍵來區分。從物理上來說,一張表被拆分成了多塊,每一塊就是一個HRegion。我們用表名+開始/結束主鍵來區分每一個HRegion,一個HRegion會儲存一個表裡某段連續的資料,從開始主鍵到結束主鍵,一張完整的表是儲存在多個HRegion上面的。
HBase儲存格式
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的儲存格式:

首先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部分沒有這麼複雜的結構,就是純粹的二進位制資料了。
HLogFile

上圖中示意了HLog檔案的結構,其實HLog檔案就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey物件,HLogKey中記錄了寫入資料的歸屬資訊,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是“寫入時間”,sequence number的起始值為0,或者是最近一次存入檔案系統中sequence number。
點選閱讀評論轉發加關注,後續還會有許多知識點,與大家分享,還可以私信我!
沒有你想不到的,只有你做不到的。