Docker并行运行cron作业

时间:2017-06-08 15:32:42

标签: docker parallel-processing cron docker-swarm

使用简单服务器

我使用一个简单的节点(centos或ubuntu)来运行我的Web应用程序,并在那里配置了一些cron作业来运行计划任务。在那一刻,一切都很有效。

使用Docker Swarm Cluster

我将我的应用程序迁移到Docker Swarm集群。现在,crons同时在多个容器中运行,这对我来说至关重要。我知道Docker正在开发名为 jobs 的新功能,但我现在需要一个解决方案。我想知道是否有任何方法可以运行一种cron作业流程。

拦截

crons正在执行以下任务:

  • 创建有关流程的报告。
  • 向其他服务发送通知。
  • 更新应用程序中的数据。

crons需要在服务器上运行,因为它们被配置为使用php命令来使用接口和端点。

我的问题

我创建了同一个docker服务的多个实例来提供可用性。所有实例都在3个节点的集群中运行,并且每个节点都在同时并行运行其cron作业,我希望每个docker服务只运行一个作业。

2 个答案:

答案 0 :(得分:0)

也许这将是一个解决方案,定期创建一个docker服务,重启条件为none和replicas 1或创建一个带有副本1和重启条件的cron容器,它将是调度程序并附加一个包含所需cron脚本的卷。

答案 1 :(得分:0)

有多种选择。

  1. 使用锁定机制锁定 NFS 或数据库(MySQL、Redis 等)。您像这样执行每个作业:/usr/local/bin/locker /path/to/script args。如果锁不可用(阻塞、非阻塞),最好提供更衣室选项以等待锁或立即失败。因此,如果作业长时间运行,则只有第一个会获取锁,其他的会失败。您可能希望重用 some existing software 以简化创建可靠锁的艰巨工作。

  2. 使用领导者选择。在集群中运行时,必须有一种机制来查询容器列表。仅列出 cron 容器,并按字母顺序对其进行排序。如果当前容器的 id 是第一个,则允许执行。 first=$(get-containers cron | sort | head -n 1); if [[ "$current-id" == "$first" ]]; then ... fi

  3. 在集群外运行 cron,但使用它通过负载均衡器触发集群内的作业。负载均衡器会选择一个容器来执行作业。例如curl -H 'security-key: xxx' HTTP://the.cluster/my-job

  4. 我确信有特定于 swarm 的工具/方法可用。 A link.