rs主動退出或者宕機超過一定時間後,zk上/hbase/rs目錄下對應的znode會被刪除;
master的RegionServerTracker組件監聽到該目錄的子節點變化事件,會對zk上的rs節點和內存中的數進行對比,找出掛掉的ServerName;
ServerManager將該ServerName從onlineServers移到deadservers;
AssignmentManager創建ServerCrashProcedure實例(簡稱scp)並提交到ProcedureExecutor;
PE首先爲scp設置procId,並持久化到hdfs,然後創建對應的RootProcedureState,用以回滾,最後提交到ProcedureScheduler中的相應隊列中;
某個WorkerThread從隊列中獲取到該scp開始執行;
如果meta region在這個rs上,先split其log並assign,然後等待,直到被metaLoadEvent喚醒;
如果存在待處理的wal,則進行分佈式split,這個任務由master中的SplitLogManager協調各rs中的SplitLogWorker完成;
split完成後,對該rs下的每個region,提交AssignProcedure(簡稱ap),然後scp掛起;
ap的執行分爲3步:
由balancer分配目標rs;
通過RSProcedureDispatcher請求目標rs打開該region;
接收到已打開的消息後更新region的狀態數據,包括內存和meta表(如果是meta region,則更新的是zk上的meta-region-server節點);
ap執行完成的時候,判斷如果存在parent proc,則會將childrenLatch減1;
childrenLatch等於0的時候意味着所有ap都已經完成,此時會通過ap攜帶的parentProcId喚醒前面那個scp;
scp繼續執行,清理AssignmentManager和ServerManager中關於該rs的相關數據後結束;
詳細流程圖:https://www.processon.com/view/link/5c49a5dae4b0fa03cea60e27