分布式系統一致性為什么難做?
分布式系統一致性為什么難做?
因為沒有全局時鐘。
“沒有全局時鐘”是什么意思?
每臺服務器都有自己的本地時鐘,跨服務器的本地時鐘相比較是沒有意義的。
即使服務器A的本地時間Ta,小于,服務器B的本地時間Tb,我們也不能說Ta一定比Tb早發生,因為兩臺服務器之間的本地時間會有差異。
這就導致分布式系統時序成為了一個難題,一致性也就變得十分困難。
關于全局時鐘,工程架構上有什么最佳實踐嗎?
其一,經常使用單點串行化,保證時序。
例如:MySQL以主節點操作時序為準,序列化為binlog后,同步到從節點執行。
其二,可以使用單點發號器,模擬全局時鐘。
所有操作執行前,到發號器上領取一個遞增的時間戳,作為時序依據。單點發號器的時間戳比較,就變得有意義了。
其三,可以使用NTP協議盡量縮小服務器之間的差,但即使使用了NTP,仍然無法保證絕對時序。
畫外音:NTP,Network Time Protocol,用于計算機網絡時間同步的標準協議。
那如何測量兩臺服務器之間的時間差呢?
可以發包測量。
大致的原理是這樣的:
如上圖所示:
- 服務器A記錄一個本地時間Ta1,然后向服務器B發送一個報文;
- 服務器B接收到報文后記錄一個本地時間Tb,然后回復一個報文;
- 服務器A接收到回復后再記錄一個本地時間Ta2;
假設報文往返耗時是相同的,那么報文從A到B的單程傳輸時間是:x = (Ta2 - Ta1)/2
服務器A與服務器B的絕對時間是相同的,那么:Tb = Ta1 + x
可實際上,服務器A與服務器B存在一個時間差,Tb 并不完全等于 Ta1 + x,那么服務器AB之間的時間差就是:Tb - (Ta1+x)
測量完畢。
報文網絡傳輸會不會有較大波動?
怕一次波動?那就測一億次取平均。
NTP的核心原理也是如此。
知其然,知其所以然。
思路比結論更重要。