Region 各個狀態的轉換
HBase 維護了每個 region 的一個狀態信息,並保存在 hbase:meta 中。hbase:meta 本身region的狀態信息被持久化到 ZooKeeper。也可以在 HBase Master Web UI 里查看到 regions 的轉換狀態。以下是一個 region 可能出現的狀態:
1. OFFLINE:region處於offline 狀態,not opening
2. OPENING:region處於正在被opened 狀態
3. OPEN:region處於打開狀態,並且RegionServer已經通知了master
4. FAILED_OPEN:RegionServer未成功open這個region
5. CLOSING:region處於正在被關閉的狀態
6. CLOSED:RegionServer已經關閉了region並且通知了master
7. FAILED_CLOSE:RegionServer close region 失敗
8. SPLITTING:RegionServer 通知了master 當前region正在splitting
9. SPLIT:RegionServer通知master當前region已經完成splitting
10. SPLITTING_NEW:當前region由於split的原因,在被創建過程中
11. MERGING:RegionServer 通知master當前region正在與另一region聚合
12. MERGED:RegionServer 通知了master當前region已經被聚合
13. MERGING_NEW:當前region正在由兩個region聚合中
狀態圖說明:
1. 棕色:Offline狀態,一種特殊的短暫狀態(在被closed后,opening 之前),或是一種terminal的狀態(regions of disabled tables),亦或是初始狀態(新創建的表的regions)
2. 淺綠色:online狀態,可以處理請求
3. 淡藍色:短暫瞬時的狀態
4. 紅色:失敗狀態,需要 OPS注意
5. 金色:regions的split/merge的關閉狀態
6. 灰色:可能由於split/merge生成的regions的初始狀態
轉換狀態說明:
1. Master 將一個region從OFFLINE狀態移動到OPENING狀態,並嘗試將region assign到一個RegionServer。RegionServer可能還沒有收到open region 的請求。Master 會重試向RegionServer發送 open region request的請求,直到RPC goes through或者master的到達重試次數上限。在RegionServer接收到open region request后,RegionServer開始opening region;
2. 如果master重試次數已滿,則master會阻止RegionServer opening region,將reigon放入closing狀態,並嘗試close 它,即使此時RegionServer 正在開始 open the region
3. 在RegionServer 打開region后,它會繼續嘗試通知master,直到master將當前region改為OPEN狀態並且通知RegionServer。此時region為open狀態
4. 如果RegionServer無法打開region,它會通知master。Master將region移動到CLOSED狀態並嘗試將在另一個regionserver打開此region
5. 如果master無法open the region on any of a certain number of regions,它會將region移動到FAILED_OPEN 狀態,並且不會有任何進一步的動作,直到從 HBase進行人工干預,或 server is dead
6. master將一個region從OPEN移動到CLOSING狀態。維持當前region的RegionServer可能尚未收到close region的請求。Master會重試發送 close request,直到RPC goes through或master重試次數耗盡
7. 如果RegionServer為非online狀態,或者拋出了NotServingRegionException的異常,master會將region移動到OFFLINE狀態並且re-assign這個region到另一個RegionServer
8. 如果RegionServer為online狀態,但是在master重試次數耗盡后仍無法reach 到此region。則master移動region到FAILED_CLOSE 狀態,並且不會有任何進一步的動作,直到從 HBase進行人工干預,或 server is dead
9. 如果RegionServer收到close region的請求,它會close此region並通知master。Master移動此region到CLOSED狀態並重新將它分配到另一個RegionServer
10. 在assinging一個region之前,如果它是CLOSED狀態,則master自動將region移動到OFFLINE狀態
11. 當一個RegionServer開始要做split region時,它會通知master。Master將被split的region從OPEN狀態移動到SPLITTING狀態,並且新增加兩個region到RegionServer。這兩個新region在最開始會處於SPLITING_NEW 狀態
12. 在通知了master后,RegionServer開始split region。一旦過了無法返回的點后(past the point of no return),RegionServer再次通知master,這樣master會更新hbase:meta 表。然而,master不會更新region 狀態直到它被server通知 split已經完成。如果split成功,則splitting region 會被從SPLITTING狀態移動到SPLIT狀態,並且兩個新region會被從SPLITTING_NEW狀態移動到OPEN狀態
13. 如果split失敗,splitting region會從SPLITTING移動回OPEN狀態,並且兩個新的region會從SPLITTING_NEW 移動到OFFLINE狀態
14. 當一個RegionServer准備開始聚合兩個region時,它首先會通知master。Master移動兩個即將被聚合的regions從OPEN狀態移動到MERGING狀態,並且將(被聚合的,保有聚合的region的數據的)新region加入到RegionServer。新的regions的狀態在最開始為MERGING_NEW的狀態
15. 在通知master后,RegionServer開始聚合兩個regions。一旦過了無法返回的點后(past the point of no return),則RegionServer再次通知master,這樣master會更新META表。然后master不會立即更新region狀態,直到RegionServer通知master 聚合已經完成。如果merge成功,則兩個聚合的regions會被從MERGING狀態移動到MERGED狀態,並且新的region會被從MERGING_NEW 狀態移動到OPEN狀態
16. 如果merge 失敗,則兩個merging regions會從MERGING 狀態移動回OPEN狀態,並且新的region(創建出來hold 兩個merging regions數據的region)會從MERGING_NEW狀態移動到OFFLINE狀態
17. 對處於FAILED_OPEN 或FAILED_CLOSE狀態的regions,master會嘗試再次關閉它們,當它們被重新分配時(通過HBase shell命令)
References:
http://hbase.apache.org/book.html