分布式一致性協議


分布式一致性協議

分布式一致性協議包含二階段提交協議、三階段提交協議、Paxos算法。

二階段提交協議(2PC)

二階段提交協議處理過程分為了投票和執行兩個階段,其核心是對每個事務都采用先嘗試后提交的處理方式,本質是強一致性算法。

階段一:提交事務請求

1.事務詢問

協調者發起請求,詢問參與者是否可以執行事務。

2.執行事務

參與者收到事務請求后,執行事務,並把undo和redo寫入log中

3.返回相應

參與者向協調者反饋是否可以執行。如果參與者成功執行事務,則返回yes響應;否則返回no響應

階段二:執行事務提交

正常情況下:

1.發起事務提交

協調者向所有參與者發起commit請求

2.事務提交

參與者執行事務提交

3.反饋結果

參與者把執行事務提交的結果反饋給協調者

4.完成事務

異常情況下:

(如果有任何參與者提交事務失敗,並把失敗響應反饋給協調者,協調者會執行如下)

1.發起事務回滾

協調者向所有參與者發起rollback請求

2.執行事務回滾

參與者回滾事務

3.反饋回滾結果

4.中斷事務

 

二階段提交協議的優點:原理簡單、實現方便

二階段提交協議的缺點:同步阻塞、單點、腦裂、過於保守

同步阻塞:各個參與者在等待其他參與者響應的過程中,將無法進行其他任何操作

單點:協調者單點問題。如果在階段二,協調者出現問題,會導致資源被占用無法釋放

數據不一致:如果在階段二,發生網絡異常,部分參與者提交事務,部分未提交,導致數據不一致。

過於保守:協調者未收到參與者響應,就會根據自身的超時機制處理,沒有完善的容錯機制。

 

三階段提交協議(3PC)

階段一:CanCommit

1.事務詢問

協調者向所有參與者發起一個cancommit請求,詢問是否可以發起事務提交操作,並等待回應。

2.參與者反饋事務詢問的響應

參與者根據自身情況,如果能夠執行事務就返回yes響應,否則就返回no響應

階段二:precommit

協調者根據階段一反饋結果,執行操作:

 

(一)   執行事務預提交(所有參與者均返回yes響應)

1.發起預提交請求

協調者向所有參與者發起預提交請求,並進去prepared階段。

2.事務預提交

各參與者收到請求后執行事務操作,並把undo和redo記錄到log中

3.反饋結果

參與者執行完事務后,返回給協調者ack響應,同時等待最終指令:提交或者回滾

(二)   中斷事務(參與者返回no響應,或者超時未收到響應)

1.發送中斷請求

協調者向所有參與者發起中斷請求

2.中斷事務

各參與者收到協調者發送的中斷請求,或者等待協調者請求的過程中出現超時,參與者都會進行中斷事務

階段三:docommit

該階段進行真正的事務提交

(一)   執行提交

1.發送提交請求

進入階段三,假設協調者處於正常狀態,並且受到所有參與者的ack響應,那么會向所有參與者發送docommit請求。

2.事務提交

參與者收到docommit請求后,會執行事務提交操作

3.反饋事務提交結果

參與者執行完事務后,向協調者反饋ack消息

4.完成事務

協調者收到所有參與者響應后,完成事務

(二)   中斷事務

1.發送中斷請求

假設協調者處於正常狀態,並且有任意一個參與者反饋了no響應,或者等待超時后協調者無法接收到所有參與者的反饋,協調者發起中斷請求。

2.事務回滾

參與者收到中斷請求后,利用階段二中記錄的undo信息,發起回滾操作。

3.反饋事務回滾結果

參與者完成事務回滾后,向協調者發送ack消息。

4.中斷事務

協調者收到所有參與者反饋的ack消息后,中斷事務。

備注:一旦進入階段三,協調者出現問題,或者協調者和參與者之間網絡出現問題,參與者等待超時后都會進行事務提交。

三階段提交協議的優缺點

優點:1.降低了參與者的阻塞范圍;2.出現單點故障后繼續達成一致。

缺點:參與者收到precommit后,出現網絡異常,但是參與者會繼續提交事務,最終會出現數據不一致的情況。

 

Paxos算法

paxos算法類似於兩階段提交的算法:

(一)   選定提案

階段一

  1. proposer選擇一個提案編號Mn,然后向Acceptor的某個超過半數的子集成員發送編號為Mn的prepare請求。
  2. 如果一個acceptor收到一個編號為Mn的perpare請求,且編號Mn大於該acceptor已經響應過得所有prepare請求的編號,那么它就把批准過得最大編號的提案作為響應返回給proposer,同時acceptor承諾不會再批准任何編號小於Mn的提案。

階段二

  1. 如果proposer收到來自半數以上的acceptor對於其發出的編號為Mn的prepare請求的響應,那么它就會發送一個針對【Mn,Vn】提案的accept請求給acceptor。Vn就是收到的響應中編號最大的提案的值。
  2. 如果acceptor收到這個針對【Mn,Vn】提案的accept請求,只要改acceptor尚未對編號大於Mn的prepare請求做出響應,它就可以通過這個提案。

(二)   獲取提案

acceptor將批准的提案發送給一個特定的learner集合,該集合中的每個learner都可以在一個提案被選定后通知所有其他的learner。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM