[xuxueli/xxl-job]mysql双主情况下任务重复执行的问题

2023-12-22 857 views
4
Which version of XXL-JOB do you using?

2.2.0

Expected behavior

mysql双主通过haproxy负载,xxl-job-admin部署两台,任务偶尔会重复执行的情况

Actual behavior

mysql双主的情况下,不会出现任务重复调用

Steps to reproduce the behavior

xxl-job-admin连接mysql数据连接改为haproxy负载的连接地址 另JobScheduleHelper中数据库悲观锁select * from xxl_job_lock where lock_name = 'schedule_lock' for update的数据连接使用jdbc实时请求haproxy主备的mysql连接,保证悲观锁生效,发现任务有时候会重复执行,并且任务执行时间有时候为空 image

悲观锁使用的是haproxy的主备mysql的地址,悲观锁生效应该不会出现任务重复执行的情况,望解答 谢谢

回答

3

我这边调度器和执行器都是单节点,偶尔也会遇到重复执行,并且任务执行时间为空的情况

2

执行器那边任务执行成功了,并且打印了完整的日志“xxl-job job callback finish”。看代码客户端执行完成后会回调调度器接口,调度器修改日志状态,但实际上并没有,而且没有error级别日志。

3

我这边是用双数据源 xxl悲观锁是主备、其余数据库操作是负载,后面想了下应该是和mysql双主同步延时有关,更新执行时间时此数据还未同步到另一个主,空更新。后面数据源都改为主备,未出现此情况。

3

我们数据库现在是读写分离的主从复制架构,极端情况还是可能出现重复调度。比如调度完成后会修改xxl_job_info.trigger_next_time,这里改的是主库,如果主从之前同步有延迟的话,下一轮调度时查询的是从库的xxl_job_info.trigger_next_time,读到的有可能不是最新的数据,从而导致重复调度。

感觉要解决的话调度器可能得连单一数据源,或者业务方来解决重复调度的问题。

但是我始终没搞懂我们单主数据库的情况下,更新执行时间为何会为空,按理说单主不会出现更新为空的情况啊。

8

任务结果丢失了吧, image xxl-job本身也有监控

2

调度器认为丢失的逻辑是xxl_job_log.executor_address与xxl_job_registry.registry_value不一致,而且会修改handle_code=500,handle_msg=“任务结果丢失,标记失败”。有几个标记丢失的是执行器重启过。 image

8

具体的不太了解