- HBase的分佈式存儲架構:
HBase的部署遵從主從模式,通常有一個主機和一組從機,俗稱range server。啓動時,主機會給每臺range server 分配一組區間,每個區間包含一個行記錄的有序集合,行記錄有行健唯一標識。如果存儲在區間中的行記錄數量超過了配置的閾值,區間就會分割成兩個新的區間,行記錄在這兩個新的區間之間分配。
每個區間都有內存存儲(緩存)和WAL(預寫日誌)。WAL是在數據庫系統中提供原子性和持久性的一族技術。客戶端程序能決定是否開啓WAL,關閉能提升性能,但是在出現錯誤時會降低可靠性和恢復能力。開啓後,數據寫入區間前會先寫日誌,然後寫入區間的內存存儲。內存存儲填滿後,數據會栓如磁盤,持久化到底層分佈式存儲中。
如果使用了類似HDFS(hadoop distributed filesystem,hadoop分佈式文件系統)的分佈式文件系統,那麼主從模式還會擴展到底層存儲架構。HDFS中,一個namenode和一組datanode形成的結構非常類似於HBase等列數據庫中主服務器和range server的配置。這種情況下,HBase的每個列族的物理存儲文件最終會落到HDFS的datanode上。HBase利用文件系統API避免與HDFS強耦合,是中介。這個API還支持HBase無縫的集成其他類型的文件系統,比如HBase可以使用CloudStore,它的前身是KFS(kosmos filesystem),而不是HDFS。
除了利用分佈式文件系統做存儲,HBase集羣還利用到了外部配置與協調工具。google中是chubby,hadoop中我們稱爲ZooKeeper。Hytertable也有一個類似的基礎設施部件,名爲Hyterspace。ZooKeeper集羣通常用作HBase集羣的前端,負責處理新客戶和管理配置。
第一次使用HBase時,客戶端先通過ZooKeeper訪問兩個目錄-ROOT-和.META。這些目錄維護着所有區間的狀態和位置信息。
- -ROOT-維護和所有.META表相關的信息。
- .META文件維護和用戶空間表(保存數據的表)相關的信息。
客戶端訪問某行數據時:
- 訪問ZooKeeper要-ROOT-的目錄。
- 從-ROOT-的目錄定位到行記錄的.META目錄(提供了和行記錄有關的所有區間的明細)。
- 用這個信息訪問行記錄。
當客戶端下一次在訪問同一行數據時,不會再重複。因爲有緩存,可以直接訪問region server。只有在區間緩存過期,區間被禁用或者區間無法訪問的情況下才會重複查找步驟。
每個區間通常用存儲的最小行鍵來標識,所以查找行記錄非常簡單,檢查行鍵大於等於區間標識符就可。