docker service scale app=3
# 独立调度容器
docker run -d --name cron-runner \
  -v /opt/jobs:/opt/jobs job-image /usr/sbin/crond -f

服务从两个副本扩到三个 对账任务的执行记录也跟着变成三份 每条数据被处理三次 下游统计全部翻倍。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:定时任务写在应用镜像的入口脚本里 每个副本都起了一份 crond 副本数一变执行次数就跟着变 没有任何选主或者互斥机制。

围绕「容器 cron 重复执行」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:把定时任务从应用容器里拆出去 单独用一个副本跑;做不到就加分布式锁 只有抢到锁的实例才执行;锁要带过期时间 保证进程挂掉之后能自动释放。

确认没问题再收工,扩容后执行记录仍然只有一份 下游统计与单副本时保持一致。

作者 9823189