在 docker 集群中安排任务的最佳方法是什么?
What's the best approach to schedule tasks across docker cluster?
目前,我在一台服务器上有一个应用程序 运行ning。有一个 crontab 设置,所以根据指定的规则,在特定时间有任务 运行。
现在,我正在考虑将我的应用程序迁移到 docker 容器中,这样我就可以独立地 运行 我的应用程序的多个实例。我想知道如何做的事情是 How to schedule tasks across multiple docker containers.
假设我有一个 php 命令,每小时通过 API 从第 3 方应用程序获取新数据。目前,我会使用 cron 来安排它:0 */1 * * * php /some/path/index.php mycommand
。可以有多个以不同频率启动的相似命令。
我不能简单地将 crontab 打包到我的 docker 映像中,因为当有 5 个容器 运行ning 时,该命令将启动 5 次。我只想在运行宁容器数上独立启动一次。
实现这一目标的理想解决方案是什么?
你可以使用锁定机制,使用像 redis 这样的东西。基本上它会像这样工作。
脚本唤醒后,它做的第一件事就是尝试获取锁。如果它获得了锁,那么它会向前移动,如果其他东西获得了锁,那么它就会退出。执行脚本的操作,然后释放锁。
由于一次只有一个脚本可以获取锁,所以它只会允许脚本运行一次。
重要的是在脚本执行完后要解除锁,还要给锁加上一个TTL,这样如果脚本在释放锁之前死掉了,TTL过期后锁会自动打开。
这里有一些关于如何使用 Redis 作为分布式锁的文档。 https://redis.io/topics/distlock
在您的情况下,一个简单的策略是使用具有不同角色的容器。例如,不是使用 5 个容器来响应 HTTP 请求和 运行 cron,您可以有 4 个容器 运行 您的应用程序,一个专门用于 cron 作业。
如果您需要扩展 cron 作业以添加更多节点,那么您将需要一个分布式 queue/lock 解决方案,如 @Ken Cochrane 所述。
目前,我在一台服务器上有一个应用程序 运行ning。有一个 crontab 设置,所以根据指定的规则,在特定时间有任务 运行。
现在,我正在考虑将我的应用程序迁移到 docker 容器中,这样我就可以独立地 运行 我的应用程序的多个实例。我想知道如何做的事情是 How to schedule tasks across multiple docker containers.
假设我有一个 php 命令,每小时通过 API 从第 3 方应用程序获取新数据。目前,我会使用 cron 来安排它:0 */1 * * * php /some/path/index.php mycommand
。可以有多个以不同频率启动的相似命令。
我不能简单地将 crontab 打包到我的 docker 映像中,因为当有 5 个容器 运行ning 时,该命令将启动 5 次。我只想在运行宁容器数上独立启动一次。
实现这一目标的理想解决方案是什么?
你可以使用锁定机制,使用像 redis 这样的东西。基本上它会像这样工作。
脚本唤醒后,它做的第一件事就是尝试获取锁。如果它获得了锁,那么它会向前移动,如果其他东西获得了锁,那么它就会退出。执行脚本的操作,然后释放锁。
由于一次只有一个脚本可以获取锁,所以它只会允许脚本运行一次。
重要的是在脚本执行完后要解除锁,还要给锁加上一个TTL,这样如果脚本在释放锁之前死掉了,TTL过期后锁会自动打开。
这里有一些关于如何使用 Redis 作为分布式锁的文档。 https://redis.io/topics/distlock
在您的情况下,一个简单的策略是使用具有不同角色的容器。例如,不是使用 5 个容器来响应 HTTP 请求和 运行 cron,您可以有 4 个容器 运行 您的应用程序,一个专门用于 cron 作业。
如果您需要扩展 cron 作业以添加更多节点,那么您将需要一个分布式 queue/lock 解决方案,如 @Ken Cochrane 所述。