如何巧妙地测量服务器之间的时间差
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何巧妙地测量服务器之间的时间差
缘起:无绝对时钟
Fischer Lynch Paterson定理是分布式理论中非常重要的一个定理,其结论相当悲观:在一个多进程异步系统中,由于没有全局绝对时钟,一定不存在一个一致的消息投递协议。
工程折衷:单点序列化
每个进程,每台服务器都有自己的本地时钟,跨服务器的本地时钟比较是没有意义的,这一点很好理解,服务器A上的本地时间ta=1,服务器B上的本地时间tb=2,虽然ta 工程上,可以使用一台单点服务器来分发序列号,或者使用这台单点服务器来进行序列化,来模拟全局时钟。 问题的提出:既然两台服务器的本地时间存在差值,如何来测量两台服务器之间的时间差呢? 答案是,发包测量。 发包流程如上图: 1)服务器A记录一个本地时间Ta1,然后向服务器B发送一个报文 2)服务器B接收到报文后取本地时间Tb放入到报文中,并将报文发回给服务器A 3)服务器A收到回复报文后,记录本地时间Ta2 很容易知道,Ta1和Ta2取的是服务器A的本地时间,Tb取的是服务器B的本地时间。 假设报文往返耗时是相同的(这个假设很合理),那么 x = (Ta2 – Ta1)/2 如果,你硬要说这个x通过一次测量不准确的话,可以发1亿次往返请求,来求出一个相对精确的x值假设服务器A与服务器B的绝对时间是相同的(这个假设不合理),那么 Tb = Ta1 + x = (Ta2 + Ta1)/2 可实际上,服务器A与服务器B存在一个时间差,不妨设时间差是“德尔塔”,那么Tb + “德尔塔”= Ta1 + x= (Ta2 + Ta1)/2 于是,“德尔塔” = (Ta2 + Ta1)/2– Tb 这个“德尔塔”就是服务器A与服务器B的时间差