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