现象
调度中心和执行器系统启动后,执行器注册到调度中心后,间歇性失效,导致调度失败。
数据层面
执行器注册线程运行后,可以正常往xxl_job_registry表中插入数据,但是xxl_job_group表中的address_list字段一直为空,并且xxl_job_registry表中的数据会莫名其妙消失。
注意到的异常
xxl_job_group表中的update_time字段总是比正常时间多出3分钟左右。
原因
调度中心部署在两台服务器上,其中一台服务器的时间比正常时间快了3分钟,导致执行器注册后立刻失效。
xxl-admin和xxl-executor 是通过操作数据库完成执行器注册。
xxl-executor半分钟执行一次,往xxl_job_registry新增或更新执行器信息(根据registry_group、registry_key、registry_value三个字段更新update_time,更新失败则新增)比较简单 。
xxl-admin也半分钟执行一次,1)删除超时的执行器注册信息(xxl_job_registry 中 update_time在1.5分钟以前的数据),2)获取有效的xxl_job_registry,3)根据获取的xxl_job_registry 数据更新xxl_job_group的address_list字段。
因为部署了两台调度中心,比正常时间快3分钟的那台服务器总是清理刚注册的执行器,导致无法获取执行器。
后记
调度系统已经在其他环境安装过,能够正常执行;本地正常执行;但是部署到客户环境后遇到该问题,一开始怀疑时环境问题,未果,后来分析注册模块源码,联想到xxl_job_group异常字段update_time,怀疑是服务器时间问题导致。一开始排查到服务器和数据库的时间不一致,改为一致后,有一段时间确实可以正常注册(数据库比服务器提前10分钟,将服务器按照数据库时间调整,导致问题被掩盖),后来联系用户将服务器和数据库时间调整为标准时间,问题再次出现,偶然想到还部署了另外一个调度中心,果然,这台服务器的时间比正式服务器快了3分钟,停止服务后,问题解决。