信息
我们目前正在创建高可用性集群适用于运行 PHP 的 NGINX(在 Centos 7 上)。大多数配置已映射,并且应该在集群环境中运行良好。
不幸的是,我们唯一无法弄清楚如何与聚类配合的是cron 作业(cron 作业将执行 PHP 代码)。据我所知,cron 作业在每个主机上单独执行。这意味着我们可以:
- 没有完整的高可用性环境当单台服务器发生故障时,另一台服务器接管,一切仍像以前一样运行(尽管速度较慢)。
- 我们运行每个 cron 作业并将结果保存在数据库中以确定它是否已经运行。这不是一个可行的解决方案,因为我们的一些 cron 作业可能需要几个小时才能运行 - 而且这些作业需要在下一个工作日之前完成。
- 我们找到了某种能够执行高可用性 cron 作业的解决方案。
研究
看看如何解决方案 3有助于我们维护高可用性环境,即首选方法。不幸的是,我们对其中一些解决方案不太熟悉,因此我寻求您的专业知识来帮助我们找到适合我们需求的解决方案。我们对 Linux 机器不太熟悉(除了 NGINX 服务器之外,整个环境都是 Windows),并且对使用这些机器知之甚少(尽管到目前为止我们已经能够弄清楚)。
选项
- 德克朗
- 该解决方案似乎提供了简单的设置,并且看起来是一款不错的产品
- 柯罗诺斯
- 这使用多个其他实用程序来操作,包括实际的数据库(不理想,但可以工作)
- 伦德克
- 似乎提供了很多功能,可能是此列表中最好的产品
- 罗克龙
- 除了它基于 Golang 之外,我对此了解不多。
- 自定义脚本:如何让 cronjobs 具有高可用性?
- 如果其他方法都不起作用,这是一种“如果其他方法都失败”的方法……
- 其他选择???-如果您找到其他选择,请提供,我会将它们包括在这里。
问题
- 您对不同选择有何专业意见或建议?
- 您在使用不同选项时有哪些体验(优点/缺点)?
- 您认为我们在基础设施方面可以使用哪些选项?(如果需要有关我们基础设施的更多信息,请告诉我)
笔记
任何有关此事的帮助都将不胜感激。
我意识到这个问题已经被问过了前,尽管它看起来相当过时(2011),但从那时起已经创建了许多新的解决方案。
答案1
crond
RHEL/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 启动时将看不到任何标志。