版權聲明:可以任意轉載,轉載時請標明文章原始出處-ScriptShi
HBase(Hadoop Database)來自於Apache組織,早起隸屬於Hadoop項目,是其下的一個開源子項目,到目前成長爲一個獨立的頂級開源項目。本文從相對底層的角度講一下HBase。
Hbase在Hadoop生態系統中的位置(圖片來源:https://blog.csdn.net/u010608720/article/details/80092260)
Hbase是一個分佈式的、面向列的開源數據庫,是對基於GFS的Bigtable數據庫的開源實現。類似 Google Bigtable利用GFS作爲其文件存儲系統, Hbase利用 Hadoop HDFS作爲其文件存儲系統;Google運行Mapreduce來處理Bigtable中的海量數據, Hbase同樣利用 Hadoop MaReduce來處理 Hbase中的海量數據; Google Bigtable利用 Chubby作爲協同服務, Hbase利用Zookeeper作爲協同服務。
Hbase底層使用Hadoop的HDFS作爲文件存儲系統。藉助於此,Hbase首先實現了海量數據存儲能力,同時能顯著提高數據存儲的可靠性。Hbase的上層可以使用 Mapreduce並行計算框架,這使它對於海量數據處理又具有了明顯的效率優勢。 Hbase融合了HDFS的海量數據存儲能力和 Mapreduce的並行計算能力,能夠實現海量數據的高效處理,並提供高可靠性保證。
Hbase作爲列數據庫,存儲的數據介於鍵值(key-value)映射和關係型數據之間。保存在Hbase中的海量數據在邏輯上被組織成一張很大的表,支持動態添加數據列,並且每個數據值又以時間戳區分,保留了數據的多個版本。
Hbase的體系結構
與HDFS類似, Hbase也遵從簡單的 Master-Slave 體系結構。它是由 HMasterServer( Hbase Master Server) 和 HRegionServer( Hbase Region Server)構成的服務器集羣。其中, HMasterServer充當master角色,主要負責將Region分配給RegionServer、動態加載或卸載RegionServer、對Regionserver實現負載均衡、管理全局數據模式定義等功能; Hregionserver充當 Slave角色,負責與 Client進行交互和數據的讀寫操作。體系結構的相似性使得 Hbase與Hadoop一樣,可以方便地進行橫向擴展,通過不斷增加廉價的機器來增加計算和存儲能力。
Hbase的體系結構(圖片來源:http://www.blogjava.net/DLevin/archive/2015/08/22/426877.html)
HBase的組件結構
從互聯網上搜到的組件結構圖中,最經典的就是下圖所示的結構圖。我們可以看到,在hbase的集羣中,主要有四大功能組件。分別是HMasterServer,HRegionSever,Zookeeper和Client Library。
Hbase的組件結構(圖片來源:http://www.aichengxu.com/other/6456119.htm)
主服務器( Hmasterserver)
Hmasterserver是Hbase整個集羣的管理者,它主要負責管理數據表(Table)和區域(Region)以及響應用戶的數據請求,保證用戶對數據的訪問。它的具體任務包括:
- 保存和管理關於存取數據信息的元數據信息。
- 管理用戶對錶的增加、刪除、修改和查詢。
- 調整Region的分佈,管理Hregionserver的數據和負載均衡。
- 負責新 Region的分配。
- 在 Hregionserver停機後,負責失效Hregionserver上的Region遷移。
- 處理對 Hbase schema的更新請求。
雖然 Master是 Hbase集羣中的中心點,但是 Hbase並不存在單點失效問題,因爲 Hbase中可以啓動多個 Master,並通過 Zookeeper的 Master Election機制保證總是隻有一個 master運行。當正在運行的 master機器出現故障的時候,系統會轉移到其他 master來接管。
數據服務器( Hregionserver)
Hregionserver是每個 Region(區域)的管理者和用戶服務的提供者。它管理本地數據,並響應用戶的數據讀取請求。一般情況下,在 Hbase集羣中,每臺機器上只運行了一個 Region-Server。
Region的存儲與讀取
Hbase是 Bigtable的開源實現,也是列存儲數據庫。Hbase以表的形式存儲數據。當Hbase數據表的大小超過設置值時, Hbase會把數據表在行的方向上分隔爲多個區域(Region),每個 Region包含全部數據的一個子集。從物理上來說,一張表被拆分了多塊,每塊就是一個 Region。Region是 Hbase中分佈式存儲和負載均衡的最小單元。不同的 Region可以分別位於不同的 Hregionserver上,但同一個 Region不會被分拆存儲到多個 Hregionserver之上。
進一步, Region由多個Store組成, Store是 Hbase的物理存儲核心。每個 Store存儲表中的1個列簇。Store由兩部分組成: Memstore和 StoreFile。 Memstore是有序的主存緩衝區( Sorted Memory Buffer),用戶寫入的數據首先暫存於 Memstore,當 Memstore寫滿後會執行 Flush操作,寫入外存的一個 Storefile(其底層實現是 Hfile)中。這樣, Store file文件數量會持續增長。當Storefile文件數量增長到設定閾值時,會觸發合併( compact)操作,將多個 Store File合併成一個Storefile。合併過程中會進行版本合併和數據刪除。
Region Server響應用戶的數據讀取請求。它首先會訪問本地的 HMemcache緩存,其中保存着最近更新的數據。如果緩存裏面沒有該數據,纔會到 Store中進行磁盤查找。
恢復管理
Hregionserver使用本地磁盤上的 Hlog文件進行恢復管理。HLog文件記錄着所有更新操作。在 Hregionserver啓動的時候,會檢查本地的Hog文件,查看最近一次執行緩衝區寫出操作後是否有更新操作:如果沒有更新,就表示數據緩衝區中的所有更新都已經寫入磁盤文件中了;如果有更新, Hregionserver會先把這些更新寫入高速緩存,然後調用 flush cache過程寫入外存磁盤。最後, Hregionserver會刪除舊的HLog文件,並開始讓用戶訪問數據。
Region的合併與分裂
Hregionserver通過合併操作將多而小的 StoreFile合併成一個越來越大的 Store File。當單個StoreFile大小超過一定的閾值後,會觸發 Hregionserver的Split操作,把當前 Region分裂成兩個Region,並且報告給 Master,讓它來決定由哪個 Hregionserver存放新拆分而得的 Region。當新的 Region拆分完成並且把引用也刪除後, Hregionserver負責刪除舊的Region。另外,當兩個Region足夠小時,Hbase負責將它們合併。
Hbase集羣中的分佈式協調器(Zookeeper)
Zookeeper是 Hbase集羣的協調者。總體來說, Zookeeper的功能有:
- 保證在任何時於刻,集羣中只有一個 master
- 存儲所有 Region的入口地址。 Hmasterserver啓動時會將 Hbase系統表Root加載到 Zookeeper上,並通過 Zookeeper cluster獲取當前系統表的Meta的存儲所對應的 Regionserver信息。
- 實時監控 Region Server的狀態,將 Hregionserver的上線和下線信息實時通知給 HMasterServer。 Hregionserver會以短暫的方式向 Zookeeper註冊,使得 Hmasterberver可以隨時感知各個 Hregionserver是否在線的狀態信息。
- 存儲 Hbase的 schema,包括有哪些表,每個表有哪些列族。
客戶端類庫( Client Library)
Client Library是封裝的用於支持 Hbase數據操作和客戶端開發的API集合。
Hbase/Bigtable 與 RDBMS
Hbase是 Bigtable的開源實現,在此我們以 Hbase爲例,總結 Hbase、 Bigtable與關係型數據庫管理系統 RDBMS的主要不同。Hbase是一個分佈式的、基於列模式的映射數據庫,它只能表示很簡單的鍵值映射關係。它有如下特點:
- 數據類型,HBase只有簡單的字符類型,所有的類型都是交由用戶自己處理,它只保存字符串。而關係數據庫有豐富的類型和存儲方式。
- 數據操作:HBase只有很簡單的插入、查詢、刪除、清空等操作,表和表之間是分離的,沒有複雜的表和表之間的關係,而傳統數據庫通常有各式各樣的函數和連接操作。
- 存儲模式:HBase是基於列存儲的,每個列族都由幾個文件保存,不同的列族的文件是分離的;傳統的關係數據庫是基於表結構和模式保存的。
- 數據索引: Hbase沒有真正的索引,由於行是順序存儲的,每行中的列也是順序存儲的,因此不存在索引膨脹問題,插入性能和表的大小無關;關係數據庫支持多級索引技術,索引頁面相對於數據頁面來說要小很多,利用索引可以加快查找和連接的速度,但是,在數據更新頻繁的應用中,索引維護代價不容忽視。
- 數據維護: Hbase進行更新操作,插入新版本數據時,舊版本的數據仍然會保留,所以實際上是插入了新的數據,屬於典型的異地更新策略;傳統的關係型數據庫則採用原地替換與修改策略,輔以基於日誌的恢復策略實現數據庫的彈性。
- 可伸縮性: Hbase支持線性擴展,能夠方便地增減節點數量,從而修改集羣規模和系統容量,新節點加入集羣后,運行 Hregionserver, Hbase能夠自動實現 Region的負載均衡;傳統的關係數據庫通常需要通過中間層來實現受控的節點加入或者刪除。
- 系統目標: Hbase強調靈活的可伸縮性以支持海量數據存儲,強調並行處理、數據的“最終一致性”等思想以支持面向海量數據的實時查詢處理;傳統的關係型數據庫強調事務的ACID特性,強調數據的“實時一致性”,強調基於SQL語言的複雜査詢支持能力。
從上面的對比可以看出, Bigtable和Hbase之類的基於列模式的分佈式數據庫,更適合海量存儲和實時查詢處理。另外,互聯網上的內容是以字符爲基礎的, Bigtable和 Hbase正是針對互聯網應用而開發出來的數據庫。 Hbase從設計之初,就強調靈活的分佈式架構,用戶可以基於異構、廉價的硬件設備組建 Hbase大數據存儲和處理集羣。
其他
推薦瞭解的還有:
- Cassandra:Facebook開發的nosql,在集羣架構上採用P2P環的方式,即一致性散列,節點通訊採用Gossip協議。
- OceanBase:淘寶自己的nosql,注重CAP中的CA。架構採用Master-Slave模式。
- Etcd和zookeeper: 特點是raft和paxos的實現。