<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                為了解決分布式一致性問題,產生了不少經典的分布式一致性算法,本文將介紹其中的2PC和3PC。 2PC即Two-Phase Commit,譯為二階段提交協議。 3PC即Three-Phase Commit,譯為三階段提交協議。 ### **分布式系統和分布式一致性問題** 分布式系統,即運行在多臺不同的網絡計算機上的軟硬件系統,并且僅通過消息傳遞來進行通信和協調。 分布式一致性問題,即相互獨立的節點之間如何就一項決議達成一致的問題。 ###** 2PC** 2PC,二階段提交協議,即將事務的提交過程分為兩個階段來進行處理:準備階段和提交階段。 事務的發起者稱協調者,事務的執行者稱參與者。 ##### **階段1:準備階段** * 1、協調者向所有參與者發送事務內容,詢問是否可以提交事務,并等待所有參與者答復。 * 2、各參與者執行事務操作,將Undo和Redo信息記入事務日志中(但不提交事務)。 * 3、如參與者執行成功,給協調者反饋YES,即可以提交;如執行失敗,給協調者反饋NO,即不可提交。 ##### **階段2:提交階段** 此階段分兩種情況:所有參與者均反饋YES、或任何一個參與者反饋NO。 所有參與者均反饋YES時,即提交事務。 任何一個參與者反饋NO時,即中斷事務。 提交事務:(所有參與者均反饋YES) * 1、協調者向所有參與者發出正式提交事務的請求(即Commit請求)。 * 2、參與者執行Commit請求,并釋放整個事務期間占用的資源。 * 3、各參與者向協調者反饋Ack完成的消息。 * 4、協調者收到所有參與者反饋的Ack消息后,即完成事務提交。 附如下示意圖: 中斷事務:(任何一個參與者反饋NO) * 1、協調者向所有參與者發出回滾請求(即Rollback請求)。 * 2、參與者使用階段1中的Undo信息執行回滾操作,并釋放整個事務期間占用的資源。 * 3、各參與者向協調者反饋Ack完成的消息。 * 4、協調者收到所有參與者反饋的Ack消息后,即完成事務中斷。 附如下示意圖: ### **2PC的缺陷** * 1、同步阻塞:最大的問題即同步阻塞,即:所有參與事務的邏輯均處于阻塞狀態。 * 2、單點:協調者存在單點問題,如果協調者出現故障,參與者將一直處于鎖定狀態。 * 3、腦裂:在階段2中,如果只有部分參與者接收并執行了Commit請求,會導致節點數據不一致。 由于2PC存在如上同步阻塞、單點、腦裂問題,因此又出現了2PC的改進方案,即3PC。 ### **3PC** 3PC,三階段提交協議,是2PC的改進版本,即將事務的提交過程分為CanCommit、PreCommit、do Commit三個階段來進行處理。 ##### **階段1:CanCommit** * 1、協調者向所有參與者發出包含事務內容的CanCommit請求,詢問是否可以提交事務,并等待所有參與者答復。 * 2、參與者收到CanCommit請求后,如果認為可以執行事務操作,則反饋YES并進入預備狀態,否則反饋NO。 ##### **階段2:PreCommit** 此階段分兩種情況: * 1、所有參與者均反饋YES,即執行事務預提交。 * 2、任何一個參與者反饋NO,或者等待超時后協調者尚無法收到所有參與者的反饋,即中斷事務。 事務預提交:(所有參與者均反饋YES時) * 1、協調者向所有參與者發出PreCommit請求,進入準備階段。 * 2、參與者收到PreCommit請求后,執行事務操作,將Undo和Redo信息記入事務日志中(但不提交事務)。 * 3、各參與者向協調者反饋Ack響應或No響應,并等待最終指令。 中斷事務:(任何一個參與者反饋NO,或者等待超時后協調者尚無法收到所有參與者的反饋時) * 1、協調者向所有參與者發出abort請求。 * 2、無論收到協調者發出的abort請求,或者在等待協調者請求過程中出現超時,參與者均會中斷事務。 ##### **階段3:do Commit** 此階段也存在兩種情況: * 1、所有參與者均反饋Ack響應,即執行真正的事務提交。 * 2、任何一個參與者反饋NO,或者等待超時后協調者尚無法收到所有參與者的反饋,即中斷事務。 提交事務:(所有參與者均反饋Ack響應時) * 1、如果協調者處于工作狀態,則向所有參與者發出do Commit請求。 * 2、參與者收到do Commit請求后,會正式執行事務提交,并釋放整個事務期間占用的資源。 * 3、各參與者向協調者反饋Ack完成的消息。 * 4、協調者收到所有參與者反饋的Ack消息后,即完成事務提交。 中斷事務:(任何一個參與者反饋NO,或者等待超時后協調者尚無法收到所有參與者的反饋時) * 1、如果協調者處于工作狀態,向所有參與者發出abort請求。 * 2、參與者使用階段1中的Undo信息執行回滾操作,并釋放整個事務期間占用的資源。 * 3、各參與者向協調者反饋Ack完成的消息。 * 4、協調者收到所有參與者反饋的Ack消息后,即完成事務中斷。 注意:進入階段三后,無論協調者出現問題,或者協調者與參與者網絡出現問題,都會導致參與者無法接收到協調者發出的do Commit請求或abort請求。 此時,參與者都會在等待超時之后,繼續執行事務提交。 附示意圖如下: ### **3PC的優點和缺陷** 優點:降低了阻塞范圍,在等待超時后協調者或參與者會中斷事務。避免了協調者單點問題,階段3中協調者出現問題時,參與者會繼續提交事務。 缺陷:腦裂問題依然存在,即在參與者收到PreCommit請求后等待最終指令,如果此時協調者無法與參與者正常通信,會導致參與者繼續提交事務,造成數據不一致。 ### **后記** 無論2PC或3PC,均無法徹底解決分布式一致性問題。 **解決一致性問題,唯有Paxos。**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看