分布式系統(tǒng)及其一致性算法

一,分布式系統(tǒng)
1,簡(jiǎn)介。(what) 這是一個(gè)較為寬泛的概念,它的產(chǎn)生和出現(xiàn)是為了解決和應(yīng)對(duì)以往系統(tǒng)的問(wèn)題
百科: 分布式系統(tǒng)(distributed system),是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。正是由于軟件的特性,所以分布式系統(tǒng)具有內(nèi)聚性和透明性。
內(nèi)聚性: 系統(tǒng)內(nèi)的節(jié)點(diǎn)、服務(wù)的目的、分工、規(guī)則明確。
透明性: 分布式系統(tǒng)對(duì)外提供服務(wù),調(diào)用該系統(tǒng)的外部用戶不用考慮它是怎樣工作的,只要根據(jù)規(guī)則進(jìn)行使用就行,也不需要里面包含多少臺(tái)服務(wù)器,在什么地方
簡(jiǎn)單理解: 是一套互相連接共同對(duì)外提供服務(wù)的系統(tǒng),系統(tǒng)內(nèi)部結(jié)點(diǎn)采用某種方式進(jìn)行通信;常見(jiàn)的大的如大型電商系統(tǒng),小的如數(shù)據(jù)庫(kù)集群、緩存集群。

2,使用分布式系統(tǒng)原因?(why)
* 分布式系統(tǒng)出現(xiàn)之前的單機(jī)系統(tǒng),一旦服務(wù)器的操作系統(tǒng)、硬盤、網(wǎng)絡(luò)出現(xiàn)問(wèn)題就會(huì)導(dǎo)致服務(wù)的中斷,數(shù)據(jù)的丟失等問(wèn)題。
* 單機(jī)系統(tǒng)的性能再高、存儲(chǔ)能力再擴(kuò)展、也是有限的。而分布式系統(tǒng)可以以大量的服務(wù)器來(lái)分散帶寬、存儲(chǔ)、計(jì)算的壓力
* 由于跨遠(yuǎn)區(qū)域甚至跨國(guó)、網(wǎng)絡(luò)的延遲有時(shí)候是客觀的,所以說(shuō)服務(wù)器集中在一個(gè)地方很難再較大的區(qū)域內(nèi)提供較好的服務(wù)和體驗(yàn)

3,分布式系統(tǒng)在實(shí)際操作環(huán)境之中的問(wèn)題;
由于分布式系統(tǒng)不完美的運(yùn)行環(huán)境,所以有些問(wèn)題尚待解決。例如,系統(tǒng)之間的每個(gè)節(jié)點(diǎn)都有可能出現(xiàn)單個(gè)節(jié)點(diǎn)出現(xiàn)故障突然間不工作了,節(jié)點(diǎn)間會(huì)有或大或小,忽大忽小的網(wǎng)絡(luò)延遲,節(jié)點(diǎn)間也有可能出現(xiàn)網(wǎng)絡(luò)中斷。從技術(shù)角度來(lái)看,可能出現(xiàn)的問(wèn)題基本上認(rèn)為是早晚會(huì)發(fā)生的,說(shuō)到底,很多問(wèn)題就是成本和收益的平衡。因此,一個(gè)分布式系統(tǒng)要想正常的對(duì)外提供服務(wù),它的設(shè)計(jì)本身就的考慮這些問(wèn)題的解決。在算法層面上,分布式一致性算法就是為了輔助和解決這些問(wèn)題,確保系統(tǒng)盡可能的能夠正常的對(duì)外提供服務(wù)

二,分布式一致性算法
簡(jiǎn)介;
主要是從系統(tǒng)角度分析分布式系內(nèi)部節(jié)點(diǎn)本身及其節(jié)點(diǎn)之間出現(xiàn)問(wèn)題的解決,
例如,一個(gè)系統(tǒng)之間包含5個(gè)節(jié)點(diǎn),由于網(wǎng)絡(luò)問(wèn)題,其中3個(gè)節(jié)點(diǎn)與另外2個(gè)節(jié)點(diǎn)失去連接,此刻系統(tǒng)如何處理?是否繼續(xù)提供服務(wù)支持?如果繼續(xù)提供服務(wù)支持,那么他們之間的數(shù)據(jù)就是不一致的,后面節(jié)點(diǎn)的網(wǎng)絡(luò)恢復(fù)后,怎么解決數(shù)據(jù)不一致問(wèn)題?
其次,節(jié)點(diǎn)間的網(wǎng)絡(luò)延遲,磁盤讀寫,CPU處理能力都不盡相同,那么保存到這個(gè)系統(tǒng)中的數(shù)據(jù)什么樣的情況下認(rèn)為保存成功?同時(shí)還要以一種高效的形式來(lái)實(shí)現(xiàn)。

常見(jiàn)的分布式系統(tǒng)的一致性算法:
Paxos Raft ZAB
ZAB(zookeeper atomic Broadcast):
主要以下特點(diǎn):
* 把節(jié)點(diǎn)分為兩種:主節(jié)點(diǎn)(leader)和從節(jié)點(diǎn)(follower)
* 有一個(gè)主節(jié)點(diǎn),所有的寫操作(這里的寫操作可以認(rèn)為是新增和修改)都在主節(jié)之上,如果有一個(gè)從節(jié)點(diǎn)收到寫操作請(qǐng)求,也會(huì)轉(zhuǎn)移到主節(jié)點(diǎn)處理。
* 其他節(jié)點(diǎn)都是從節(jié)點(diǎn),可以通過(guò)從節(jié)點(diǎn)進(jìn)行讀操作
* 主節(jié)點(diǎn)通過(guò)選舉所得,主節(jié)點(diǎn)失蹤后,其余從節(jié)點(diǎn)自動(dòng)選取新的主節(jié)點(diǎn)

寫操作具體實(shí)施:
常規(guī)寫流程如下:
1. 客戶向主節(jié)點(diǎn)請(qǐng)求寫數(shù)據(jù)X
2. 主節(jié)點(diǎn)為該條數(shù)據(jù)X生成唯一的遞增id,叫ZXID X(id)
3. 主節(jié)點(diǎn)把X(id)發(fā)送給所有從節(jié)點(diǎn),跟他們確認(rèn)能不能正常的將數(shù)據(jù)記錄下來(lái),這個(gè)操作叫做Propose提議
4. 超過(guò)一半的從節(jié)點(diǎn)向主節(jié)點(diǎn)回復(fù)沒(méi)有問(wèn)題,這個(gè)操作叫做ACK應(yīng)答
5. 主節(jié)點(diǎn)收到一半以上從節(jié)點(diǎn)肯定回答后,給所有從節(jié)點(diǎn)發(fā)送確認(rèn)提交請(qǐng)求,即表示你們可以將這條數(shù)據(jù)保存下來(lái)了,同時(shí)自己也正式保存這條數(shù)據(jù),這個(gè)過(guò)程叫做commit

節(jié)點(diǎn)掛掉的各個(gè)情況:
1. 少部分節(jié)點(diǎn)掛掉沒(méi)有任何影響
2. 一半節(jié)點(diǎn)掛掉,系統(tǒng)不能提供服務(wù);一般這種情況的概率較小
3. 少部分節(jié)點(diǎn)掛掉、一段時(shí)間后又恢復(fù)了之后:
* 先通過(guò)主節(jié)點(diǎn)同步最新的數(shù)據(jù);因?yàn)樽约簰斓粢欢螘r(shí)間后,很有可能沒(méi)有最新的數(shù)據(jù)。
* 數(shù)據(jù)同步之后正式成為子節(jié)點(diǎn)開(kāi)始工作。

同理:新添加的子節(jié)點(diǎn)到現(xiàn)有的集群也是這個(gè)模式
4. 在主節(jié)點(diǎn)掛掉期間,系統(tǒng)暫時(shí)不對(duì)外提供服務(wù),開(kāi)始新的節(jié)點(diǎn)選舉
ZAB節(jié)點(diǎn)選舉機(jī)制:發(fā)消息到每一個(gè)自己能連得上的節(jié)點(diǎn):包含自己的節(jié)點(diǎn)編號(hào)myid和保存數(shù)據(jù)的最大ZXID
選舉規(guī)則:
* 誰(shuí)的ZXID最大,誰(shuí)就是主節(jié)點(diǎn)。why?因?yàn)檫@表示他的數(shù)據(jù)最新。盡量保證數(shù)據(jù)的一直性。
* ZXID一樣時(shí),誰(shuí)的myid最大,誰(shuí)就是新的主節(jié)點(diǎn)。
* 每個(gè)節(jié)點(diǎn)收到其他節(jié)點(diǎn)的數(shù)據(jù)后,與自己的數(shù)據(jù)進(jìn)行判斷,如果對(duì)方的比自己大,那就認(rèn)同對(duì)方為主節(jié)點(diǎn)
* 得到一半以上(注意;這里又是一半以上)節(jié)點(diǎn)認(rèn)同的候選節(jié)點(diǎn)成為新的主節(jié)點(diǎn)

====》最后 新的主節(jié)點(diǎn)選取出來(lái)以后,進(jìn)入集群成為數(shù)據(jù)同步節(jié)點(diǎn),先檢查節(jié)點(diǎn)內(nèi)部那些數(shù)據(jù)比自己舊,然后將數(shù)據(jù)同步過(guò)去。然后對(duì)外提供服務(wù)

Raft算法:
Raft算法與ZAB算法類似,也分為主節(jié)點(diǎn)和從節(jié)點(diǎn);區(qū)別在于主節(jié)點(diǎn)選取機(jī)制上有所不同。
Raft選舉機(jī)制:
1. 發(fā)現(xiàn)主節(jié)點(diǎn)失蹤一段時(shí)間之后,所有從節(jié)點(diǎn)向其他從節(jié)點(diǎn)發(fā)送消息,讓他們選取自己為新的主節(jié)點(diǎn)。
2. 還沒(méi)有參加選舉的從節(jié)點(diǎn)如果收到其他節(jié)點(diǎn)的選舉請(qǐng)求,就選取自己收取到的第一個(gè)節(jié)點(diǎn),后面在有誰(shuí)請(qǐng)求自己支持選取,就告知自己已經(jīng)支持另一個(gè)節(jié)點(diǎn)了。
3. 如果一個(gè)節(jié)點(diǎn)發(fā)現(xiàn)另一個(gè)節(jié)點(diǎn)的支持率比自己高,那么自己就無(wú)條件的支持另一個(gè)節(jié)點(diǎn),并同時(shí)讓自己的簇?fù)硪仓С至硪粋€(gè)節(jié)點(diǎn)。
4. 如果一輪選舉沒(méi)有選取出新的主節(jié)點(diǎn),那么就開(kāi)始下一輪選舉,知道一個(gè)節(jié)點(diǎn)得到大多數(shù)的擁簇。

備注:
關(guān)于ZXID說(shuō)明:主節(jié)點(diǎn)上沒(méi)提交的數(shù)據(jù)在從節(jié)點(diǎn)上也算做未提交,因此沒(méi)提交的數(shù)據(jù)的ZXID不算數(shù)。

關(guān)于選舉說(shuō)明:選舉一定是在主節(jié)點(diǎn)掛掉之后才進(jìn)行的。分布式一致性算法可以再保證部分節(jié)點(diǎn)掛掉的情況下,數(shù)據(jù)的一致性;但是在大部分節(jié)點(diǎn)同時(shí)掛掉的情況下不保證。如果超過(guò)半數(shù)節(jié)點(diǎn)同時(shí)掛掉,那么該系統(tǒng)則不對(duì)再外提供服務(wù)。
當(dāng)然,在寫數(shù)據(jù)時(shí),強(qiáng)制確認(rèn)所有節(jié)點(diǎn)都寫入了新數(shù)據(jù)會(huì)更安全和一致,但是系統(tǒng)的可用性和性能就大大降低了;
譬如一個(gè)節(jié)點(diǎn)掛掉,那么整個(gè)系統(tǒng)就不能夠正常的工作了。

Q&A
Q:為什么要保證一半以上的從節(jié)點(diǎn)回復(fù)?
A為了保證數(shù)據(jù)的一致性

Q:如果他們網(wǎng)絡(luò)恢復(fù)之后,正常節(jié)點(diǎn)與非正常節(jié)點(diǎn)(多數(shù)節(jié)點(diǎn)與少數(shù)節(jié)點(diǎn)間)數(shù)據(jù)已誰(shuí)為準(zhǔn)?
A:分布式一致性算法采用大多數(shù)認(rèn)同的方式

Q:判定主節(jié)點(diǎn)已死的依據(jù)是什么?因?yàn)橥ㄟ^(guò)節(jié)點(diǎn)選舉的機(jī)制,那么主節(jié)點(diǎn)的壓力比較大。
A:通過(guò)心跳檢測(cè)來(lái)判斷;針對(duì)心跳偵聽(tīng)時(shí)間的配置較為嚴(yán)苛,間隔太大容易響應(yīng)慢,間隔太小容易出現(xiàn)假死。所以針對(duì)這種情況分兩方面考慮:1,針對(duì)外部系統(tǒng)通過(guò)緩存、延遲調(diào)用等方式解決;2,對(duì)內(nèi)在運(yùn)維上需要對(duì)于服務(wù)器做自動(dòng)化監(jiān)控預(yù)警告警方面的處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容