我相信三階段提交是一個更好的方法。不幸的是,我還沒有發現任何人實施這樣的技術。
http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/
這裏有上述文章的主要部分:
與2PC的主要困難是,一旦提交已決定由統籌製作,並傳達給一些副本,複製品會直接前進並根據提交語句執行操作,而不檢查每個其他副本是否收到該消息。然後,如果提交的副本與協調者一起崩潰,那麼系統無法告訴交易的結果是什麼(因爲只有收到消息的協調員和副本肯定知道)。由於事務可能已經在崩潰的副本上提交,協議不能悲觀地中止 - 因爲事務可能具有無法撤消的副作用。同樣,該議定書也不能樂觀地強制交易承諾,因爲最初的投票可能是墮胎。
這個問題 - 大部分情況 - 通過增加一個額外的階段到2PC來繞過,毫不奇怪,給我們一個三階段提交協議。這個想法很簡單。我們打破2PC的第二階段 - '承諾' - 分成兩個子階段。首先是「準備提交」階段。當協調員在第一階段收到一致的「是」票時,協調員會將此消息發送給所有副本。在接收到這些消息後,副本進入可以提交事務的狀態 - 通過獲取必要的鎖等等,但最重要的是不做任何以後無法撤消的工作。然後他們回覆協調員,告訴它已收到「準備提交」的信息。
此階段的目的是將投票結果傳達給每個副本,以便無論哪個副本死亡都可以恢復協議的狀態。
該協議的最後階段與2PC中的原始「提交或放棄」階段幾乎完全相同。如果協調員收到所有副本提交的「準備提交」消息的確認,則繼續提交事務是安全的。然而,如果交付沒有得到確認,協調員不能保證協議狀態在它發生崩潰時能夠被恢復(如果你容忍固定數量的故障,則協調器可以在接收到f + 1後繼續確認)。在這種情況下,協調員將中止交易。
如果協調器在任何時候都應該崩潰,恢復節點可以接管事務並從任何剩餘的副本中查詢狀態。如果已提交事務的副本已經崩潰,則我們知道每個其他副本都收到了「準備提交」消息(否則協調器不會移動到提交階段),因此恢復節點將會能夠確定交易能夠被執行,並且安全地將協議安排在其結論之上。如果有任何副本向恢復節點報告尚未收到「準備提交」的副本,恢復節點將知道該事務沒有在任何副本上提交,因此能夠悲觀地中止或重新運行協議從一開始就。
那麼3PC是否解決了我們所有的問題?不完全,但接近。在網絡分區的情況下,車輪相當不錯 - 想象一下,所有收到「準備提交」的副本位於分區的一側,而那些不在另一側的副本。然後這兩個分區將繼續與分別提交或中止事務的恢復節點,並且當網絡合並時,系統將具有不一致的狀態。所以3PC和2PC一樣有可能不安全的運行,但總是會取得進展並因此滿足其活性特性。 3PC不會阻止單節點故障的事實使得它對於高可用性比低延遲更重要的服務更具吸引力。
這個答案提出了[網絡可靠]這個危險的假設(https://queue.acm.org/detail.cfm?id=2655736)。 –
我不知道你在做什麼。如果在第一階段發生網絡中斷,TM將無法連接到其中一個RM並因致命錯誤而中止交易,最終告知所有RM在他們重新聯機時中止。在第二階段,它將繼續輪詢RM,直到網絡恢復正常,此時它將發出確認提交。同樣,2PC不保證提交,它只是保證事務不會失敗,沒有應用程序意識到它。 – ConcernedOfTunbridgeWells
如果TM在收到所有投票提交後崩潰,但在發送最終提交/放棄之前會怎麼樣?然後每個人都拿着鎖,等待投票。而且你不能超時,有些節點可能會提交而其他節點會超時並中止。如果你有一個同步可靠的網絡,並且沒有節點崩潰,並且你有實時操作系統,這樣你就可以在有限的時間內保證進度,那麼2PC就可以工作。通常,我們沒有這些屬性。 –