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