跨 Docker 集群安排任务的最佳方法是什么?

sim*_*Pod 6 cron containers scheduler docker

目前,我有一个应用程序在一台服务器上运行。设置了一个 crontab,以便根据指定的规则,在特定时间运行一些任务。

现在,我正在考虑将我的应用程序迁移到 Docker 容器中,以便我能够独立运行我的应用程序的多个实例。我想知道如何做是如何跨多个 docker 容器安排任务

假设我有一个 php 命令,每小时通过 API 从 3rd 方应用程序获取新数据。目前,我会使用 cron 来安排它,如下所示:0 */1 * * * php /some/path/index.php mycommand。可以有多个以不同频率启动的类似命令。

我不能简单地将 crontab 打包到我的 docker 镜像中,因为当有 5 个容器运行时,该命令将启动 5 次。我只想根据正在运行的容器计数独立启动它一次。

实现这一目标的理想解决方案是什么?

Ken*_*ane 6

您可以使用锁定机制,例如 redis。基本上它会像这样工作。

脚本醒来后,它做的第一件事就是尝试获取锁。如果它获得了锁,则继续前进,如果其他东西获得了锁,则退出。执行脚本执行的操作,然后释放锁。

由于一次只有一个脚本可以获得锁,因此它只允许该脚本运行一次。

重要的是,当脚本完成时移除锁,并且还要给锁添加一个 TTL,这样如果脚本在释放锁之前死掉,那么锁会在 TTL 过期后自动打开。

这里有一些关于如何使用 Redis 作为分布式锁的文档。https://redis.io/topics/distlock