两台 NTP 服务器做 NTP 源。内网,和互联网断开连接。
另外一台机器可以从这两者获取时间。
两个源都和第三台抓取时间的机器都可能存在一定的波动和误差,并且随着时间变长,误差会放大。
现在我设定一个容许的误差区间,如果每次同步时间的时候,超过了这个误差区间,本次同步即丢弃,认为这台 NTP 源出现了故障,不再可信,转而从另外一个机器读取。这里不考虑两台机器同时出现了超过误差区间的情况。
然后初始化的第一次同步,三方都是精准时间,此时不存在误差。
现在的问题和要求就是,如何在没有第三方信源做仲裁的情况下,设定一个方案,让长期时间内,有更大的概率抓取到相对更为精准的时间?
我退学早,没上过什么数学课,撑死也就是四则运算的水平,我想了两个方法,求解。
1 :每次只选择一台服务器做时间同步,但同步是从两台 NTP 源轮流查询,这一次同步选 A 信源,下一次选 B 信源,因为是轮流查询,所以每次比较实际上比的就是这两台 NTP 源彼此的误差。这个方法的缺点也显而易见,比如两台都越跑越快,比实际时间要早,而误差又都在我设定的区间内,只会连带着抓取时间的机器跟着越走越快,还永远察觉不了。
2 :每次选择两台机器同时查询,抓取到的数值和本地时间做减法比较,哪个绝对值小,就认为这个更可靠一点,然后选择这个做为同步。下一次同步也仍然用这种方法计算。缺点也同样有,差值小并不代表这个源就可信,很可能本地服务器和这台源同时跑快了,但它们差值小,所以互相勾搭,更准确一点的那个反而被抛弃。而且这种错误会飞快的放大,再也找不回那个精确的时间。
所以我很自然的用小学数学水平想到了第三个方法……每次同时查询,然后求平均数,甚至可以加上本地服务器的时间一起求平均数—— NTP 源的误差并不一定是跑的快,也可能跑的慢,求平均值是一个比较靠谱的妥协方案吧。但我又想,是取两个源的平均值更准确一点呢,还是取三台机器的平均值更准确一点呢?这个超出了我对数学的理解范围了……
当然,这个是有点极端的情况。现实里,这个案例并没这么复杂。两个 NTP 源时间取自 GPS ,大致上我们只需要考虑严重的故障,丢弃掉就可以,小的波动和误差并不会累计那么长时间,有一定的自我校准功能。但我就是爱想,万一这俩 GPS 就偏偏都不行了呢……我现在只是想找理论上的相对更准确的那个概率大一点的方法……
然后还有个拓展的,假设引入了第三个 NTP 信源了,那么这种方案又该如何构建呢?直觉上我可以在里面建立一种仲裁机制,比如少数服从多数,又或者严格意义的平均数,但具体哪个会更可靠更精准一些呢?
实在想不明白,都怪当年上课没听讲。。扔这里来,求各位高手解。。
好想匿名,捂脸,怕这些问题太简单,扔出来被嘲笑。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.