跨网络同步计数器

Posted

技术标签:

【中文标题】跨网络同步计数器【英文标题】:Synchronizing a counter across a network 【发布时间】:2012-09-26 01:55:16 【问题描述】:

我有两台可以通过串行连接相互通信的计算机。连接是通过无线网络进行的。两个系统之间的通信存在可变的、不断变化的延迟。在这两个系统上,我都有一个计数器运行时间,每毫秒递增 1。它们都在应用程序启动后立即启动。假设每台计算机在不同的时间启动。我如何与串行连接同步计数器,以便 systemA.counter 等于 systemB.counter 并且两个计数器同时递增(或尽可能接近)。

理想情况下,一旦同步,计数器只会缓慢地分开,以便每 3 或 4000 英寸我可以重新同步一次。

我正在寻找有关该主题的良好资源,例如算法、示例代码 (c/c++),以及任何可以为我指明正确方向的内容。

更新

这是一个封闭的系统,没有互联网。出于所有意图和目的,除了通过无线链路打开串行线路之外,根本没有真正的协议。目前该链接是蓝牙,但我正在考虑将其移至 ZigBee Mesh。当前有 2 个节点,但如果我有 30 个节点都运行同一个应用程序,我希望它们全部同步。没有指定客户端/服务器,只有几个设备运行带有计数器的相同程序。我无法访问时间之类的东西,只有这个每毫秒递增一次的计数器以及我可以使用的任何算法。

一旦我能做到这一点,我想建立一个定位和映射系统,但要计算节点之间的距离,我需要在设备上同步启动时间。

【问题讨论】:

【参考方案1】:

如果您使用此计数器对系统中的事件进行排序,您应该查看vector clocks 或Lamport timestamps。

【讨论】:

【参考方案2】:

显而易见的资源是 NTP,例如在 http://www.eecis.udel.edu/~mills/ntp.html 上记录了该资源,并在此处提供了链接。基本上,这使用时间戳来调整本地时钟运行的频率。该协议已经存在多年,并且一直是持续研究的主题——我看不到任何幻灯片,它们可以立即清楚地说明它是如何工作的。您最好看看是否已经有可用的 NTP 实现,而不是自己尝试重新实现。

似乎(例如通过搜索)有一小部分人致力于时间同步算法,尤其是在无线传感器网络的背景下。除了搜索之外,一个起点是http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.85.2012 的调查论文 - 传感器网络中的时间同步:一项调查 (2004)

【讨论】:

以上是关于跨网络同步计数器的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 跨网络跨集群同步选型指南

现场填坑系列:mongodb 复制集跨机房同步网络问题探查

现场填坑系列:mongodb 复制集跨机房同步网络问题探查

铁路时间同步网介绍

利用otter实现跨机房数据同步

synchronous binary counter是啥意思