在缩放的镜像服务器上运行 cron(需要 cron 逻辑)

在缩放的镜像服务器上运行 cron(需要 cron 逻辑)

我有一个在 Rackspace 上运行的客户端,它们有三个完全同步的服务器,我使用 wget 在 crontab 中添加了一堆 crons,使用 wget 获取 cron 的网址(同步到每个服务器)。当您访问客户端的域时,负载均衡器会为您服务。

我只想在一台特定服务器 (web01) 上运行一次 crons

问题是,当每台服务器运行 crontab 时,每台服务器都会运行 x3。因此,我在 PHP 中检查主机名是否为 web01 以外的其他名称,但是由于我们使用 WGET 并且它们通过负载均衡器运行,我们发现 LB 向 web01 发送两个请求,另一个向 web01 发送两个请求。到 web02 或 web03。

我认为这需要完全在 crontab 中完成,检查当前服务器是否为 web01 并在 IF 语句内运行 cron 作业,否则什么也不做,但我不完全确定用 IF 表达这一点的最佳方式陈述。

答案1

您拥有三台配置几乎相同的服务器,但您只想cron在其中一台上运行作业?

让我们遵循您的服务器命名方案:web01web02web03。我使用的是shell脚本,但原理与PHP完全相同。 (我可以随意使用 PHP,但我认为自己还不够精通,无法公开编写它。)

在每个脚本的顶部附近,cron您可以执行类似的操作,这将导致脚本退出,除非服务器名称为web01

[ web01 != "$(hostname)" ] && exit

面对服务器中断时,这不是很有弹性。如果web01死亡,您可能想在另一台服务器上接手cron工作。假设您有权访问 DNS,您可以为负责运行cron.这是bind;的示例条目其他系统也类似:

cron.contoso.com 300 IN CNAME web01.contoso.com

然后,您可以使用 或dignslookup将服务器名称与别名进行比较,并且在五分钟(300 秒)内您可以将职责交换cron到另一台服务器:

myaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
cronaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
[ "$myaddr" != "$cronaddr" ] && exit

或者:

myaddr="$(dig +short "$(hostname).contoso.com")"
cronaddr="$(dig +short cron.contoso.com)"
[ "$myaddr" != "$cronaddr" ] && exit

相关内容