Ber*_*ier 11 cloud clock ntp clock-synchronization
我想在云中运行一个庞大的节点集群(AWS,Heroku,或者可能是自我管理的VMS),其时钟必须与预定义的容差同步.我正在寻找可能200毫秒的容差.这意味着如果我有250个节点,250个节点中任何一个节点之间的最大时钟差异不应超过200毫秒.我真的不关心世界的实际日期/时间.解决方案必须是容错的,并且不需要依赖任何一个系统的时钟精度 - 实际上,很可能没有一个时钟会非常准确.
要求足够强大,如果由于任何原因确定时钟同步对于任何特定节点不可靠,我宁愿由于时钟失步而从集群中丢弃节点 - 所以在任何可疑的故障时,我都会喜欢能够执行该节点的某种类型的受控关闭.
我喜欢使用类似NTP的东西,但根据NTP 已知问题twiki:
NTP不是为在虚拟机内部运行而设计的.它需要一个高分辨率的系统时钟,响应时间到时钟中断,并以高精度提供服务.没有已知的虚拟机能够满足这些要求.
虽然然后同样的twiki描述了解决这种情况的各种方法(例如在主机操作系统上运行ntp),但我不相信我能够使用AWS或者horoku来修改环境以符合解决方法.
即使我没有在VM中运行,一位拥有多年运行ntp经验的值得信赖的运营经理告诉我,由于每隔一段时间内本地时钟漂移不良,ntp可以并且会丢失同步(或者说得失时间).它不会经常发生,但确实会发生,并且随着您增加机器,您会增加发生这种情况的机会.AFAIK,检测你的距离需要停止ntpd,运行查询模式命令,然后重新启动它,并且可能需要很长时间才能得到答案.
总结一下 - 我需要一个时钟同步,其主要目标如下:
从描述来看,似乎伯克利算法可能是正确的选择,但是它已经实现了吗?
很高兴有:
由于NTP 的常见问题解答明确说明了为什么 NTP 时间同步在虚拟机下无法“正常”工作,因此这可能是一个无法克服的问题。
大多数机器都有一个 RTC(实时时钟),在 PC 上它是您存储时间的方式,以便您可以“粗略”猜测时间,如果 ntp 不可用,一旦系统加载,就会出现“滴答时钟的分辨率更高 - 这就是 NTP 设置的。
该滴答时钟会受到虚拟机漂移的影响,因为滴答可能会或可能不会以正确的间隔发生 - 您尝试使用的任何时间机制都将受到该漂移的影响。
如果机器 A 和 B 的增量为 200 毫秒,而机器 B 和 C 的增量为 200 毫秒,则 C 可能与 A 相差 400 毫秒,尝试在虚拟机上强制执行 ntp 同步可能是次优的设计。您无法控制这一点。
你最好使用像 Zeromq 这样的集中式消息系统来让每个人都与作业队列同步,这会增加开销,但依赖系统滴答时间充其量是一件狡猾的事情。有许多集群解决方案使用各种可靠的机制来考虑集群参与,以确保每个人都同步,看看 corosync 或 spread - 他们已经解决了诸如两阶段提交之类的问题。
顺便说一句,当漂移太高时 ntp“放弃”可以通过指示 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.
Run Code Online (Sandbox Code Playgroud)