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

























