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