分布式系统一致性为什么难做?
因为没有全局时钟。
“没有全局时钟”是什么意思?
每台服务器都有自己的本地时钟,跨服务器的本地时钟相比较是没有意义的。
即使服务器A的本地时间Ta,小于,服务器B的本地时间Tb,我们也不能说Ta一定比Tb早发生,因为两台服务器之间的本地时间会有差异。
这就导致分布式系统时序成为了一个难题,一致性也就变得十分困难。
关于全局时钟,工程架构上有什么最佳实践吗?
其一,经常使用单点串行化,保证时序。
例如:MySQL以主节点操作时序为准,序列化为binlog后,同步到从节点执行。
其二,可以使用单点发号器,模拟全局时钟。
所有操作执行前,到发号器上领取一个递增的时间戳,作为时序依据。单点发号器的时间戳比较,就变得有意义了。
其三,可以使用NTP协议尽量缩小服务器之间的差,但即使使用了NTP,仍然无法保证绝对时序。
画外音:NTP,Network Time Protocol,用于计算机网络时间同步的标准协议。
那如何测量两台服务器之间的时间差呢?
可以发包测量。
大致的原理是这样的:
如上图所示:
1. 服务器A记录一个本地时间Ta1,然后向服务器B发送一个报文;
2. 服务器B接收到报文后记录一个本地时间Tb,然后回复一个报文;
3. 服务器A接收到回复后再记录一个本地时间Ta2;
假设报文往返耗时是相同的,那么报文从A到B的单程传输时间是:
x = (Ta2 - Ta1)/2
服务器A与服务器B的绝对时间是相同的,那么:
Tb = Ta1 + x
可实际上,服务器A与服务器B存在一个时间差,Tb 并不完全等于 Ta1 + x,那么服务器AB之间的时间差就是:
Tb - (Ta1+x)
测量完毕。
报文网络传输会不会有较大波动?
怕一次波动?那就测一亿次取平均。
NTP的核心原理也是如此。
知其然,知其所以然。
https://www.ntp.org/ntpfaq/==全文完==
以实践为主线,结合讲解架构知识点,几十个小时视频内容,已完结。以架构知识点为主线,结合讲实践。讲解形式:短视频+图文+直播+星球社群,免费,欢迎感兴趣的童鞋关注。