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

poi*_*son 14 php cron load-balancing

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

目前有:

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

寻找:

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

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

我找到了两个看起来很有希望的项目.GNUBatchJob Scheduler.最有可能进一步测试两者,但我想知道是否有人有更好的解决方案.

谢谢.

Ale*_*lex 5

您可以使用这个使用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();
Run Code Online (Sandbox Code Playgroud)

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