gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:18:13 25 4
gpt4 key购买 nike

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

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

我很想使用 NTP 之类的东西,但根据 NTP known issues twiki :

NTP was not designed to run inside of a virtual machine. It requires a high resolution system clock, with response times to clock interrupts that are serviced with a high level of accuracy. No known virtual machine is capable of meeting these requirements.

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

即使我没有在虚拟机中运行,一位拥有多年运行 ntp 经验的值得信赖的运营经理告诉我,由于本地时钟漂移每次都会导致 ntp 可以并且将会放弃同步(或者简单地得到时间错误)。尽管。这种情况并不经常发生,但确实会发生,并且随着机器的增加,发生这种情况的机会也会增加。 AFAIK,检测距离有多远需要停止 ntpd,运行查询模式命令,然后再次启动它,并且可能需要很长时间才能得到答案。

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

  • 在操作控制有限的虚拟机(即“云服务提供商”)中运行良好
  • 集群中所有参与者之间的时间容差约为 200 毫秒
  • 能够检测坏节点并主动使用react
  • 容错(无单点故障)
  • 可扩展(当你添加更多节点时,东西不会折叠——绝对避免 n^2)
  • 可以支持数百个节点
  • 任何节点都不应被视为比任何其他节点具有更优越的时间概念
  • 整个集群发生漂移(在合理范围内)是可以的——只要它一致漂移

从描述来看,似乎是 Berkeley Algorithm在这里可能是正确的选择,但它已经实现了吗?

值得拥有:

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

最佳答案

the FAQ for NTP具体说明了为什么 NTP 时间同步在虚拟机下无法“正常”工作,这可能是一个无法克服的问题。

大多数机器都有一个 RTC(实时时钟),在 PC 上,它是您存储时间的方式,以便在系统加载后,如果 ntp 不可用,您可以“粗略”猜测时间是什么有一个更高分辨率的“滴答”时钟 - 这就是 NTP 设置的。

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

如果机器 A 和 B 的增量为 200 毫秒,而机器 B 和 C 的增量为 200 毫秒,则 C 可能与 A 相差 400 毫秒,尝试在虚拟机上强制实现 ntp 同步可能不是最理想的设计。控制那个。

你最好使用像 Zeromq 这样的集中式消息系统来让每个人都与作业队列同步,这会增加开销,但依赖系统滴答时间充其量是一件危险的事情。有许多集群解决方案使用各种可靠的机制来考虑集群参与,以确保每个人都同步,看看 corosync 或 spread - 他们已经解决了诸如两阶段提交之类的问题。

顺便说一句,当漂移太高时,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.

关于cloud - 如何在云(AWS、heroku 等)中跨多个节点建立时钟同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com