几个问题,其实有点接近数学向,但我数学没学好,特来求问……

2015-12-11 00:20:10 +08:00
 mongodb

两台 NTP 服务器做 NTP 源。内网,和互联网断开连接。

另外一台机器可以从这两者获取时间。

两个源都和第三台抓取时间的机器都可能存在一定的波动和误差,并且随着时间变长,误差会放大。

现在我设定一个容许的误差区间,如果每次同步时间的时候,超过了这个误差区间,本次同步即丢弃,认为这台 NTP 源出现了故障,不再可信,转而从另外一个机器读取。这里不考虑两台机器同时出现了超过误差区间的情况。

然后初始化的第一次同步,三方都是精准时间,此时不存在误差。

现在的问题和要求就是,如何在没有第三方信源做仲裁的情况下,设定一个方案,让长期时间内,有更大的概率抓取到相对更为精准的时间?

我退学早,没上过什么数学课,撑死也就是四则运算的水平,我想了两个方法,求解。

1 :每次只选择一台服务器做时间同步,但同步是从两台 NTP 源轮流查询,这一次同步选 A 信源,下一次选 B 信源,因为是轮流查询,所以每次比较实际上比的就是这两台 NTP 源彼此的误差。这个方法的缺点也显而易见,比如两台都越跑越快,比实际时间要早,而误差又都在我设定的区间内,只会连带着抓取时间的机器跟着越走越快,还永远察觉不了。

2 :每次选择两台机器同时查询,抓取到的数值和本地时间做减法比较,哪个绝对值小,就认为这个更可靠一点,然后选择这个做为同步。下一次同步也仍然用这种方法计算。缺点也同样有,差值小并不代表这个源就可信,很可能本地服务器和这台源同时跑快了,但它们差值小,所以互相勾搭,更准确一点的那个反而被抛弃。而且这种错误会飞快的放大,再也找不回那个精确的时间。

所以我很自然的用小学数学水平想到了第三个方法……每次同时查询,然后求平均数,甚至可以加上本地服务器的时间一起求平均数—— NTP 源的误差并不一定是跑的快,也可能跑的慢,求平均值是一个比较靠谱的妥协方案吧。但我又想,是取两个源的平均值更准确一点呢,还是取三台机器的平均值更准确一点呢?这个超出了我对数学的理解范围了……

当然,这个是有点极端的情况。现实里,这个案例并没这么复杂。两个 NTP 源时间取自 GPS ,大致上我们只需要考虑严重的故障,丢弃掉就可以,小的波动和误差并不会累计那么长时间,有一定的自我校准功能。但我就是爱想,万一这俩 GPS 就偏偏都不行了呢……我现在只是想找理论上的相对更准确的那个概率大一点的方法……

然后还有个拓展的,假设引入了第三个 NTP 信源了,那么这种方案又该如何构建呢?直觉上我可以在里面建立一种仲裁机制,比如少数服从多数,又或者严格意义的平均数,但具体哪个会更可靠更精准一些呢?

实在想不明白,都怪当年上课没听讲。。扔这里来,求各位高手解。。

好想匿名,捂脸,怕这些问题太简单,扔出来被嘲笑。

1165 次点击
所在节点    问与答
2 条回复
wy315700
2015-12-11 00:27:34 +08:00
正态分布
ryd994
2015-12-11 06:56:57 +08:00
如果两个参考源都漂,你怎么样都不可能查出来
多个源可以讨论一下多台同时故障的概率
3 台可以取接近的两台,因为两台同时往一个方向还程度一样的概率真心不大
本地值不要参与计算,自己做基准还改自己,这不逗么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/242690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX