[Hbase]Hbase章2 Hbase读写过程解析
寫數據
Hbase使用memstore和storefile存儲對表的更新。數據在更新時首先寫入hlog和memstore,memstore中的數據是排序的,當memstore累計到一定的閥值時,就會創建一個新的memstore,并將老的memstore添加到flush隊列,由單獨的線程flush到磁盤上,成為一個filestore。與此同時,系統會在zookeeper中記錄一個checkpoint,表示這個時刻之前的數據變更已經持久化了。當系統出現意外時,可能導致memstore中的數據丟失,此時使用hlog來恢復checkpoint之后的數據。
Storefile是只讀的,一旦創建之后就不可修改。因此hbase的更新就是不斷追加的操作。當一個store的storefile達到一定的閥值后,就會進行一次合并操作,將對同一個key的修改合并到一起,同時進行版本合并和數據刪除,形成一個大的storefile。當storefile的大小達到一定的閥值后,又會對storefile進行切分操作,等分為兩個storefile。
???????? Hbase中只有增添數據,所有的更新和刪除操作都是在后續的合并中進行的,使得用戶的寫操作只要進入內存就可以立刻返回,實現了hbase的高速存儲。
(1) Client通過Zookeeper的調度,向RegionServer發出寫數據請求,在Region中寫數據。
(2) 數據被寫入Region的MemStore,直到MemStore達到預設閾值。
(3) MemStore中的數據被Flush成一個StoreFile。
(4) 隨著StoreFile文件的不斷增多,當其數量增長到一定閾值后,觸發Compact合并操作,將多個StoreFile合并成一個StoreFile,同時進行版本合并和數據刪除。
(5) StoreFiles通過不斷的Compact合并操作,逐步形成越來越大的StoreFile。
(6) 單個StoreFile大小超過一定閾值后,觸發Split操作,把當前Region Split成2個新的Region。父Region會下線,新Split出的2個子Region會被HMaster分配到相應的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。
讀操作
Hbase的所有region元數據被存儲在.META表中,隨著region的增多,.META表中的數據也會增大,并分裂成多個新的region。為了定位.META表中各個region的位置,把.META表中的所有region的元數據保存在-ROOT-表中,最后由zookeeper記錄-ROOT-表的位置信息。所有的客戶端訪問數據之前,需要首先訪問zookeeper獲取-ROOT-的位置,然后訪問-ROOT-表獲得.META表的位置,最后根據.META表中的信息確定用戶數據存放的位置。
-ROOT-表永遠不會被分割,它只有一個region,這樣可以保證最多只需要三次跳轉就可以定位任意一個region。為了加快訪問速度,.META表的所有region全部保存在內存中。客戶端會將查詢過的位置信息緩存起來,且緩存不會主動失效。如果客戶端根據緩存信息還訪問不到數據,則詢問相關.META表的region服務器,試圖獲取數據的位置,如果還是失敗,則詢問-ROOT-表相關的.META表在哪里。最后,如果前面的信息全部失效,則通過zookeeper重新定位region的信息。所以如果客戶端上的緩存全部失效,則需要進行6次網絡來定位,才能定位到正確的region。
client-->Zookeeper-->-ROOT-表-->.META.表-->RegionServer-->Region-->client?
(1) Client訪問Zookeeper,查找-ROOT-表,獲取.META.表信息。
(2) 從.META.表查找,獲取存放目標數據的Region信息,從而找到對應的RegionServer。
(3) 通過RegionServer獲取需要查找的數據。
(4) Regionserver的內存分為MemStore和BlockCache兩部分,MemStore主要用于寫數據,BlockCache主要用于讀數據。讀請求先到MemStore中查數據,查不到就到BlockCache中查,再查不到就會到StoreFile上讀,并把讀的結果放入BlockCache。
?
后記:
高可用性
Write-Ahead-Log(WAL)保障數據高可用
我們理解下HLog的作用。HBase中的HLog機制是WAL的一種實現,而WAL(一般翻譯為預寫日志)是事務機制中常見的一致性的實現方式。每個RegionServer中都會有一個HLog的實例,RegionServer會將更新操作(如 Put,Delete)先記錄到 WAL(也就是HLog)中,然后將其寫入到Store的MemStore,最終MemStore會將數據寫入到持久化的HFile中(MemStore 到達配置的內存閥值)。這樣就保證了HBase的寫的可靠性。如果沒有 WAL,當RegionServer宕掉的時候,MemStore 還沒有寫入到HFile,或者StoreFile還沒有保存,數據就會丟失。或許有的讀者會擔心HFile本身會不會丟失,這是由 HDFS 來保證的。在HDFS中的數據默認會有3份。因此這里并不考慮 HFile 本身的可靠性。
?
組件高可用
Master容錯:Zookeeper重新選擇一個新的Master。如果無Master過程中,數據讀取仍照常進行,但是,region切分、負載均衡等無法進行;
RegionServer容錯:定時向Zookeeper匯報心跳,如果一旦時間內未出現心跳,Master將該RegionServer上的Region重新分配到其他RegionServer上,失效服務器上“預寫”日志由主服務器進行分割并派送給新的RegionServer;
Zookeeper容錯:Zookeeper是一個可靠地服務,一般配置3或5個Zookeeper實例。
轉載于:https://www.cnblogs.com/szss/p/10007612.html
總結
以上是生活随笔為你收集整理的[Hbase]Hbase章2 Hbase读写过程解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css: transform导致文字显示
- 下一篇: 前端 学习笔记day48 CSS介绍