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

2024-01-23

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

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

我很想使用 NTP 之类的东西,但根据 NTP已知问题 http://twiki.ntp.org/bin/view/Support/KnownOsIssues:

NTP 并非设计用于在虚拟机内运行。 它需要高分辨率的系统时钟,以及对时钟中断的响应时间 提供高精度服务。没有已知的虚拟机 能够满足这些要求。

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

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

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

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

从描述来看,似乎是伯克利算法 http://en.wikipedia.org/wiki/Berkeley_Algorithm在这里可能是正确的选择,但它已经实施了吗?

很高兴拥有:

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

Since NTP 常见问题解答 http://twiki.ntp.org/bin/view/Support/KnownOsIssues#Section_9.2.2.具体说明了为什么 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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在云(AWS、heroku 等)中跨多个节点建立时钟同步? 的相关文章

随机推荐

  • 修改python-docx中paragraph.style._element.xml中的XML

    我想修改边框的颜色 我通过调用获取它的 XMLstyle element xml gt gt gt document Document gt gt gt run document add heading u 0 add run hello
  • Android 6 异常(谷歌地图?)

    我在 firebase 崩溃报告中遇到异常 但不明白异常原因 应用程序在 Android 5 上运行良好 Exception java lang IllegalAccessError Method java lang Object ade
  • 在 Python 中迭代 XML 标签并获取元素的 xpath

    我想迭代 XML 文档中的每个 p 标签 并能够获取当前元素的 xpath 但我没有找到任何可以做到这一点的东西 我尝试过的代码类型 from bs4 import BeautifulSoup xml file open data xml
  • 彗星服务器选择问题

    我想写一个使用comet技术进行实时更新的php网站 我有几个问题 使用彗星服务器更好吗 彗星服务器哪家好 对于comet服务器 例如orbited 我必须首先安装基于python的orbited服务器 然后编写php文件来创建套接字以连接
  • 使用 fftw 和窗函数生成正确的频谱图

    对于一个项目 我需要能够从 WAV 文件生成频谱图 我读过以下应该做的事情 获取N 变换大小 个样本 Apply a window http en wikipedia org wiki Window function功能 使用样本进行快速傅
  • 将 CancellationToken 传递给任务类构造函数有什么用?

    以下是创建模拟长时间运行流程的新任务的示例代码 该任务本身并没有太多内容 只是专注于取消功能 我正在使用取消令牌来取消任务 并且代码对我来说工作正常 CancellationTokenSource CTS new CancellationT
  • 使用 VBA 在 Excel 中选择形状

    我正在尝试使用 VBA 按名称选择形状 在我的工作表中 我有 10 个形状 名称分别为 1 到 10 并且想要一个特定的形状 由于某种原因 excel 使用我的代码选择的形状似乎不是我告诉它选择的名称的形状 据我所知 它选择的形状是随机的
  • 无法将“Vary”标头附加到响应中

    我正在尝试添加一个Vary Accept Encoding我压缩的文件的响应头 正如之前所建议的 https stackoverflow com questions 7848796 what does varyaccept encoding
  • 根据任意分布设置 Eigen::Matrix 的系数

    Eigen Matrix 有一个 setRandom 方法 它将矩阵的所有系数设置为随机值 但是 是否有一种内置方法可以将所有矩阵系数设置为随机值 同时指定要使用的分布 有没有办法实现类似以下内容 Eigen Matrix3f myMatr
  • SqlDependency 仅在订阅时触发

    我正在尝试利用SqlDependancy在 SignalR 项目中 但我似乎无法得到OnChanged事件多次触发 它最初在订阅事件上触发 但在对底层数据库进行更改后不会再次触发 我省略了 SignalR 和控制器代码 因为问题似乎出在存储
  • PHP 引导基础知识

    我正在编写我的第一个 PHP 应用程序 每个人都谈论拥有一个bootstrap php初始化您的应用程序 这是有道理的 我已经整理了一个我很满意的 有两件事我不明白 而且似乎没有人提到 我在哪里调用我的引导表单 我是否将其包含在每个页面中
  • C++ 中的 IPv6 连接测试

    是否有任何 C 函数可以测试运行我的程序的计算机是否支持 IPv6 连接 我需要知道类似此页面的结果http test ipv6 com http test ipv6 com 但是在 C 中 EDIT 我试图使用getifaddrs 但返回
  • 如何从 FTP 获取文件(使用 C#)?

    现在我知道如何将文件从一个目录复制到另一个目录 这非常简单 但现在我需要对 FTP 服务器上的文件执行相同的操作 你能给我一些如何在更改文件名的同时从 FTP 获取文件的示例吗 看一眼如何 使用 FTP 下载文件 http msdn mic
  • 将动态加载的自定义 ASP 控件的脚本注册到 DOM

    我在 a 期间加载我的 ascx 控件postback 下拉更改事件 父级 C private void ddlChange MyControl myCtr CallScript Page LoadControl Controls MyCo
  • 通过单击按钮填充 Javascript 中的文本框 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图通过单击表单按钮来填充表单上的
  • WebClient DownloadString UTF-8 不显示国际字符

    我尝试将网站的 html 保存在字符串中 该网站具有国际字符 即使我将编码设置为与网站字符集相对应的 UTF 8 它们也不会保存到字符串中 这是我的代码 using WebClient client new WebClient client
  • 优化多重连接

    我正在尝试找出一种方法来加速一个特别繁琐的查询 该查询按日期在几个表中聚合一些数据 下面是完整的 丑陋的 查询以及EXPLAIN ANALYZE以表明它是多么可怕 如果有人可以看一下 看看他们是否能发现任何重大问题 很可能 我不是 Post
  • 是否可以使用 Mongoose 在 MongoDB 中创建新数据库?

    我想知道是否可以使用 Mongoose 在 MongoDB 中创建一个新数据库 我在 Node 上运行 并且我知道 Node 的 MongoDB 驱动程序可以做到这一点 但我想知道是否可以仅从 Mongoose 中做到这一点 有没有相当于d
  • 对于 OS X 特定代码,我应该使用什么 C 预处理器条件?

    对于 OS X 特定代码 我应该使用什么 C 预处理器条件 如果我为 OS X 进行编译 则需要包含特定的库 如果为 Linux 进行编译 则需要包含不同的标头 我知道有 APPLE 但我不知道这是否是 OS X 10 x 的当前条件 此操
  • 如何在云(AWS、heroku 等)中跨多个节点建立时钟同步?

    我想在云中运行一个大型节点集群 AWS Heroku 或者可能是自我管理的 VMS 其时钟必须与预定义的容差同步 我正在寻找大约 200 毫秒的容差 这意味着 如果我有 250 个节点 那么这 250 个节点之间的最大时钟差异不应超过 20