主节点选举监听器主要负责监听处理与主节点相关事件。包括:主节点选举和主节点下线。在elastic job中,实现类为:
io.elasticjob.lite.internal.election.ElectionListenerManager
,该类提供的start方法负责启动这两个监听器。
public void start() {
addDataListener(new LeaderElectionJobListener());
addDataListener(new LeaderAbdicationJobListener());
}
主节点选举
主节点选举的目的是产生任务的主节点。在elastic job中,任务的执行可以分布在不同的实例(节点)中,但任务分片等核心控制,需要由主节点完成。因此,任务执行前,需要选举出主节点。
一般情况下,以下两个场景会触发主节点的选举:
- 第一个服务上线(当前不存在主节点,当前服务未禁用);
- 主节点下线(删除主节点
leader/election/instance
).
elastic job实现逻辑在io.elasticjob.lite.internal.election.ElectionListenerManager.LeaderElectionJobListener#dataChanged
中。
protected void dataChanged(final String path, final Type eventType, final String data) {
if (!JobRegistry.getInstance().isShutdown(jobName) && (isActiveElection(path, data) || isPassiveElection(path, eventType))) {
leaderService.electLeader();
}
}
JobRegistry.getInstance().isShutdown(jobName)
用于判断当前任务没有关闭;
isActiveElection(path, data)
用于当前场景满足:第一次服务上线;
isPassiveElection(path, eventType)
用于确定当前场景满足:主节点下线。
当以上条件满足时,触发主节点选举代码leaderService.electLeader()
,该代码逻辑执行主节点选举,选举成功后,在zk中创建节点leader/election/instance
,该节点的值为任务实例ID(IP@-@PID),表示当前时刻,主节点为值对于的实例。
主节点下线
任务执行中,主节点已被选举出来。当把主节点所在主机(server)在zk中禁用时(节点`servers/ip'的值设置为DISABLED),会触发主节点下线事件,此时监听器会删除当前主节点。此时会触发主节点选举,然后重新选举出新的主节点。
网友评论