亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一文入魂!聊透分布式系統(tǒng)一致性

作者 | bdseeker

來源 | BigData之路(ID:bigdata3186)

頭圖 | CSDN 下載自視覺中國

 

前言

上一篇《CAP》寫完之后,我又反復(fù)回看了多次,發(fā)現(xiàn)最后的一部分表達CAP、ACID、BASE、“BACP(自造)”關(guān)系時有一些問題,并且不是很嚴(yán)謹(jǐn),但是無奈已經(jīng)發(fā)送過的內(nèi)容,無法支持修改,并且有挺多小伙伴都在私聊我確認(rèn)細節(jié),這里我來重新更新下,直接上圖!

一文入魂!聊透分布式系統(tǒng)一致性

也有一部分小伙伴跟我說覺得CAP有點冷門,建議我換點大眾能接受的,其實我也不得不承認(rèn),大家可能更喜歡具體的技術(shù)棧。但我從個人視角來說,這些大數(shù)據(jù)的基礎(chǔ)知識非常重要。等我寫完大數(shù)據(jù)基礎(chǔ)系列,會逐漸開始轉(zhuǎn)戰(zhàn)具體技術(shù)棧,莫急!大數(shù)據(jù)之路很長,我們慢慢走。就像我每篇文章里都會提到的,相信堅持總會有所收獲。

話不多說,進入正題,在很多小伙伴認(rèn)知里或多或少都知道那么兩三種一致性,比如強一致性、最終一致性等。但是你以為一致性只有這些嘛?本篇帶來一致性詳解,講透一致性。歡迎大家指正~

 

強一致性

一致性大家庭中,雖然細分種類很多,但是實際上只有兩大類,其中之一就是上篇《CAP》中我們已經(jīng)介紹過的強一致性,其具體包含了嚴(yán)格一致性(也叫原子一致性或者線性一致性)和順序一致性。

1、嚴(yán)格(原子/線性)一致性

嚴(yán)格一致性代表著,當(dāng)數(shù)據(jù)更新后,所有Client的讀寫都是在數(shù)據(jù)更新的基礎(chǔ)上。如下圖所示,我們假設(shè)每份數(shù)據(jù)有三個副本,分別落到三個節(jié)點上。當(dāng)Client1嘗試將X的值置為1時,嚴(yán)格一致性要求當(dāng)Client1完成更新操作以后,所有Client都要在最新值的基礎(chǔ)上進行讀寫,這里的Client10讀取到的值是x=1,在同一時刻Client100的更新操作也是在x=1的基礎(chǔ)上進行x+=1操作,在下一個時刻Client1000讀到的任意一個副本,X的值都會是2。

一文入魂!聊透分布式系統(tǒng)一致性

此時你會發(fā)現(xiàn)一切似乎都是很完美的。但是仔細想想,嚴(yán)格一致性的背后有什么潛臺詞呢?

數(shù)據(jù)同步復(fù)制

嚴(yán)格一致性代表著,所有數(shù)據(jù)在寫入操作的時候是同步復(fù)制的,即寫多副本都成功,才算寫入成功,HDFS是不是就是最好的例子。并且具有原子性,對于寫入操作來說,結(jié)果要么寫成功,要么寫失敗,不存在中間狀態(tài)。這也是為什么稱為原子一致性的原因。

嚴(yán)格一致性不考慮客戶端

在網(wǎng)上有很多人在解釋一致性時,嘗試從客戶端和服務(wù)端分別解析;但是在上一篇我們分析CAP的時候,也有提到不要帶Client玩,那么究竟誰對誰錯呢?

這里我們再來看下,在考慮分布式系統(tǒng)的一致性時我們更關(guān)注什么?是多個Client發(fā)送讀寫請求到達后端的時間和先后順序嘛?不,我們真正關(guān)注的是每個請求,對應(yīng)服務(wù)端完成時間點的先后順序。還是參考上面的例子,Client1000讀取到x=2這個結(jié)果,實際上是以Client100這個寫操作完成為基礎(chǔ)的,如果Client100寫操作一直不完成,那么強一致性要求Client1000讀取到的X是1而不是2。因此我們更需要關(guān)注的是完成操作的具體時間點,而不是操作發(fā)起的時間點,對于一致性來說考慮Client的意義就不大了。當(dāng)然在同一時刻多個Client操作的冪等性還是一定要保證的。

換個角度,Client才是一致性需求的甲方,不是嘛。而分布式系統(tǒng)端作為乙方,只能滿足甲方需求,或者拒絕甲方需求,而不是要求甲方作出任何改變!

基于嚴(yán)格的全局時鐘

上面我們提到操作行為完成時間點的順序是十分重要的。再仔細看一下上面舉例的內(nèi)容,相信你會發(fā)現(xiàn)一切的行為都在時間這個維度上,行為順序是:Client1更新x=1 -> Client10讀取x=1/Client100在x=1的基礎(chǔ)上更新x+=1 -> Client1000讀取x=2。所以每個操作都是在前一個操作完成的基礎(chǔ)上進行的,在分布式服務(wù)中,需要有一個基準(zhǔn)時間來衡量每個操作行為的順序。此時你會問了,機器上不是都有NTP做時間校準(zhǔn)嘛?現(xiàn)在的問題就是無法保證每一臺機器的時間都是絕對相同的。

舉個例子,數(shù)據(jù)D2所在的節(jié)點相比D1節(jié)點時間提前了幾秒,當(dāng)Client1的更新請求完成后(用時500ms),Client10的請求開始執(zhí)行并完成,如果將機器時間作為基準(zhǔn)就會發(fā)現(xiàn)Client10的讀取操作竟然在Client1的更新操作之前,這顯然是違背強一致性的。

我們一般我們會如何保證全局時鐘?這里簡單聊聊三種種常見解法。

混合邏輯時鐘 Hybrid Logic Clock

在混合邏輯時鐘中同時比較了節(jié)點本地的物理時間、邏輯時間和其他節(jié)點發(fā)送消息中的物理時間。kudu和Cockroachdb也都是使用的這個方法,HLC雖然加上了物理時間,但是仍然強依賴于機器的NTP,并不是嚴(yán)格意義上精確的時鐘,在HLC中需要為時鐘定義一個邊界,比如kudu中定義了maximum check error(最大時鐘錯誤),如果本地NTP沒啟動,kudu在啟動的時候就直接失敗了;如果誤差超過了maximum check error,依舊會報錯,這也就意味著當(dāng)超過HLC所設(shè)定的偏差邊界,HLC就不能正常工作了。

在看HLC的實現(xiàn)邏輯時,發(fā)現(xiàn)步驟比較多,邏輯時間存在的意義就是在時間比對時,當(dāng)作中間值或者備份值。這里由于不是本篇重點,不再贅述了,感興趣的小伙伴可以看下論文:https://cse.buffalo.edu/tech-reports/2014-04.pdf。

True Time

上一篇文章中也有講到,谷歌依賴強大的基建實力降低了網(wǎng)絡(luò)分區(qū)發(fā)生的概率,而面全局時鐘問題,google的Spanner采用的是GPS + Atomic Clock(原子時鐘的含義可以百度一下)這種純硬件方式來對集群的機器進行校時,其精度在ms級別,這里我們用ε來表示時間精度的誤差,時間的精度誤差的范圍也就是[t-ε,t+ε]這個范圍之間。此時回到上面的操作中,按照此種方式Client10的機器時間相比Client1的機器時間最多提前或者滯后2個ε的時間,因此Spanner引入了commit wait time這個方案,說白了就是操作執(zhí)行完成后多等一會,等過了這個精度誤差的范圍自然就全局有序了,Google將精度誤差控制在幾ms級別,當(dāng)然對于Spanner這種全球性、跨地域的分布式系統(tǒng)來說,多等個幾ms問題也不大。

但很遺憾,Google的這套硬件解決方案,并沒有開源出來,適用性有限,我們就望梅止渴吧。

授時中心 TimeStamp Oracle

在生活中也有”授時中心“的存在,貌似在陜西,具體位置可以查查,他的作用是什么呢?為中國各種基建、系統(tǒng)提供了一個準(zhǔn)確的時間,避免誤差。(個人YY:萬一打起仗,總不能因為其他國家干擾了基準(zhǔn)時間,咱們所有基建就癱瘓吧,因此授時中心的意義巨大。)

在分布式服務(wù)中,實際上也有類似的方案。這里以Tidb舉例,Tidb為了校準(zhǔn)時間,就是采用了TSO這個方案,對于Tidb來說所有行為事件統(tǒng)一由PD節(jié)點分配時間,雖然這種方案會產(chǎn)生非常高頻的互相調(diào)用,但是按照Tidb官方介紹,在同IDC網(wǎng)絡(luò)環(huán)境下網(wǎng)絡(luò)傳輸開銷非常低,只有0.xms。當(dāng)然如果面對跨IDC的網(wǎng)絡(luò),就可以嘗試將PD節(jié)點和Tidb節(jié)點混部(Tikv依然需要獨立部署,為的是存儲計算分離)。這就不需要走網(wǎng)絡(luò)的開銷了,當(dāng)然如果是Client端跨IDC的話,還是沒有太好的方法。

2、順序一致性

上面我們說到了嚴(yán)格一致性(線性/原子),想做到全局時鐘下的全局絕對有序是有難度的,HLC實現(xiàn)比較復(fù)雜,谷歌的原子鐘+GPS又沒有開源出來,TSO又增加了系統(tǒng)的復(fù)雜度。想實現(xiàn)全局時鐘好難!

這里我們是否可以退一步,舍棄“時間”這個有序的計數(shù)器,嘗試構(gòu)造一個更好維護的計數(shù)器,不保證全局行為絕對有序,只保證分布式服務(wù)全局相對有序?

如下圖所示,D1先后更新了x=1,x=2,D3先后更新了a=1,a=2。當(dāng)Client讀取到D2節(jié)點時,按照順序一致性要求,所有節(jié)點的操作相對順序都是相同的,一定是x=1在x=2之前,a=1在a=2之前,下圖舉例的是順序一致性的其中一種情況。

一文入魂!聊透分布式系統(tǒng)一致性

邏輯時鐘 Logic Clock

邏輯時鐘Logic Clock,這個名字你陌生的話,或許他的另一個名字Lamport Timestamp會讓你浮想連連,如果你還是沒啥印象的話,那么Paxos你是否知道呢?(如果做大數(shù)據(jù)的你不知道paxos,那你需要好好補習(xí)下基礎(chǔ)了

分享到:
標(biāo)簽:分布式 系統(tǒng)
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定