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

目前,我有一个应用程序运行在一台服务器上。 有一个crontab按照特定的规则build立起来,在某些时候有一些任务正在运行。

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

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

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

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

你可以使用类似redis的locking机制。 基本上它会这样工作。

剧本醒来,第一件事就是试着弄锁。 如果获得locking,则向前移动,如果有locking,则退出。 做脚本,然后释放锁。

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

当脚本完成时,删除locking非常重要,并且还要为locking添加一个TTL,这样如果脚本在释放locking之前死亡,locking将在TTL到期后自动打开。

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

在你的情况下一个简单的策略是使用具有不同angular色的容器。 例如,使用5个容器来响应HTTP请求并运行cron,而不是使用5个容器来运行你的应用程序,只有一个专用于cron作业。

如果您需要扩展您的cron作业并添加更多的节点,那么您需要一个分布式队列/locking解决scheme,如@Ken Cochrane所述。