您好,登錄后才能下訂單哦!
Hbase實現
Hbase由一個Master節點負責協調管理一個或多個RegionServer從屬機.Master負責啟動,把區域分配給注冊的RegionServer,恢復RegionServer的故障. Master負載很輕. RegionServer負責零個或多個區域的管理以及響應客戶端的讀寫請求, RegionServer還負責區域的劃分,并通知Master有了新的子區域Hbase依賴于Zookeeper.如果區域的分配過程中有服務器崩潰,就通過Zookeeper來協調,分配,在Zookeeper分配事務狀態有助于在恢復時可以從崩潰遺留的狀態開始繼續分配.在啟動一個客戶端到集群上的連接時,客戶端必須至少拿到集群所傳遞的Zookeeper整體的位置.這樣,客戶端才能訪問Zookeeper的層次,了解集群的屬性,如服務器的位置.
運行中Hbase
Hbase中保留著-ROOT-和.META.的特殊目錄,它們維護著當前集群上所有區域的列表,狀態,位置.ROOT表維護著Meta表的信息,Meta表維護著用戶表的信息, Meta表中的項使用區域名作為主鍵,區域名由所屬的表名,區域的起始行,創建的時間戳進行哈希后的結果組成.區域變化時,即分裂,禁用/啟用.刪除,為負載均衡重新部署機器或由于Regionserver崩潰而重新部署區域時,目錄表都會相應進行更新,這樣,集群上所以區域的信息都能保持是最新的.
客戶端的每一個行操作都要訪問三次遠程節點:
1.從Zookeeper獲取Master的位置
2.從Master獲取.Meta.表的信息
3.根據.Meta.表的信息,獲取region位置信息
為了減少訪問遠程節點,Hbase客戶端會緩存它們遍歷ROOT表時獲取的信息和Meta表位置以及用戶空間的區域的開始行和結束行,這樣不用訪問Meta表也能得知區域存放的位置.當客戶端碰到錯誤時會再去查看Meta獲取區域的新位置,如果.Meta也移動了,就去查詢ROOT表
Client
1 包含訪問hbase的接口,client維護著一些cache來加快對hbase的訪問,比如regione的位置信息。
Zookeeper
1 保證任何時候,集群中只有一個master
2 存貯所有Region的尋址入口。
3 實時監控Region Server的狀態,將Region server的上線和下線信息實時通知給Master
4 存儲Hbase的schema,包括有哪些table,每個table有哪些column family
Master
1 為Region server分配region
2 負責region server的負載均衡
3 發現失效的region server并重新分配其上的region
4 GFS上的垃圾文件回收
5 處理schema更新請求
Region Server
1 Region server維護Master分配給它的region,處理對這些region的IO請求
2 Region server負責切分在運行過程中變得過大的region
可以看到,client訪問hbase上數據的過程并不需要master參與(尋址訪問zookeeper和region server,數據讀寫訪問regione server),master僅僅維護者table和region的元數據信息,負載很低
region定位
系統如何找到某個row key (或者某個 row key range)所在的region
bigtable 使用三層類似B+樹的結構來保存region位置。
第一層是保存zookeeper里面的文件,它持有root region的位置。
第二層root region是.META.表的第一個region其中保存了.META.z表其它region的位置。通過root region,我們就可以訪問.META.表的數據。
.META.是第三層,它是一個特殊的表,保存了hbase中所有數據表的region 位置信息。
說明:
1 root region永遠不會被split,保證了最需要三次跳轉,就能定位到任意region 。
2.META.表每行保存一個region的位置信息,row key 采用表名+表的最后一樣編碼而成。
3 為了加快訪問,.META.表的全部region都保存在內存中。
假設,.META.表的一行在內存中大約占用1KB。并且每個region限制為128MB。
那么上面的三層結構可以保存的region數目為:
(128MB/1KB) * (128MB/1KB) = = 2(34)個region
4 client會將查詢過的位置信息保存緩存起來,緩存不會主動失效,因此如果client上的緩存全部失效,則需要進行6次網絡來回,才能定位到正確的region(其中三次用來發現緩存失效,另外三次用來獲取位置信息)。
讀寫過程
上文提到,hbase使用MemStore和StoreFile存儲對表的更新。
數據在更新時首先寫入Log(WAL log)和內存(MemStore)中,MemStore中的數據是排序的,當MemStore累計到一定閾值時,就會創建一個新的MemStore,并 且將老的MemStore添加到flush隊列,由單獨的線程flush到磁盤上,成為一個StoreFile。于此同時,系統會在zookeeper中 記錄一個redo point,表示這個時刻之前的變更已經持久化了。(minor compact)
當系統出現意外時,可能導致內存(MemStore)中的數據丟失,此時使用Log(WAL log)來恢復checkpoint之后的數據。
前面提到過StoreFile是只讀的,一旦創建后就不可以再修改。因此Hbase的更 新其實是不斷追加的操作。當一個Store中的StoreFile達到一定的閾值后,就會進行一次合并(major compact),將對同一個key的修改合并到一起,形成一個大的StoreFile,當StoreFile的大小達到一定閾值后,又會對 StoreFile進行split,等分為兩個StoreFile。
由于對表的更新是不斷追加的,處理讀請求時,需要訪問Store中全部的 StoreFile和MemStore,將他們的按照row key進行合并,由于StoreFile和MemStore都是經過排序的,并且StoreFile帶有內存中索引,合并的過程還是比較快。
寫請求處理過程
1 client向region server提交寫請求
2 region server找到目標region
3 region檢查數據是否與schema一致
4 如果客戶端沒有指定版本,則獲取當前系統時間作為數據版本
5 將更新寫入WAL log
6 將更新寫入Memstore
7 判斷Memstore的是否需要flush為Store文件。
region分配
任何時刻,一個region只能分配給一個region server。master記錄了當前有哪些可用的region server。以及當前哪些region分配給了哪些region server,哪些region還沒有分配。當存在未分配的region,并且有一個region server上有可用空間時,master就給這個region server發送一個裝載請求,把region分配給這個region server。region server得到請求后,就開始對此region提供服務。
region server上線
master使用zookeeper來跟蹤region server狀態。當某個region server啟動時,會首先在zookeeper上的server目錄下建立代表自己的文件,并獲得該文件的獨占鎖。由于master訂閱了server 目錄上的變更消息,當server目錄下的文件出現新增或刪除操作時,master可以得到來自zookeeper的實時通知。因此一旦region server上線,master能馬上得到消息。
region server下線
當region server下線時,它和zookeeper的會話斷開,zookeeper而自動釋放代表這臺server的文件上的獨占鎖。而master不斷輪詢 server目錄下文件的鎖狀態。如果master發現某個region server丟失了它自己的獨占鎖,(或者master連續幾次和region server通信都無法成功),master就是嘗試去獲取代表這個region server的讀寫鎖,一旦獲取成功,就可以確定:
1 region server和zookeeper之間的網絡斷開了。
2 region server掛了。
的其中一種情況發生了,無論哪種情況,region server都無法繼續為它的region提供服務了,此時master會刪除server目錄下代表這臺region server的文件,并將這臺region server的region分配給其它還活著的同志。
如果網絡短暫出現問題導致region server丟失了它的鎖,那么region server重新連接到zookeeper之后,只要代表它的文件還在,它就會不斷嘗試獲取這個文件上的鎖,一旦獲取到了,就可以繼續提供服務。
master上線
master啟動進行以下步驟:
1 從zookeeper上獲取唯一一個代碼master的鎖,用來阻止其它master成為master。
2 掃描zookeeper上的server目錄,獲得當前可用的region server列表。
3 和2中的每個region server通信,獲得當前已分配的region和region server的對應關系。
4 掃描.META.region的集合,計算得到當前還未分配的region,將他們放入待分配region列表。
master下線
由于master只維護表和region的元數據,而不參與表數據IO的過 程,master下線僅導致所有元數據的修改被凍結(無法創建刪除表,無法修改表的schema,無法進行region的負載均衡,無法處理region 上下線,無法進行region的合并,唯一例外的是region的split可以正常進行,因為只有region server參與),表的數據讀寫還可以正常進行。因此master下線短時間內對整個hbase集群沒有影響。從上線過程可以看到,master保存的 信息全是可以冗余信息(都可以從系統其它地方收集到或者計算出來),因此,一般hbase集群中總是有一個master在提供服務,還有一個以上 的’master’在等待時機搶占它的位置。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。