如何在Docker集群中安排任务是最好的方法?

6

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

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

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

我不能简单地将crontab打包到我的docker镜像中,因为当有5个容器运行时,该命令会被启动5次。我希望只在运行容器的数量上独立地启动它一次。

实现这个的理想解决方案是什么?

2个回答

6
你可以使用锁机制,例如redis。基本上,它的工作原理如下。
脚本唤醒后,首先尝试获取锁。如果获取到锁,则继续执行;如果已经有其他进程持有锁,则退出。执行脚本操作,然后释放锁。
由于一次只能有一个脚本获取锁,因此它只允许该脚本运行一次。
很重要的一点是,在脚本完成后删除锁,并为锁添加TTL,以便在脚本在释放锁之前死亡时,锁会在TTL过期后自动打开。
以下是关于如何将Redis用作分布式锁的文档:https://redis.io/topics/distlock

我认为Consul将是这种情况的理想选择。 - f-society
谢谢你提供的解决方案,特别是建议使用Redis来确切实现它!@f-society 你为什么认为Consul是理想的? - simPod

1

对于您的情况,一个简单的策略是使用具有不同角色的容器。例如,不要使用响应HTTP请求和运行cron的5个容器,而是使用4个仅运行应用程序的容器和一个专门用于cron作业的容器。

如果您需要扩展cron作业以添加更多节点,则需要像@Ken Cochrane描述的分布式队列/锁定解决方案。


感谢您提供的解决方案。由于这看起来非常可行,我将接受Ken的解决方案,因为正如您所说,它是可扩展的,并且可能需要更少复杂的部署设置。但是我一定会投票支持这个方案! - simPod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接