分布式一致性問題的解決方案


     分布式環境的各種問題

    1.通信異常

       從集中式向分布式演變的過程中,必然引入了網絡因素,但網絡本身具有不可靠性,因此消息丟失和消息延遲變得很普通

    2.網絡分區

       當網絡發生異常情況,導致分布式系統中部分節點之間的網絡延時不斷增大,最終只有部分節點之間能夠進行正常通信,而另一些節點不能,這種現象稱為網絡分區,俗稱腦裂

    3.三態

       請求與響應,存在特有的“三態”概念,即成功,失敗與超時。發送消息丟失和響應消息丟失

    4.節點故障

        服務器出現宕機或者“僵死”現象

   事務問題:

       ACID事務四個基本要素:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)

 

   CAP理論

       1998年,加州大學的計算機科學家 Eric Brewer 提出,分布式系統有三個指標。Consistency 一致性,Availability 可用性,Partition tolerance 分區容錯性,簡稱CAP

從CAP定理中我們可以看出,一個分布式系統不可能同時滿足三個,可是對於分布式系統分區容錯性可以說是最基本的要求,主要在C和A之間找平衡。

 

    BASE理論

        BA 是 Basically Available (基本可用):基本可用是指分布式系統在出現不可預知故障的時候,允許損失部分可用性。 比如:響應時間的損失,響應時間變長;功能的損失,購物高峰,部分消費者被引導到降級頁面。

        S 是Soft state(軟狀態):允許部分節點的數據存在一定的延時,這個延時不影響可用性。

        E 是Eventually consistent(最終一致性):最終一致性很好理解,軟狀態允許有一定延時,所以這個最終一致含義就是在一定的延時過去之后,所有節點的數據必須保持一致。 相比的假如在更新的同時,所有節點都必須查詢到最新的數據,這樣的話是一種 強一致性 。 在更新的同時,可以容忍節點查詢到的數據不是最新的那么是一種 弱一致性。

     為了解決分布式一致性問題,在長期的探索研究過程中,出現了很多一致性協議和算法,最著名的就是二階段提交協議和三階段提交協議和Paxos算法。

   

      2PC(二階段提交)

      用來保證分布式系統數據的一致性問題,目前絕大部分關系型數據庫都是采用二階段提交協議來完成分布式系統數據一致性的,能夠有效的保證分布式數據一致性問題

      階段一:提交事務請求

       首先開始事務詢問,協調者向所有的參與者發送事務內容,詢問是否可以提交事務提交操作,並開始等待各參與者的響應。各參與者執行事務操作,並將Undo和Redo信息計入事務日志中,執行事務操作成功那么返回YES,否則返回No,表示事務不可以執行,此時事務並沒有提交。也被稱為“投票階段“。

       階段二:執行事務提交

       根據參與者的反饋,分為兩種情況

       執行事務提交

       假如參與者的反饋都是yes,協調者向所有參與者發出Commit請求,參與者收到請求后,會執行事務提交操作,並釋放事務資源,向協調者發送Ack消息,協調者收到消息完成事務。

       中段事務提交

        假如有任何一個參與者向協調者發送了No響應,或者等待超時之后,協調者都沒有接到參與者的響應,那么就中斷事務,發送Rollback請求,參與者收到后,利用階段一中記錄的Undo信息來執行事務回滾操作,並回滾后釋放在整個事務執行期間占用過的資源,完成后滾后,向協調者發送Ack信息。協調者收到后,完成事務中斷。

下圖展示二階段提交過程中”事務提交“和”事務中斷“兩種場景下的交互流程。

 

 

      缺點:

             1.同步阻塞問題:執行過程中,所有參與節點都是事務阻塞型的。

             2.單點故障:由於協調者的重要性,一旦協調者發生故障。參與者會一直阻塞下去。尤其在第二階段,協調者發生故障,那么所有的參與者還都處於鎖定事務資源的狀態中,而無法繼續完成事務操作。

             3.數據不一致:在二階段提交的階段二中,當協調者向參與者發送commit請求之后,發生了局部網絡異常或者在發送commit請求過程中協調者發生了故障,這回導致只有一部分參與者接受到了commit請求。而在這部分參與者接到commit請求之后就會執行commit操作。但是其他部分未接到commit請求的機器則無法執行事務提交。於是整個分布式系統便出現了數據部一致性的現象。

             4.太過保守

                如果協調者詢問參與者事務提交的過程中,參與者出現故障導致無法獲取所有參與者的響應信息的話,這時協調者只能依靠其自身的超市機制來判斷是否中斷事務,任何一個節點的失敗都會導致整個事務的失敗。

 

3PC(三階段提交)

            1.CanCommit階段 3PC的CanCommit階段其實和2PC的准備階段很像。協調者向參與者發送commit請求,參與者如果可以提交就返回Yes響應,否則返回No響應。

            2.PreCommit階段 協調者根據參與者的反應情況來決定是否可以繼續事務的PreCommit操作。 執行事務預提交 假如協調者從所有的參與者獲得的反饋都是Yes響應,那么就會進行事務的預執行,發送預提交請求協調者向參與者發送PreCommit請求,並進入Prepared階段,參與者接收到PreCommit請求后,會執行事務操作,並將undo和redo信息記錄到事務日志中,如果參與者成功的執行了事務操作,則返回ACK響應,同時開始等待最終指令:提交或中止。

       中斷事務

           假如有任何一個參與者向協調者發送了No響應,或者等待超時之后,協調者都沒有接到參與者的響應,那么就中斷事務,發送中斷請求。協調者向所有參與者發送abort請求,參與者收到來自協調者的abort請求之后(或超時之后,仍未收到參與者的請求),執行事務的中斷。

           3.DoCommit階段

          該階段進行真正的事務提交,也可以分為以下兩種情況:

      提交事務

          發送提交請求。協調者接收到參與者發送的ACK響應,那么他將從預提交狀態進入到提交狀態,並向所有參與者發送doCommit請求,參與者接收到doCommit請求之后,執行正式的事務提交。並在完成事務提交之后釋放所有事務資源,事務提交完之后,向協調者發送ACK響應。

      中斷事務

          協調者沒有接收到參與者發送的ACK響應(可能是接受者發送的不是ACK響應,也可能響應超時),那么就會執行中斷事務。

 

           優點:相較於二階段提交協議,三階段提交一些最大的優點就是降低了參與者的阻塞范圍,並且能夠在出現單點故障后繼續達成一致。

           缺點:如果進入PreCommit后,協調者發出的是abort請求,假設只有一個參與者收到並進行了abort操作,而其他對於系統狀態未知的參與者(網絡分區)會根據3PC選擇繼續Commit,此時系統狀態還是會發生不一致性。

三階段提交協議和兩階段提交協議的不同:

         協調者(Coordinator)和參與者(Cohort)都設置了超時機制(在2PC中,只有協調者擁有超時機制,即如果在一定時間內沒有收到參與者的消息則默認失敗),2PC的准備階段和提交階段之間,插入預提交階段,使3PC擁有CanCommit、PreCommit、DoCommit三個階段。

 

      本文參考內容來源:《從Paxos到Zookeeper  分布式一致性原理與實踐 》


免責聲明!

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



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