源码分析ElasticJob 选举及分片
elastic-job是将分片项分配至各个运行中的作业服务器,需自行处理实现分片项和数据的关系,分片策略包括(平均分配算法策略,作业名哈希值奇偶数算法策略,轮转分片策略。同时也提供了自定义分片策略的接口)
elastic-job 的分片逻辑是用一台主节点服务器触发,服务器之间需要进行选主,选主的过程就是通过注册中心zookeeper来实现
选主实现
调用源码发现 其调用LeaderService的electLeader方法
public void electLeader() {
jobNodeStorage.executeInLeader(LeaderNode.LATCH, new LeaderElectionExecutionCallback());
}
主节点选举时采用先获取先得到方式,其它节点会在主节点选举时,统一等待,选主分布式锁节点目录 /{namespace}/{jobName}/leader/election/latch
LeaderNode.LATCH 节点选举
LeaderElectionExecutionCallback回调会在拿到leader锁的节点触发
接下来分析 jobNodeStorage.executeInLeader()方法
public void executeInLeader(final String latchNode, final LeaderExecutionCallback callback) {
try (LeaderLatch latch = new LeaderLatch(getClient(), jobNodePath.getFullPath(latchNode))) {
//开始
latch.start();
//等待锁释放
latch.await();
callback.execute();
} catch (final Exception ex) {
handleException(ex);
}
}
latchNode: 分布式锁使用的作业节点名称
callback: 执行后回调函数
同时有很多服务器都会执行选主,为了保证有序性,拿到主节点服务器会执行await 释放锁,执行callback逻辑,判断masterNode.INSTANCE是否被设置 在此期间,其它服务器同样也会获取锁之后执行callback,主节点服务器设置状态后,其它服务器不参与处理
获取分布式锁之后,会判断{namespace}/{jobname}/leader/election/in-stance节点是否存在,不存在则创建临时节点并存储内容
问题思考
一次完整选举成功之后,如果主服务器在此期间出现宕机,ElasticJob 如何剔除节点,让从服务器升级主节点并接管?
- 监控主服务器宕机后,将其节点剔除
- 再触发一次选主过程
接下来重点分析事件监控