docker service scale app=3 # 独立调度容器 docker run -d --name cron-runner \ -v /opt/jobs:/opt/jobs job-image /usr/sbin/crond -f
服务从两个副本扩到三个 对账任务的执行记录也跟着变成三份 每条数据被处理三次 下游统计全部翻倍。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:定时任务写在应用镜像的入口脚本里 每个副本都起了一份 crond 副本数一变执行次数就跟着变 没有任何选主或者互斥机制。
围绕「容器 cron 重复执行」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
处理上按这个顺序:把定时任务从应用容器里拆出去 单独用一个副本跑;做不到就加分布式锁 只有抢到锁的实例才执行;锁要带过期时间 保证进程挂掉之后能自动释放。
确认没问题再收工,扩容后执行记录仍然只有一份 下游统计与单副本时保持一致。
