所有的數據庫數據一般是保存在Hadoop分布式系統上面的,用戶通過一系列HRegion服務器獲取這些數據。一台機器上一般只運行一個HRegion服務器,而且每一分區段的HRegion也只會被一個HRegion服務器維護。

HRegion服務器包含兩大部分:HLog部分和HRegion部分。
HRegion服務器在它這里面,又相當於是個小組長。
其中HLog用來存儲數據日志,采用的是先寫日志的方式。HRegion部分由很多的HRegion組成,存儲的是實際的數據。每一個HRegion又由很多的Store組成,每一個Store存儲的實際上是一個列簇(ColumnFamily)下的數據。此外,在每一個HStore(又名Store)中有包含一塊MemStore。MemStore駐留在內存中,數據到來時首先更新到MemStore中,當到達闊值之后再更新到對應的StoreFile(又名HFile)中。每一個Store包含了多個StoreFile,StoreFile負責的是實際數據存儲,為HBase中最小的存儲單元。
HBase中不涉及數據的直接刪除和更新操作,所有的數據均通過追加的方式進行更新。數據的刪除和更新在HBase合並的時候進行。當Store中StoreFile的數量超過設定的闊值時將觸發合並操作,該合並操作把多個StoreFile文件合並成一個StoreFile。
當用戶需要更新數據的時候,數據會被分配到對應的HRegion服務器上提交修改。數據首先被提交到HLog文件里面,在操作寫入HLog之后,commit()調用才會將其返回給客戶端。HLog文件用於故障恢復。例如某一台HRegionServer發生故障,那么它所維護的HRegion會被重新分配到新的機器上。這是HLog會按照HRegion進行划分。新的機器在加載HRegion的時候可以通過HLog對數據進行恢復。
當一個HRegion變得太過巨大,超過了設定的闊值時,HRegion服務器會調用HRegion.closeAndSplit(),將此HRegion拆分為兩個,並且報告給主服務器讓它決定由哪台HRegion服務器來存放新的HRegion。這個拆分過程十分迅速,因為兩個新的HRegion最初只是保留原來HRegionFile文件的引用。這時舊的HRegion會處於停止服務的狀態,當新的HRegion拆分完成並且把引用刪除了以后,舊的HRegion才會刪除。另外,HRegion可以通過調用HRegion.clodeAndMerge()合並成一個新的HRegion,當前版本下進行此操作需要兩台HRegion服務器都停機。





