【问题标题】:Cron Tasks on load balanced web servers负载平衡的 Web 服务器上的 Cron 任务
【发布时间】:2011-09-21 10:13:29
【问题描述】:

我正在寻找更好的解决方案来在负载平衡的环境中处理我们的 cron 任务。

目前有

  • PHP 应用程序在负载平衡器后面的 3 个 CentOS 服务器上运行。
  • 需要定期运行但一次只能在单台计算机上运行的任务。
  • 设置好旧 cron 以在第一台服务器上运行这些任务。
  • 如果第一台服务器出于某种原因无法运行,则会出现问题。

正在寻找

  • 更强大和去中心化的东西。
  • 对任务进行负载平衡,这样多个任务将只运行一次,但会在随机/不同的服务器上运行以分散负载。
  • 防止在第一台服务器出现故障时任务不运行。
  • 能够管理任务并在理想情况下使用 Web 界面查看汇总报告。
  • 出现任何问题时的通知。

该解决方案不需要在 PHP 中实现,但它会很好,因为它可以让我们在需要时轻松调整它。

我发现了两个看起来很有希望的项目。 GNUBatchJob Scheduler。很可能会进一步测试两者,但我想知道是否有人对上述问题有更好的解决方案。

谢谢。

【问题讨论】:

  • 可以通过在最可靠的服务器(或完全其他服务器)上通过 SSH 随机执行其中一台服务器上的实际作业来解决一次一个问题。由于只有一台机器负责调度,因此您不必担心所有服务器之间的同步/锁定。

标签: php cron load-balancing


【解决方案1】:

假设您有一个未托管在这 3 个服务器之一上的可用数据库;

编写一个“包装器”脚本,将其放入 cron 中,并将您正在运行的程序作为其参数。它所做的第一件事是连接到远程数据库,并检查上次将条目插入表(为此包装器创建)的时间。如果最后一次插入时间大于它应该运行的时间,则将一条新记录插入到当前时间的表中,并执行包装器的参数(您的 cron 作业)。

在每台服务器上运行包装器,每台服务器落后 X 分钟(服务器 A 在整点运行,服务器 B 在 5 分钟运行,C 在 10 分钟运行,等等)。

第一台服务器总是先执行 cron,所以其他两台服务器永远不会。如果第一台服务器出现故障,第二台服务器将看到它没有运行,并运行它。

如果您还在表中记录执行该作业的服务器,您将获得脚本执行时间/地点的日志。

【讨论】:

  • 谢谢科里。我们已经找到了一些以类似方式工作的解决方案。然而,这并不真正符合我们的标准,与纯 cron 相比,唯一的好处是如果第一个服务器出现故障,则可以在第二个或第三个服务器上进行回退。问题不在于如何编写,而在于是否已经有经过测试的成熟解决方案。
  • 我很好奇你现在用的是什么?
  • 我们只使用我在“当前拥有”部分中描述的内容。那是 cron 直接在第一个盒子上触发所需的任务。
【解决方案2】:

这不是使用消息/任务队列的理想情况吗?

【讨论】:

    【解决方案3】:

    你可以使用这个使用redis的小库来创建一个临时的定时锁:

    https://github.com/AlexDisler/MutexLock

    服务器应该是相同的并且具有相同的 cron 配置。首先创建锁的服务器也将执行该任务。其他服务器将看到锁定并退出而不执行任何操作。

    例如在执行定时任务的php文件中:

    MutexLock\Lock::init([
      'host'   => $redisHost,
      'port'   => $redisPort
    ]);
    
    // check if a lock was already created,
    // if it was, it means that another server is already executing this task
    if (!MutexLock\Lock::set($lockKeyName, $lockTimeInSeconds)) {
      return;
    }
    
    // if no lock was created, execute the scheduled task
    scheduledTaskThatRunsOnlyOnce();
    

    要以去中心化的方式运行任务并分散负载,请查看:https://github.com/chrisboulton/php-resque 它是 resque 的 ruby​​ 版本的 php 端口,它以完全相同的格式存储数据,因此您可以使用 https://github.com/resque/resque-webhttp://resqueboard.kamisama.me/ 来监控工作人员并查看报告

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多