问题出现得很突然,日志倒是留得挺全。跑批任务本应一天一次,某天数据量突然翻倍,排查发现两个实例在同一时刻执行了同一份任务。
把日志和配置对完,能解释这个现象的基本就这几处。多台机器都装了同一份任务定义。少数情况下是上一次任务没跑完,下一次已经到点。
另外,锁文件存在但没有做有效性判断。
上来先确认是否多机重复部署
for h in web1 web2; do ssh $h crontab -l; done
接着加互斥锁并立即退出
flock -n /var/lock/job.lock /opt/job.sh
给任务加执行时长上限
timeout 3600 /opt/job.sh
剩下的就是核对重复数据并清理
mysql -e 'select dt,count(*) from t group by dt'
白天有业务在跑,能验证的部分都压到了晚上做。
改完先别撤,确认这几项。连续观察几天,任务每天只执行一次,数据没有重复,锁文件正常释放。
这里还有个坑。锁要放在共享存储或者数据库里,多机部署时本地锁文件各管各的,一样会重复跑。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。