在Broker上下线时,控制器对应的监听会读取/brokers/ids/* 下面的Broker列表,并与liveOrShuttingDownBrokerIds比较,得出需要上线/下线的节点。对于上线的节点调用onBrokerStartup()方法,对于下线的节点调用onBrokerFailure()方法。
Broker 下线
Broker下线时,节点上所有副本对应的状态都会被更改为“下线状态”。假设Broker下线之前,分区的状态为“上线状态”,并且分区主副本在该节点上。此时控制器对于下线后没有主副本的分区处理如下:
1、将这些分区的状态从“上线状态”改为“下线状态”;
2、通过选举器(OfflinePartitionLeaderSelector)为分区选举新的主副本;
3、为分区选举新副本后,发送LeaderAndIsr给分区的所有存活副本;
4、如果选举出主副本,此时将分区的状态从“下线状态”改为“上线状态”;
5、下线节点上所有副本改为“下线状态”。
下面看一下图示的过程:
单副本-分区节点下线状态机变更
多副本-分区节点下线状态机变更