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