我想在云中运行一个大型节点集群(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
- 漂亮的图表?