我搭建了两个Elastic-Job的节点,同时在这两个节点服务器上,有配置了keepalived给其他组件用(也就是eth0上面绑定了一个内网IP,同时又绑定了一个虚拟IP),结果发现相同的JOB会运行两次,也就是两个节点都同时运行了。如果把keepalived关掉,就只会有一个节点运行了。请问,这个是elastic-job的问题,还是zookeeper的问题呢?有没有办法解决?
elastic-job版本:2.0.3
job的配置:
<reg:zookeeper id="regCenter" server-lists="${zookeeper.servers}" namespace="macc-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />
<!-- apmgt -->
<job:simple id="sampleJOb" class="com.test.sample" registry-center-ref="regCenter" cron="${sample.job.cron}" monitor-execution="false" failover="true" overwrite="true" sharding-total-count="1" sharding-item-parameters="0=A" />
是不是没有在业务代码中写哪个分片对应什么操作?
我感觉可能和zk的环境有关?用了两个不同的zk么?或是不同的namespace?
回复 @亮_dangdang :
亮哥,我想,是不是这个原因导致的呢:
1. elastic-job获取ip是通过这个方法的:com.dangdang.ddframe.job.util.env.IpUtils.getIp();
2. 我的服务器网卡信息是:eth0:172.18.139.83; lo:127.0.0.1;lo:0:172.18.139.88,结果上面的getIp()返回的88,而88这个地址,是因为我这台服务器是作为LVS的后端realserver,所以有两台服务器的lo:0都绑定了88这个ip地址;另外,getIp()在while循环中获取到private地址的顺序是83,然后88,由于获取到private后,并没有break,所以两台服务器都返回88的地址,最终导致两台服务器的job都同时运行了
不知会不会是这个原因?
升级到2.1.5版本,已解决。