Elastic job 移除leader 源码分析

Elastic job 移除选举方法 leaderService.removeLeader(); 判断是否存在leader ,移除 zk /leader/election/instance node

    /**
     * 删除主节点供重新选举.
     */
    public void removeLeader() {
        jobNodeStorage.removeJobNodeIfExisted(LeaderNode.INSTANCE);
    }

leaderService.removeLeader() 被以下方法调用


image.png

LeaderAbdicationJobListener dataChanged 方法调用了 移除选举方法

 class LeaderAbdicationJobListener extends AbstractJobListener {
        
        @Override
        protected void dataChanged(final String path, final Type eventType, final String data) {
            if (leaderService.isLeader() && isLocalServerDisabled(path, data)) {
                leaderService.removeLeader();
            }
        }
        
        private boolean isLocalServerDisabled(final String path, final String data) {
            return serverNode.isLocalServerPath(path) && ServerStatus.DISABLED.name().equals(data);
        }
    }

简单说 在当前实例是leader 情况下 , 且状态被 disable 的情况下 , 当前leader 会remove leader , 然后 会激活 被动选举 。 (如果在job执行过程 disable leader 节点 , 那么isLeaderUntilBlock 也会执行吧 ,等待leader选举后 再执行job )

isLocalServerDisabled方法 判断 event path 是否是当前servers 路径本地节点 , 且 event type 是否 disable 都满足 返回true

JobShutdownHookPlugin shutdown() 方法调用了 移除选举方法

public final class JobShutdownHookPlugin extends ShutdownHookPlugin {
    
    private String jobName;
    
    @Override
    public void initialize(final String name, final Scheduler scheduler, final ClassLoadHelper classLoadHelper) throws SchedulerException {
        super.initialize(name, scheduler, classLoadHelper);
        jobName = scheduler.getSchedulerName();
    }
    
    @Override
    public void shutdown() {
        CoordinatorRegistryCenter regCenter = JobRegistry.getInstance().getRegCenter(jobName);
        if (null == regCenter) {
            return;
        }
        LeaderService leaderService = new LeaderService(regCenter, jobName);
        if (leaderService.isLeader()) {
            leaderService.removeLeader();
        }
        new InstanceService(regCenter, jobName).removeInstance();
    }
}

JobShutdownHookPlugin 会在 ctrl c , kill 或者 JVM terminating (idea 手动那个不行的)时候 激活 该job 的 shutdown 方法
首先判断 注册中心 是否有 该jobname , 如果有 判断当前是否是leader , 如果是 remove leader , 最后会remove 该job 的 instances 节点 如 instances/192.168.200.151@-@7100 节点

ShutdownListenerManager.InstanceShutdownStatusJobListener 在 job 没有shutdown ,没有 paused ,在 instances下的当前节点 被移除 , 判断当前节点没有运行的情况下 会 执行 schedulerFacade.shutdownInstance(); 然后 会判断当前节点是否leader ,如果是 ,执行 leaderService.removeLeader() 方法 。

class InstanceShutdownStatusJobListener extends AbstractJobListener {
        
        @Override
        protected void dataChanged(final String path, final Type eventType, final String data) {
            if (!JobRegistry.getInstance().isShutdown(jobName) && !JobRegistry.getInstance().getJobScheduleController(jobName).isPaused()
                    && isRemoveInstance(path, eventType) && !isReconnectedRegistryCenter()) {
                schedulerFacade.shutdownInstance();
            }
        }
        
        private boolean isRemoveInstance(final String path, final Type eventType) {
            return instanceNode.isLocalInstancePath(path) && Type.NODE_REMOVED == eventType;
        }
        
        private boolean isReconnectedRegistryCenter() {
            return instanceService.isLocalJobInstanceExisted();
        }
    }

    /**
     * 终止作业调度.
     */
    public void shutdownInstance() {
        if (leaderService.isLeader()) {
            leaderService.removeLeader();
        }
        monitorService.close();
        if (reconcileService.isRunning()) {
            reconcileService.stopAsync();
        }
        JobRegistry.getInstance().shutdown(jobName);
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1RegistryCenter ZookeeperRegistryCenter内部通过ZookeeperCon...
    言西枣阅读 2,668评论 0 1
  • 问题3 当某一实例 挂掉时候 ,集群的leader 会报异常 ,当任务完成的时候 , 只会重新分片 , 如果 ...
    pcgreat阅读 1,558评论 0 0
  • 作业的必要性以及存在的问题 1. 为什么需要作业? 作业即定时任务。一般来说,系统可使用消息传递代替部分使用作业的...
    Sununy阅读 6,881评论 3 25
  • 原文地址:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端C...
    cn_yaojin阅读 1,015评论 0 0
  • 读书贵在坚持,我希望通过读书了解古今中外,了解大千世界,了解不同人物的经历和感受,为了孩子的健康成长,我会陪孩子一...
    雨是云的泪痕阅读 234评论 0 0