《架构师之路:架构设计中的100个知识点》 20.分布式系统一致性与全局时钟
分布式系统一致性为什么难做?
因为没有全局时钟。
“没有全局时钟”是什么意思?
每台服务器都有自己的本地时钟,跨服务器的本地时钟相比较是没有意义的。
即使服务器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的核心原理也是如此。
知其然,知其所以然。
思路比结论更重要。
补充阅读材料:
《系统性介绍NTP》
https://www.ntp.org/ntpfaq/
1. 前言
2. 计算机需要什么时间(Time)
3. 计算机时钟(Clocks)工作原理
4. 什么是NTP
5. NTP的工作原理(How works)
6. 配置(Configuration)
7. 参考(Reference)
8. 排错(Troubleshooting)
9. 其他
10. 总结
画外音:没时间就看4-5两章。