php - 负载平衡 Web 服务器上的 Cron 任务

标签 php cron load-balancing

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

目前有:

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

寻找:

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

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

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

谢谢。

最佳答案

你可以使用这个使用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/监控 worker 并查看报告

关于php - 负载平衡 Web 服务器上的 Cron 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457961/

相关文章:

mysqldump 表选定行 cron 作业

amazon-ec2 - Memcached 无法与 AWS Classic Load Balancer 一起使用

performance - Sitecore - 负载平衡 Lucene 查询

php - PHP 中的平衡自动换行(最小粗糙度)

php - 静态资源被错误地重写为前端 Controller index.php

php - Laravel:使用可选的用户输入过滤 Eloquent

php - 从 php 脚本设置 cron 作业以运行另一个 php 脚本?

linux - Perl Cron Scheduler : start at x time, 永远每 y 分钟执行一次

web-services - JAX-WS Web 服务,使用 HTTPS 端点 URL 而不是 HTTP 的负载平衡器

php - pdo update 语句 - 在同一语句中保存和更新值?