關鍵演算法 / 流程
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』在等待時機搶占它的位置。
hbase 修改表名 Hbase關鍵演算法
region定位 系統如何找到某個row key 或者某個 row key range 所在的region bigtable 使用三層類似b 樹的結構來儲存region位置。第一層是儲存zookeeper裡面的檔案,它持有root region的位置。第二層root region是.meta.表的第...
HBase 讀寫流程
1.讀流程 client先訪問zookeeper,從meta表讀取region的位置,然後讀取meta表中的資料。meta中又儲存了使用者表的region資訊 根據namespace 表名和rowkey在meta表中找到對應的region資訊 找到這個region對應的regionserver 查詢...
HBase讀寫流程
1 client先訪問zookeeper,從meta表讀取region的位置,然後讀取meta表中的資料。meta中又儲存了使用者表的region資訊 2 根據namespace 表名和rowkey在meta表中找到對應的region資訊 3 找到這個region對應的regionserver 4 ...