如何跨多个节点在云(AWS,heroku等)中建立时钟同步?

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,运行查询模式命令,然后重新启动它,并且可能需要很长时间才能得到答案.

总结一下 - 我需要一个时钟同步,其主要目标如下:

  • 在运营控制有限的VM中运行良好(即:"云服务提供商")
  • 所有参与者之间的集群中的时间容差约为200ms
  • 能够检测坏节点并以主动方式对其作出反应
  • 容错(无单点故障)
  • 可扩展(当你添加更多节点时,这个东西不能倒下 - 绝对避免n ^ 2)
  • 可以支持数百个节点
  • 任何节点都不应被视为具有优于任何其他节点的时间概念
  • 整个集群可以漂移(在合理范围内) - 只要它一致漂移即可

从描述来看,似乎伯克利算法可能是正确的选择,但是它已经实现了吗?

很高兴有:

  • 最小配置(节点自动注册参与) - 对于启动新节点很重要
  • HTML仪表板或(REST?)API,用于报告参与时钟同步的节点以及相对时间偏移量
  • 漂亮的图表?

syn*_*tel 2

由于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)