摘要:HBase 是一個面向列的 NoSQL 數據庫。
本文分享自華爲雲社區《HBase 架構:HBase 數據模型 & HBase 讀/寫機制》,作者: Donglian Lin 。
HBase 架構:HBase 數據模型
衆所周知,HBase 是一個面向列的 NoSQL 數據庫。雖然它看起來類似於包含行和列的關係數據庫,但它不是關係數據庫。關係數據庫是面向行的,而 HBase 是面向列的。那麼,讓我們首先了解面向列和麪向行的數據庫之間的區別:
面向行與面向列的數據庫:
- 面向行的數據庫以行的順序存儲表記錄。而面向列的數據庫 將表記錄存儲在一系列列中,即列中的條目存儲在磁盤上的連續位置。
爲了更好地理解它,讓我們舉個例子並考慮下表。
如果此表存儲在面向行的數據庫中。它將存儲如下所示的記錄:
1 ,保羅沃克,美國, 231 ,加拉多,
2, Vin Diesel ,巴西, 520 , Mustang
如上所示,在面向行的數據庫中,數據是基於行或元組存儲的。
雖然面向列的數據庫將此數據存儲爲:
1 , 2 , Paul Walker , Vin Diesel , 美國,巴西, 231 , 520 , Gallardo , Mustang
在面向列的數據庫中,所有列值都存儲在一起,就像第一列值將存儲在一起,然後第二列值將一起存儲,其他列中的數據以類似方式存儲。
- 當數據量非常大時,比如 PB 級或 EB 級,我們使用面向列的方法,因爲單列的數據存儲在一起,可以更快地訪問。
- 雖然面向行的方法相對有效地處理較少數量的行和列,但面向行的數據庫存儲數據是一種結構化格式。
- 當我們需要處理和分析大量半結構化或非結構化數據時,我們使用面向列的方法。例如處理在線分析處理的應用程序,如數據挖掘、數據倉庫、包括分析在內的應用程序等。
- 而在線事務處理(例如處理結構化數據並需要事務屬性(ACID 屬性)的銀行和金融領域)使用面向行的方法。
HBase 表具有以下組件,如下圖所示:
- 表格:數據以表格格式存儲在 HBase 中。但這裏的表格是面向列的格式。
- 行鍵:行鍵用於搜索記錄,使搜索速度更快。你會很想知道怎麼做嗎?我將在本博客的架構部分進行解釋。
- 列族:各種列組合在一個列族中。這些列族存儲在一起,這使得搜索過程更快,因爲可以在一次查找中一起訪問屬於同一列族的數據。
- 列限定符:每列的名稱稱爲其列限定符。
- 單元格:數據存儲在單元格中。數據被轉儲到由行鍵和列限定符專門標識的單元格中。
- 時間戳:時間戳是日期和時間的組合。無論何時存儲數據,它都會與其時間戳一起存儲。這使得搜索特定版本的數據變得容易。
用更簡單易懂的方式,我們可以說 HBase 包括:
- 一組表
- 每個表都有列族和行
- 行鍵在 HBase 中充當主鍵。
- 對 HBase 表的任何訪問都使用此主鍵
- HBase 中存在的每個列限定符表示與駐留在單元格中的對象相對應的屬性。
現在您瞭解了 HBase 數據模型,讓我們看看這個數據模型如何符合 HBase 架構並使其適用於大存儲和更快的處理。
HBase 架構:HBase 架構的組件
HBase 具有三個主要組件,即HMaster Server、HBase Region Server、Regions和Zookeeper。
下圖解釋了 HBase 架構的層次結構。我們將單獨討論它們中的每一個。
現在在進入 HMaster 之前,我們將瞭解 Region,因爲所有這些 Server(HMaster、Region Server、Zookeeper)都是用來協調和管理 Region 並在 Region 內部執行各種操作的。因此,您很想知道什麼是區域以及它們爲何如此重要?
HBase 架構:區域
一個區域包含分配給該區域的開始鍵和結束鍵之間的所有行。HBase 表可以劃分爲多個區域,將一個列族的所有列存儲在一個區域中。每個區域都包含按排序順序的行。
許多區域被分配給一個Region Server,它負責處理、管理、執行對該組區域的讀取和寫入操作。
所以,以更簡單的方式結束:
- 一個表可以分爲多個區域。區域是存儲在開始鍵和結束鍵之間的數據的有序行範圍。
- 一個 Region 的默認大小爲 256MB,可以根據需要進行配置。
- 區域服務器爲客戶端提供一組區域。
- 一個區域服務器可以爲客戶端提供大約 1000 個區域。
現在從層次結構的頂部開始,我首先想向您解釋 HMaster Server,它的作用類似於HDFS 中的 NameNode 。然後,在層次結構中向下移動,我將帶您瞭解 ZooKeeper 和 Region Server。
HBase 架構:HMaster
如下圖所示,您可以看到 HMaster 處理駐留在 DataNode 上的 Region Server 集合。讓我們瞭解 HMaster 是如何做到這一點的。
- HBase HMaster 執行 DDL 操作(創建和刪除表)並將區域分配給區域服務器,如上圖所示。
- 它協調和管理 Region Server(類似於 NameNode 在 HDFS 中管理 DataNode)。
- 它在啓動時將區域分配給區域服務器,並在恢復和負載平衡期間將區域重新分配給區域服務器。
- 它監視集羣中所有 Region Server 的實例(在 Zookeeper 的幫助下),並在任何 Region Server 關閉時執行恢復活動。
- 它提供了一個用於創建、刪除和更新表的接口。
HBase 有一個龐大的分佈式環境,僅靠 HMaster 不足以管理所有內容。那麼,你會想知道是什麼幫助 HMaster 管理這個巨大的環境?這就是 ZooKeeper 出現的地方。在瞭解了 HMaster 如何管理 HBase 環境後,我們將瞭解 Zookeeper 如何幫助 HMaster 管理環境。
HBase 架構:ZooKeeper – 協調器
下圖解釋了 ZooKeeper 的協調機制。
- Zookeeper 就像 HBase 分佈式環境中的協調器。它有助於通過會話進行通信來維護集羣內的服務器狀態。
- 每個 Region Server 和 HMaster Server 都會定期向 Zookeeper 發送連續的心跳,並檢查哪個服務器是活動的和可用的,如上圖所示。它還提供服務器故障通知,以便可以執行恢復措施。
- 從上圖可以看出,有一個不活動的服務器,它作爲活動服務器的備份。如果活動服務器出現故障,它就會派上用場。
- 活動的 HMaster 向 Zookeeper 發送心跳,而非活動的 HMaster 偵聽活動 HMaster 發送的通知。如果活動 HMaster 未能發送心跳,則會話將被刪除,非活動 HMaster 變爲活動狀態。
- 而如果 Region Server 無法發送心跳,則會話將過期並通知所有偵聽器。然後 HMaster 執行適當的恢復操作,我們將在本博客稍後討論。
- Zookeeper 還維護 .META Server 的路徑,這有助於任何客戶端搜索任何區域。Client首先必須與.META Server覈對某個區域所屬的Region Server,並獲取該Region Server的路徑。
說到.META Server,我先給大家解釋一下什麼是.META Server?因此,您可以輕鬆地將 ZooKeeper 和 .META Server 的工作聯繫在一起。稍後,當我在此博客中向您解釋 HBase 搜索機制時,我將解釋這兩者如何協同工作。
HBase 架構: 元表
- META 表是一個特殊的 HBase 目錄表。它維護了 HBase 存儲系統中所有區域服務器的列表,如上圖所示。
- 從圖中可以看到,.META文件以鍵和值的形式維護表。Key 代表區域的起始鍵和它的 id,而值包含區域服務器的路徑。
正如我在向您解釋 Region 時已經討論過的 Region Server 及其功能,因此現在我們正在向下移動層次結構,我將專注於 Region Server 的組件及其功能。稍後我將討論搜索、閱讀、寫作的機制,並瞭解所有這些組件如何協同工作。
HBase 架構: Region Server 的組件
下圖顯示了區域服務器的組件。現在,我將分別討論它們。
區域服務器維護在HDFS頂部運行的各種區域。區域服務器的組件是:
- WAL: 從上圖中可以得出結論,Write Ahead Log (WAL) 是附加到分佈式環境中每個 Region Server 的文件。WAL 存儲尚未持久化或提交到永久存儲的新數據。它用於恢復數據集失敗的情況。
- Block Cache:從上圖可以清楚的看到Block Cache位於Region Server的頂部。它將經常讀取的數據存儲在內存中。如果 BlockCache 中的數據最近最少使用,則該數據將從 BlockCache 中刪除。
- MemStore:是寫緩存。在將所有傳入數據提交到磁盤或永久內存之前,它會存儲所有傳入數據。一個區域中的每個列族都有一個 MemStore。正如您在圖像中看到的,一個區域有多個 MemStore,因爲每個區域包含多個列族。數據在提交到磁盤之前按字典順序排序。
- HFile:從上圖可以看出HFile是存儲在HDFS上的。因此,它將實際單元存儲在磁盤上。當 MemStore 的大小超過時,MemStore 將數據提交到 HFile。
現在我們知道了 HBase 架構的主要和次要組件,我將在此解釋機制和他們的協作努力。不管是讀還是寫,首先我們要搜索從哪裏讀或者從哪裏寫一個文件。所以,讓我們瞭解這個搜索過程,因爲這是使 HBase 非常流行的機制之一。
HBase 架構: 搜索如何在 HBase 中初始化?
如您所知,Zookeeper 存儲 META 表位置。每當客戶端向 HBase 發出讀取或寫入請求時,就會發生以下操作:
- 客戶端從 ZooKeeper 檢索 META 表的位置。
- 客戶端然後從 META 表中請求相應行鍵的 Region Server 的位置來訪問它。客戶端將此信息與 META 表的位置一起緩存。
- 然後它將通過從相應的 Region Server 請求來獲取行位置。
對於將來的引用,客戶端使用其緩存來檢索 META 表的位置和先前讀取的行鍵的區域服務器。然後客戶端將不會引用 META 表,直到並且除非由於區域移動或移動而導致未命中。然後它將再次請求 META 服務器並更新緩存。
與每次一樣,客戶端不會浪費時間從 META 服務器檢索 Region Server 的位置,因此,這節省了時間並使搜索過程更快。現在,讓我告訴您如何在 HBase 中進行寫入。其中涉及哪些組件以及它們如何參與?
HBase 架構: HBase 寫機制
下圖解釋了 HBase 中的寫入機制。
寫入機制依次經過以下過程(參考上圖):
步驟1:每當客戶端有寫請求時,客戶端將數據寫入WAL(Write Ahead Log)。
- 然後將編輯附加到 WAL 文件的末尾。
- 該 WAL 文件保存在每個 Region Server 中,Region Server 使用它來恢復未提交到磁盤的數據。
第 2 步:將數據寫入 WAL 後,將其複製到 MemStore。
第 3 步:一旦數據放入 MemStore,客戶端就會收到確認。
第 4 步:當 MemStore 達到閾值時,它將數據轉儲或提交到 HFile。
現在讓我們深入瞭解一下 MemStore 在寫作過程中的貢獻以及它的功能是什麼?
HBase 寫機制- MemStore
- MemStore 總是按照字典順序(按字典方式)將存儲在其中的數據更新爲已排序的 KeyValue。每個列族有一個 MemStore,因此每個列族的更新以排序的方式存儲。
- 當 MemStore 達到閾值時,它會以排序的方式將所有數據轉儲到一個新的 HFile 中。此 HFile 存儲在 HDFS 中。HBase 爲每個列族包含多個 HFile。
- 隨着時間的推移,HFile 的數量隨着 MemStore 轉儲數據而增長。
- MemStore 還保存了最後寫入的序列號,因此 Master Server 和 MemStore 都知道到目前爲止提交了什麼以及從哪裏開始。當區域啓動時,讀取最後一個序列號,並從該編號開始新的編輯。
正如我多次討論過的,HFile 是 HBase 架構中的主要持久存儲。最後,所有的數據都提交到 HFile 中,HFile 是 HBase 的永久存儲。因此,讓我們看看 HFile 的屬性,它可以在讀寫時更快地進行搜索。
HBase 架構: HBase 寫入機制- HFile
- 寫入按順序放置在磁盤上。因此,磁盤讀寫頭的運動非常少。這使得寫入和搜索機制非常快。
- 每當打開 HFile 時,HFile 索引就會加載到內存中。這有助於在單次查找中查找記錄。
- 預告片是一個指向 HFile 的元塊的指針。它寫在提交文件的末尾。它包含有關時間戳和布隆過濾器的信息。
- 布隆過濾器有助於搜索鍵值對,它會跳過不包含所需行鍵的文件。時間戳還有助於搜索文件的版本,它有助於跳過數據。
在瞭解寫入機制和各種組件在使寫入和搜索更快方面的作用之後。我將向您解釋讀取機制在 HBase 架構中是如何工作的?然後我們將轉向提高 HBase 性能的機制,如壓縮、區域拆分和恢復。
HBase 架構: 讀取機制
正如我們在搜索機制中所討論的,如果客戶端的緩存中沒有它,客戶端首先從 .META 服務器中檢索區域服務器的位置。然後它按順序執行以下步驟:
- 爲了讀取數據,掃描器首先在塊緩存中查找行單元。這裏存儲了所有最近讀取的鍵值對。
- 如果 Scanner 未能找到所需的結果,它會移動到 MemStore,因爲我們知道這是寫緩存內存。在那裏,它搜索最近寫入的文件,這些文件尚未轉儲到 HFile 中。
- 最後,它將使用布隆過濾器和塊緩存從 HFile 加載數據。
到目前爲止,我已經討論了 HBase 的搜索、讀寫機制。現在我們來看看 HBase 機制,它使 HBase 中的搜索、讀取和寫入變得快速。首先,我們將瞭解Compaction,這是其中一種機制。
HBase 架構: 壓縮
HBase 結合 HFiles 以減少存儲並減少讀取所需的磁盤尋道次數。這個過程稱爲壓縮。Compaction 從一個區域中選擇一些 HFile 並將它們組合起來。如上圖所示,有兩種類型的壓縮。
- 次要壓縮:HBase 自動選擇較小的 HFile 並將它們重新提交到較大的 HFile,如上圖所示。這稱爲輕微壓實。它執行合併排序以將較小的 HFile 提交到較大的 HFile。這有助於優化存儲空間。
- Major Compaction: 如上圖所示,在Major compaction中,HBase將一個區域的較小的HFiles合併並重新提交到一個新的HFile。在這個過程中,相同的列族被放置在新的 HFile 中。它會在此過程中刪除已刪除和過期的單元格。它提高了讀取性能。
但在此過程中,輸入輸出磁盤和網絡流量可能會變得擁擠。這稱爲寫放大。因此,它通常安排在低峯值負載時間。
現在我將討論的另一個性能優化過程是 Region Split。這對於負載平衡非常重要。
HBase 架構: 區域拆分
下圖說明了 Region Split 機制。
每當一個區域變大時,它就會被分成兩個子區域,如上圖所示。每個區域正好代表父區域的一半。然後將此拆分報告給 HMaster。這由同一個 Region Server 處理,直到 HMaster 將它們分配給新的 Region Server 以進行負載平衡。
接下來,最後但並非最不重要的一點是,我將向您解釋 HBase 如何在發生故障後恢復數據。我們知道故障恢復是 HBase 的一個非常重要的特性,因此讓我們瞭解 HBase 如何在故障後恢復數據。
HBase 架構:HBase 崩潰和數據恢復
- 每當 Region Server 出現故障時,ZooKeeper 都會通知 HMaster 故障。
- 然後 HMaster 將崩潰的 Region Server 的區域分發並分配給許多活動的 Region Server。爲了恢復出現故障的 Region Server 的 MemStore 的數據,HMaster 將 WAL 分發給所有 Region Server。
- 每個 Region Server 重新執行 WAL 來爲那個失敗的 region 的列族構建 MemStore。
- 數據按時間順序(按時間順序)寫入 WAL。因此,重新執行該 WAL 意味着進行所有在 MemStore 文件中所做和存儲的更改。
- 所以,在所有的 Region Servers 執行完 WAL 之後,所有列族的 MemStore 數據都被恢復了。
我希望這篇博客能幫助您瞭解 HBase 數據模型和 HBase 架構。希望你喜歡它。