跨多台服务器同步脚本执行

跨多台服务器同步脚本执行

我希望同时在多台 Ubuntu 服务器上运行自动化任务(shell 脚本),并尽可能精确地计时。理想情况下,我希望所有服务器上脚本执行开始之间的时间差异小于一秒。这些服务器都位于不同位置,大多数服务器位于不同的时区。但是,我打算运行的任务将以固定的间隔运行,因此时区不应该成为问题。

我目前正在考虑使用它cron来安排每台服务器上的重复任务,但我担心它本身可能不够准确。为了弥补这一点,我考虑使用网络时间协议来确保所有服务器的时钟保持同步(正负时区)。

所以我的问题分为两部分:

  1. 使用cronntp是否足够准确以满足我的需要?
  2. 有没有更好的方法可以解决这个问题?

答案1

由于 cron 存在不同版本,且准确性可能存在差异,因此很难准确回答。

NTP 绝对是此类解决方案的必备工具,请使用 ntpd 而不是 ntpdate,因为 ntpd 会不断将“一秒的长度”调整为正确的一秒长度,而 ntpdate 只会设置时间并允许其再次漂移。系统启动后,它不再使用由电池供电的 RTC 时钟,而是使用 CPU 生成的中断,这种中断更加准确,但可能需要稍微调整。

关于 cron:

来自 cron 的手册页:

然后 cron 被唤醒每一分钟检查所有存储的 crontab,检查每个命令是否应在当前分钟运行。执行命令时,任何输出都会邮寄给 crontab 的所有者(或 crontab 中 MAILTO 环境变量中指定的用户,如果存在)。运行这些进程的 cron 子副本的名称被强制为大写,如 syslog 和 ps 输出中所示。

除非 cron 每分钟唤醒一次立即,您无法保证秒级的准确性,但我建议不要将其视为理所当然,而要进行测试。使用 NTP 同步服务器,安排 cron 作业在一段时间内触摸文件并对其进行统计。

在你接触了足够多的文件之后,你应该能够了解你的 cron 具有什么样的准确性。

如果您的应用程序必须在一秒内同步,或者您的 cron 太不准确,那么最好提前几秒钟启动脚本并使用您的 NTP 同步时钟,让脚本等待正确的时刻来处理您的请求。

编辑:一个快速的 bash 脚本,用于休眠直到指定的分钟:

#!/bin/bash
minute_to_start=$1
minute_now=`date +%M`
minutes_to_wait=`echo $minute_to_start - $minute_now -1 | bc -l`
now=`date +%S.%N`
to_sleep=`echo 60 - $now + \( $minutes_to_wait \* 60 \) | bc -l`
sleep $to_sleep
$2

您可以在 cron 中运行它,如下所示:

29 7 * * * /path/to/above/script.sh 30 'the real script'

工作将于 07:30:00 开始

在我的测试中,它在 10-20 毫秒内漂移,如果你想从 X:00:00.00(整点)开始,它就不起作用,所以这不是我在生产中实际会使用的东西。

答案2

NTP 能够在几微秒内同步服务器的时间。如果硬件时钟确实很差,您可以每小时切换一次以防止出现更大的差距。cron 仅以小时和分钟作为启动时间,但会在 hh:mm:00 启动作业,因此从我的角度来看,您的解决方案是安全的。

相关内容