快速掌握分布式一致性算法Paxos
分布式一致性算法是用于在分布式系統(tǒng)中確保數(shù)據(jù)一致性的算法。在分布式計算環(huán)境中,數(shù)據(jù)通常會分布在多個節(jié)點中,這些節(jié)點可能由于網(wǎng)絡(luò)延遲、故障或其他原因而導(dǎo)致數(shù)據(jù)的不一致。分布式一致性算法就是為了確保分布式系統(tǒng)中的所有節(jié)點數(shù)據(jù)最終都能達(dá)到一致的狀態(tài)。
1、初識Paxos算法
分布式一致性算法可以分為強(qiáng)一致性和弱一致性;Paxos是強(qiáng)一致性算法(強(qiáng)一致性是指在任何時刻系統(tǒng)中的任意節(jié)點都可以看到相同的數(shù)據(jù),并且對數(shù)據(jù)的任何操作都會立即反映在系統(tǒng)的其他部分)
圖片
上圖中有三個節(jié)點,客戶端1和客戶端2要修改節(jié)點的值,那么Paxos算法可以保證所有的節(jié)點的value值都是一致的(要么所有節(jié)點都是value1,要么所有節(jié)點是value2,不會出現(xiàn)一部分節(jié)點是value1,另一部節(jié)點是value2)。
Paxos算法中涉及到三個角色,分別是提議者、接受者和學(xué)習(xí)者,這三個角色的作用如下:
(1)提議者:發(fā)起提案,只要提議者發(fā)的提案被半數(shù)以上接受者接受,提議者就認(rèn)為該提案里的value被選定了。
(2)接受者:只要接受者接受了某個提案,接受者就認(rèn)為該提案里的 value被選定了。接收者承諾不會接受比自己已通過的提案編號要小的任何提案。
(3)學(xué)習(xí)者:接受者告訴學(xué)習(xí)者哪個value被選定,學(xué)習(xí)者就認(rèn)為那個 value被選定。
2、Paxos算法的工作流程
2.1 準(zhǔn)備階段
提議者是客戶端,接收者是集群中的節(jié)點,下圖是的客戶端1和客戶端2在準(zhǔn)備階段發(fā)送請求到集群的各節(jié)點上:
圖片
在準(zhǔn)備階段提議者(客戶端)向接受者(集群中各節(jié)點)發(fā)送請求時會帶上自己需要提議的提案編號(如客戶端1的提案編號是0,客戶端2的提案編號是3),這一個階段提議者不會帶上具體的value值。
假設(shè)節(jié)點A和節(jié)點B先接收到了客戶端1的請求,節(jié)點C先接受到客戶端2的請求,并且節(jié)點A、節(jié)點B、節(jié)點C都是首次接收提案,那么三個節(jié)點對請求做出響應(yīng)如下圖所示:
圖片
節(jié)點A收到了客戶端1的請求后,由于節(jié)點A當(dāng)前并沒有接受任何的其他提案,所以節(jié)點A會響應(yīng)客戶端1的結(jié)果是尚無任何提案,同時節(jié)點A在返回尚無提案的時候也會做一個不會再響應(yīng)任何的小于當(dāng)前提案編號(當(dāng)前的提案編號是0)的提案承諾。同理,節(jié)點B和節(jié)點C也是同樣的過程。
客戶端1完成與節(jié)點A和節(jié)點B的通信,但是還沒有發(fā)請求給節(jié)點C,當(dāng)客戶端1發(fā)送請求給節(jié)點C的時候,節(jié)點C會作出響應(yīng),但是節(jié)點C已經(jīng)響應(yīng)了客戶端2的提案(當(dāng)前節(jié)點C提案的編號是3)客戶端1的提案編號是0,由于3>0,根據(jù)之前的承諾(不會接受比當(dāng)前提案小的請求),節(jié)點C不會響應(yīng)客戶端1的請求而是直接丟棄掉,如下圖所示:
圖片
客戶端2完成與節(jié)點C的通信,隨后與節(jié)點A、節(jié)點B進(jìn)行通信,接收者承諾不接受小于當(dāng)前提案編號的任何提案,由于客戶端2的提案編號是3,3>0,所以客戶端2請求過來之后節(jié)點A、節(jié)點B依然正常的響應(yīng),響應(yīng)的結(jié)果是尚未提案,如下圖所示:
圖片
Paxos算法的準(zhǔn)備階段就完成了,因為客戶端收到了集群中大多數(shù)節(jié)點的響應(yīng)。
2.2 接收階段
在準(zhǔn)備階段完成之后,接下來就是發(fā)送正式請求了,客戶端會帶上提案編號和對應(yīng)的value值,客戶端1就將自己的提案編號以及提案值發(fā)送到集群中的各節(jié)點,同樣的客戶端2也將自己的提案編號和提案值發(fā)送給各節(jié)點,發(fā)送完成之后集群中各節(jié)點就需要做出響應(yīng),如下圖所示:
圖片
客戶端1的請求會被三個節(jié)點全部的拋棄,因為各節(jié)點已經(jīng)約定不會接受比提案編號3小的提案編號,客戶端2發(fā)送過來的請求會被正常的接受,這個時候就完成了節(jié)點中value值的同步。
如果有學(xué)習(xí)者,就將當(dāng)前的這個結(jié)果通知給學(xué)習(xí)者,學(xué)習(xí)者發(fā)現(xiàn)大多數(shù)節(jié)點都通過這個提案,那么它也會通過這個提案,將這個值進(jìn)行存儲。
3、部分節(jié)點已接受提案,新提議者請求的處理
假設(shè)節(jié)點A、節(jié)點B已通過的提案編號為3的提案,節(jié)點C還沒有接受提案,現(xiàn)在有客戶端3攜帶提案編號6來請求,如下圖所示:
圖片
節(jié)點A、節(jié)點B會返回其接受的提案編號和提案值(如提案【3,xia】)給客戶端3,節(jié)點C由于沒有接受到提案,返回結(jié)果是尚無提案,如下圖所示:
圖片
客戶端3會根據(jù)集群中響應(yīng)的最大提案編號來重新設(shè)置value,也就是節(jié)點A、節(jié)點B已通過的提案的編號是3,value為xia;那么客戶端3將提案內(nèi)容中提案編號改成自己的編號,(【3,xia】修改為【6,xia】)修改完成之后客戶端3再將這個結(jié)果發(fā)送給集群中的各個節(jié)點,如下所示:
圖片
集群中的各節(jié)點收到客戶端3的提案之后都會做出響應(yīng),由于客戶端3中的提案編號為6,所以節(jié)點都會接受這個提案請求并且全部通過。
總結(jié):
(1)Paxos是一種強(qiáng)一致性的分布式算法,用于確保分布式系統(tǒng)中的節(jié)點數(shù)據(jù)一致。
(2)Paxos算法主要有準(zhǔn)備請求階段和接受階段,并且承諾不會接受比當(dāng)前提案編號小的請求。