hbase(七)-region分裂過程

這裏寫圖片描述

  • 1、RegionServer決定本地的region分裂,並準備分裂工作。第一步是,在zookeeper的/hbase/region-in-reansition/region-name下創建一個znode,並設爲SPLITTING狀態。
  • 2、Master通過父region-in-transition znode的watcher監測到剛剛創建的znode。
  • 3、RegionServer在HDFS中父region的目錄下創建名爲“.split”的子目錄。
  • 4、RegionServer關閉父region,並強制刷新緩存內的數據,之後在本地數據結構中將標識爲下線狀態。此時來自Client的對父region的請求會拋出NotServingRegionException ,Client將重新嘗試向其他的region發送請求。
  • 5、RegionServer在.split目錄下爲子regionA和B創建目錄和相關的數據結構。然後RegionServer分割store文件,這種分割是指,爲父region的每個store文件創建兩個Reference文件。這些Reference文件將指向父region中的文件。
  • 6、RegionServer在HDFS中創建實際的region目錄,並移動每個子region的Reference文件。
  • 7、RegionServer向.META.表發送Put請求,並在.META.中將父region改爲下線狀態,添加子region的信息。此時表中並單獨存儲沒有子region信息的條目。Client掃描.META.時回看到父region爲分裂狀態,但直到子region信息出現在表中,Client才直到他們的存在。如果Put請求成功,那麼父region將被有效地分割。如果在這條RPC成功之前RegionServer死掉了,那麼Master和打開region的下一個RegionServer會清理關於該region分裂的髒狀態。在.META.更新之後,region的分裂將被Master回滾到之前的狀態。
  • 8、RegionServer打開子region,並行地接受寫請求。
  • 9、RegionServer將子region A和B的相關信息寫入.META.。此後,Client便可以掃描到新的region,並且可以向其發送請求。Client會在本地緩存.META.的條目,但當她們向RegionServer或.META.發送請求時,這些緩存便無效了,他們竟重新學習.META.中新region的信息。
  • 10、RegionServer將zookeeper中的znode /hbase/region-in-transition/region-name更改爲SPLIT狀態,以便Master可以監測到。如果子Region被選中了,Balancer可以自由地將子region分派到其他RegionServer上。
  • 11、分裂之後,元數據和HDFS中依然包含着指向父region的Reference文件。這些Reference文件將在子region發生緊縮操作重寫數據文件時被刪除掉。Master的垃圾回收工會週期性地檢測是否還有指向父region的Reference,如果沒有,將刪除父region。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章