在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所述。
- Docker本地私人注册跨区域设置
- hbase 0.98 docker中的create_namespace上的空指针exception
- 运行时将环境variables传递给kubernetes
- 我怎样才能访问bluemix单容器上的端口8080和9990的野驴?
- Docker正在填充我的磁盘空间
- 将服务从一个docker集装箱迁移到另一个,停机时间为零
- 拨号TCP 127.0.0.1:3306:getsockopt:连接拒绝“当试图运行一个泊坞窗图像
- swift 3.1.1.-release on linux copyItem(atPath:toPath :)尚未实现
- pm2-docker的“唯一”论点是什么?