信息

信息

信息

我们目前正在创建高可用性集群适用于运行 PHP 的 NGINX(在 Centos 7 上)。大多数配置已映射,并且应该在集群环境中运行良好。

不幸的是,我们唯一无法弄清楚如何与聚类配合的是cron 作业(cron 作业将执行 PHP 代码)。据我所知,cron 作业在每个主机上单独执行。这意味着我们可以:

  1. 没有完整的高可用性环境当单台服务器发生故障时,另一台服务器接管,一切仍像以前一样运行(尽管速度较慢)
  2. 我们运行每个 cron 作业并将结果保存在数据库中以确定它是否已经运行。这不是一个可行的解决方案,因为我们的一些 cron 作业可能需要几个小时才能运行 - 而且这些作业需要在下一个工作日之前完成。
  3. 我们找到了某种能够执行高可用性 cron 作业的解决方案。

研究

看看如何解决方案 3有助于我们维护高可用性环境,即首选方法。不幸的是,我们对其中一些解决方案不太熟悉,因此我寻求您的专业知识来帮助我们找到适合我们需求的解决方案。我们对 Linux 机器不太熟悉(除了 NGINX 服务器之外,整个环境都是 Windows),并且对使用这些机器知之甚少(尽管到目前为止我们已经能够弄清楚)。

选项

  1. 德克朗
    • 该解决方案似乎提供了简单的设置,并且看起来是一款不错的产品
  2. 柯罗诺斯
    • 这使用多个其他实用程序来操作,包括实际的数据库(不理想,但可以工作)
  3. 伦德克
    • 似乎提供了很多功能,可能是此列表中最好的产品
  4. 罗克龙
    • 除了它基于 Golang 之外,我对此了解不多。
  5. 自定义脚本:如何让 cronjobs 具有高可用性?
    • 如果其他方法都不起作用,这是一种“如果其他方法都失败”的方法……
  6. 其他选择???-如果您找到其他选择,请提供,我会将它们包括在这里。

问题

  1. 您对不同选择有何专业意见或建议?
  2. 您在使用不同选项时有哪些体验(优点/缺点)?
  3. 您认为我们在基础设施方面可以使用哪些选项?(如果需要有关我们基础设施的更多信息,请告诉我)

笔记

任何有关此事的帮助都将不胜感激。

我意识到这个问题已经被问过了,尽管它看起来相当过时(2011),但从那时起已经创建了许多新的解决方案。

答案1

crondRHEL/CentOS 7 上的 包括集群支持。它实际上是cronie,是 的一个分支vixie-cron。以下是手册页中的详细信息:

集群支持

在此版本的 Cron 中,可以使用跨主机集群的网络安装共享 /var/spool/cron,并指定只有一个主机应在任何时候运行此目录中的 crontab 作业。这可以通过使用 -c 选项启动 Cron 来实现,并且让 /var/spool/cron/.cron.hostname 文件只包含一行,该行表示集群中应运行作业的主机的主机名。如果此文件不存在,或者其中的主机名与 gethostname(2) 返回的主机名不匹配,则此目录中的所有 crontab 文件都将被忽略。这对 /etc/crontab 文件中指定的 cron 作业或 /etc/cron.d 目录中的文件没有影响。这些文件始终运行并被视为特定于主机的文件。

不要直接编辑 /var/spool/cron/.cron.hostname,而是使用 crontab(1) 的 -n 选项来指定主机。

您应该确保集群中的所有主机以及它们挂载共享 crontab 目录的文件服务器具有紧密同步的时钟,例如,使用 ntpd(8),否则结果将非常难以预测。

在实践中,这种方法需要:

  • 在 /var/spool/cron 上为所有集群系统安装一个共享文件系统;
  • crond所有集群系统都以该标志开始-c(放入CRONDARGS=-c/etc/sysconfig/crond);并且
  • 某种触发器,这样,当负责 cron 作业的系统出现故障时,另一个系统将执行crontab -n以接管。

请记住以下警告:此解决方案仅将 cron 任务群集到 /var/spool/cron 中(即使用 进行设置crontab -e)。每个节点仍将在 /etc/crontab 或 /etc/cron.d 中运行各自的任务。

答案2

为什么不选择 (2),但它会在执行时创建一个标志。 cron 作业将在所有机器上启动,本地时间略有不同,这意味着其中一个机器首先创建标志;然后其他机器看到标志已设置并退出,而第一个机器运行完成。

您需要注意标志设置/检查的原子性(NFS 也是一个选项,带有锁定文件),尽管为了将其保持在最低限度,在以下两种情况下也可能有一些价值:

  • 在每个 cron 任务开始时随机设置一个睡眠时间,让任务稍微分散一点,或者
  • 两个服务器之间任何给定作业的开始时间至少相差 1 分钟,即服务器 1 在 7:02 开始作业,服务器 2 在 7:03 开始​​作业;通常服务器 1 将完成整个作业,但如果服务器发生故障,则服务器 2 在 7:03 启动时将看不到任何标志。

答案3

我用詹金斯管理约140个预定脚本。

Jenkins 并不是作为 cron 的替代品而设计的服务器,它用于持续集成,但你可以用他来管理几乎所有的事情。

这里有一些成功的人(就像我一样)将任务从 cron 转移到 Jenkins

这里Jenkins 和 cron 之间的良好比较

相关内容