V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mongodb
V2EX  ›  问与答

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

  •  
  •   mongodb · 2015-12-11 00:20:10 +08:00 · 1180 次点击
    这是一个创建于 3273 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2 条回复    2015-12-11 06:56:57 +08:00
    wy315700
        1
    wy315700  
       2015-12-11 00:27:34 +08:00
    正态分布
    ryd994
        2
    ryd994  
       2015-12-11 06:56:57 +08:00
    如果两个参考源都漂,你怎么样都不可能查出来
    多个源可以讨论一下多台同时故障的概率
    3 台可以取接近的两台,因为两台同时往一个方向还程度一样的概率真心不大
    本地值不要参与计算,自己做基准还改自己,这不逗么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3060 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:28 · PVG 22:28 · LAX 06:28 · JFK 09:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.