我想在云中运行一个庞大的节点集群(AWS,Heroku,或者可能是自我管理的VMS),其时钟必须与预定义的容差同步。我正在寻找可能200毫秒的容差。这意味着如果我有250个节点,250个节点中任何一个节点之间的最大时钟差异不应超过200毫秒。我真的不关心世界的实际日期/时间。解决方案必须是容错的,并且不需要依赖任何一个系统的时钟精度 - 实际上,很可能没有一个时钟会非常准确。
要求足够强大,如果由于任何原因确定时钟同步对于任何特定节点不可靠,我宁愿由于时钟失步而从群集中删除节点 - 所以在任何可疑的故障时,我希望能够对该节点执行某种类型的受控关闭。
我喜欢使用像NTP这样的东西,但根据NTP known issues twiki:
NTP并非设计为在虚拟机内运行。 它需要高分辨率系统时钟,响应时钟中断 以高精度提供服务。没有已知的虚拟机 能够满足这些要求。
虽然同样的twiki然后描述了解决这种情况的各种方法(例如在主机操作系统上运行ntp),但我不相信我能够使用AWS或者horoku来修改环境。遵守解决方法。
即使我没有在VM中运行,一位拥有多年运行ntp经验的值得信赖的运营经理告诉我,ntp可以并且会因为本地时钟漂移不良而导致同步失败(或者说时间错误)而。它不会经常发生,但确实会发生,并且随着您增加机器,您会增加发生这种情况的机会。 AFAIK,检测你的距离需要停止ntpd,运行查询模式命令,然后重新启动它,并且可能需要很长时间才能得到答案。
总结一下 - 我需要一个时钟同步,其主要目标如下:
从描述来看,似乎Berkeley Algorithm可能是正确的选择,但是它已经实现了吗?
很高兴:
答案 0 :(得分:1)
由于the FAQ for NTP明确说明了为什么NTP时间同步在虚拟机下无法正常工作,这可能是一个不可逾越的问题。
大多数机器都有一个RTC(实时时钟),在PC上你可以如何存储时间,以便在系统加载后对ntp不可用的时间进行“粗略”猜测有一个'滴答'时钟,分辨率更高 - 这就是NTP设置的。
该刻度时钟受虚拟机的漂移影响,因为滴答可能会或可能不会以正确的间隔发生 - 您尝试使用的任何时间机制都将受到这种漂移的影响。
尝试在虚拟机上强制执行ntp同步可能是次优设计,如果机器A和B的增量为200ms,而机器B和C的增量为200ms,C可能距离A为400ms。你不能控制那个。
你最好使用像zeromq这样的集中式消息传递系统让每个人都与作业队列保持同步,这会带来更多的开销,但依靠系统滴答时间充其量只是一种狡猾的事情。有许多聚类解决方案可以解决群集参与问题,使用各种可靠的机制来确保每个人都同步,看看corosync或传播 - 他们已经为两阶段提交解决了这个问题。
顺便说一下,当漂移过高时,ntp'放弃'可以通过指示它将时间“猛击”到新值而不是“回转”来规避。默认情况下,ntp将逐步更新系统时间,以说明其从“实时”漂移。我忘记了如何在ntpd中配置它,但如果使用ntpdate,则标志为-B
-B Force the time to always be slewed using the adjtime(2) system call, even if the measured
offset is greater than +-128 ms. The default is to step the time using settimeofday(2) if the offset
is greater than +-128 ms. Note that, if the offset is much greater than +-128 ms in this case, it
can take a long time (hours) to slew the clock to the correct value. During this time, the host
should not be used to synchronize clients.
答案 1 :(得分:0)
在VM上使用NTP苦苦挣扎了几个月之后,我们使用了https://chrony.tuxfamily.org来切换时间。我发现它在很多方面(配置,控制,文档,处理虚拟机时钟经常且剧烈漂移的问题)都比ntpd优越。
使用chrony,不要回头:)