13

我想在云中运行一个大型节点集群(AWS、Heroku,或者可能是自我管理的 VMS),其时钟必须与预定义的容差同步。我正在寻找可能 200 毫秒的容差。这意味着如果我有 250 个节点,那么 250 个节点之间的最大时钟差不应超过 200 毫秒。我并不真正关心与世界相关的实际日期/时间。解决方案必须是容错的,并且不应该依赖于任何一个系统的时钟的准确性——事实上,很可能没有一个时钟会非常准确。

如果由于任何原因确定时钟同步对于任何特定节点不可靠,则要求足够强,由于时钟不同步,我宁愿从集群中删除一个节点 - 所以对于任何可疑的故障,我会希望能够对该节点执行某种类型的受控关闭。

我很想使用 NTP 之类的东西,但根据 NTP已知问题 twiki

NTP 并非设计为在虚拟机内部运行。它需要一个高分辨率的系统时钟,对时钟中断的响应时间具有很高的精度。没有已知的虚拟机能够满足这些要求。

尽管同一个 twiki 然后描述了解决这种情况的各种方法(例如在主机操作系统上运行 ntp),但我不相信我有能力使用 AWS 或在 horoku 上修改环境以遵守解决方法。

即使我没有在 VM 中运行,一位具有多年运行 ntp 经验的值得信赖的运营经理告诉我,由于本地时钟漂移不时,ntp 可以并且将会放弃同步(或明显弄错时间)。它不会经常发生,但确实会发生,并且随着您增加机器,您会增加发生这种情况的机会。AFAIK,检测你离你有多远需要停止 ntpd,运行查询模式命令,然后重新启动它,并且可能需要很长时间才能得到答案。

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

  • 在操作控制受限的虚拟机中运行良好(即:“云服务提供商”)
  • 集群中所有参与者之间的时间容差约为 200 毫秒
  • 能够检测坏节点并以积极的方式对其做出反应
  • 容错(无单点故障)
  • 可扩展(当您添加更多节点时,事情不会倒下——绝对避免 n^2)
  • 可支持数百个节点
  • 任何节点都不应被认为具有优于任何其他节点的时间概念
  • 整个集群漂移(在合理范围内)是可以的——只要它一致漂移

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

很高兴拥有:

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

2 回答 2

2

由于NTP 的常见问题解答明确说明了为什么 NTP 时间同步在虚拟机下不能“正确”工作,这可能是一个无法克服的问题。

大多数机器中都有一个 RTC(实时时钟),在 PC 上它是如何存储时间的,因此如果 ntp 不可用,您可以“粗略”猜测时间是多少,一旦系统加载,就会有一个“更高分辨率的刻度时钟 - 这就是 NTP 设置的。

该滴答时钟受虚拟机漂移的影响,因为滴答可能会也可能不会以正确的间隔发生 - 您尝试使用的任何时间机制都将受到该漂移的影响。

尝试在虚拟机上强制执行 ntp 同步可能不是最佳设计,如果机器 A 和 B 的增量为 200 毫秒,而机器 B 和 C 的增量为 200 毫秒,那么 C 可能距离 A 400 毫秒。你无法控制它。

你最好使用像 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.
于 2012-01-05T13:23:37.547 回答
1

在与虚拟机上的 NTP 斗争了这么多月之后,我们已经切换使用 chrony https://chrony.tuxfamily.org。我发现它在很多方面都远远优于 ntpd(配置、控制、文档、处理 vm 时钟经常和剧烈漂移的问题)。

使用chrony,不要回头看:)

于 2018-08-28T04:19:44.600 回答