首页 文章

负载 balancer Web服务器上的Cron任务

提问于
浏览
14

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

Currently have

  • 在负载均衡器后面的3个CentOS服务器上运行的PHP应用程序 .

  • 需要定期运行但一次只能在一台机器上运行的任务 .

  • 好旧的cron设置为在第一台服务器上运行这些任务 .

  • 如果第一台服务器因任何原因无法播放,则会出现问题 .

Looking for

  • 更强大和分散的东西 .

  • 负载 balancer 任务,以便多个任务只运行一次,但在随机/不同的服务器上分散负载 .

  • 防止第一台服务器出现故障时没有运行任务 .

  • 能够管理任务并理想地使用Web界面查看汇总报告 .
    如果出现任何问题,

  • 通知 .

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

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

谢谢 .

3 回答

  • 0

    您可以使用这个使用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 们看到报告

  • 5

    假设您有一个数据库没有托管在这3台服务器之一上;

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

    Cron在每个服务器上设置包装器,每个服务器设置在另一个服务器后面X分钟(服务器A运行在一小时的顶部,服务器B运行在5分钟,C运行在10分钟,等等) .

    第一个服务器将始终首先执行cron,因此其他两个服务器永远不会 . 如果第一台服务器发生故障,第二台服务器将看到它没有运行,并将运行它 .

    如果您还在表中记录执行该作业的服务器,则您将记录脚本执行的时间/位置 .

  • 3

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

相关问题