分布式一致性協議
分布式一致性協議包含二階段提交協議、三階段提交協議、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算法類似於兩階段提交的算法:
(一) 選定提案
階段一
- proposer選擇一個提案編號Mn,然后向Acceptor的某個超過半數的子集成員發送編號為Mn的prepare請求。
- 如果一個acceptor收到一個編號為Mn的perpare請求,且編號Mn大於該acceptor已經響應過得所有prepare請求的編號,那么它就把批准過得最大編號的提案作為響應返回給proposer,同時acceptor承諾不會再批准任何編號小於Mn的提案。
階段二
- 如果proposer收到來自半數以上的acceptor對於其發出的編號為Mn的prepare請求的響應,那么它就會發送一個針對【Mn,Vn】提案的accept請求給acceptor。Vn就是收到的響應中編號最大的提案的值。
- 如果acceptor收到這個針對【Mn,Vn】提案的accept請求,只要改acceptor尚未對編號大於Mn的prepare請求做出響應,它就可以通過這個提案。
(二) 獲取提案
acceptor將批准的提案發送給一個特定的learner集合,該集合中的每個learner都可以在一個提案被選定后通知所有其他的learner。