【问题标题】:Docker run cron jobs in parallelDocker 并行运行 cron 作业
【发布时间】:2017-11-10 10:02:33
【问题描述】:

使用简单的服务器

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


使用 Docker Swarm 集群

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


拦截器

cron 正在运行以下任务:

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

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


我的问题

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

【问题讨论】:

    标签: docker parallel-processing cron docker-swarm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      有多种选择。

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

      2. 使用领导者选择。在 swarm 中运行时,必须有一种机制来查询容器列表。仅列出 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.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 2018-12-27
        • 2013-07-02
        • 2014-11-02
        • 1970-01-01
        相关资源
        最近更新 更多