24

三相コミットがブロックを回避する方法を理解しようとしています

次の 2 つの障害シナリオを検討してください。

シナリオ 1: フェーズ 2 では、コーディネーターは preCommit メッセージをすべてのコホートに送信し、コホート A を除くすべてから ack を受け取りました。ネットワークの問題により、コホート A はコーディネーターの preCommit メッセージを受信できません。コホート A は、preCommit メッセージの待機中にタイムアウトになり、中止を選択します。次に、コーディネーターとコホート A の両方がクラッシュします。

シナリオ 2: プロトコルはフェーズ 3 に達します。コーディネーターはコホート A に doCommit メッセージを送信します。しかし、さらに doCommit メッセージを送信する前に、コーディネーターがクラッシュします。コホート A は、トランザクションの一部をコミットしてからクラッシュします。

私が知る限り、残りのコホートはシナリオ 1 とシナリオ 2 の最後でまったく同じ状態になっています。したがって、回復コーディネーターが介入するとき、残りのコホートから、シナリオ 1 にいて中止するか、または中止するかをどのように確認できますか?シナリオ2にあり、コミットしてブロックを回避しますか?

4

4 に答える 4

12

3 フェーズ コミットは魔法ではありません。2 フェーズ コミットよりも弾力性があります。特に、3PC は単一点障害に対して回復力がありますが、すべての種類の複数点障害に対して回復力があるわけではありません。質問の両方のシナリオは、2 点障害を想定しています。言い換えれば、質問の前提は間違っています。能力以上の 3PC を求めています。

さらに読むために、Muhammad Atif による、2 フェーズ コミットおよび 3 フェーズ コミット プロトコルの分析と検証というテーマに関する論文の要約からの文を以下に示します。

また、その「修正された」バリアントである Three-Phase Commit Protocol (3PC) にこの方法を適用し、サイトの同時障害に対して誤りがあることを証明します。

私はこの論文が文献への足がかりを提供することを発見しました。掘り下げたいのであれば、このテーマについては少なからずあります。

于 2014-02-06T14:47:43.477 に答える
5

シナリオ 1 では:

回復中: A を除くすべてのコホートが PRECOMMIT 状態になります。これは、すべてのコホートがコミットに投票し、前進したことをリカバリ ノードに通知します。したがって、A とコーディネーターは PRECOMMIT 状態である必要があります。これは非最終状態であるため、トランザクションは中止されます。

シナリオ 2 では:

回復中: A を除くすべてのコホートが PRECOMMIT 状態になります。これは、すべてのコホートがコミットに投票し、先に進んだことをリカバリ ノードに通知します。しかし、A が doCommit メッセージを受信したため、COMMITTED 状態になっています。クラッシュが発生しなかった場合、少なくとも 1 つのコホートがコミットされているため、リカバリはすべてのコホートにコミットするように要求します。 . クラッシュ (A crashed) が発生したため、復旧ノードはコミットされた状態のライブ コホートを認識しないため、コホートが doCommit メッセージを取得していないと推測します。したがって、トランザクションは中止され、すべてのコホートがリソースを解放するよう求められます。

A がクラッシュから戻って回復を開始すると、他のすべてのコホートがトランザクションを中止したことがわかり、それもトランザクションを中止します。

状態図
(ソース: regal.csep.umflint.edu の swturner )

于 2014-02-06T12:54:49.800 に答える
4

ノンブロッキング プロパティを理解するのに役立ったのは、メッセージの最初のラウンドの後、両方のプロトコルが本質的に同じ状態にあることに気付いたことです。すべての参加者は、コミットできることに同意し、そうするための確認を待っています。

ここで、参加者が最初のラウンドで「コミットしてもいい」と答えた後、参加者が何を知っているかを考えてみましょう。

  • 2PC: 別の参加者が既にコミットするメッセージを受信して​​コミットしている可能性があります。あるいは、参加者がコミットを行っていない可能性もあります。したがって、参加者が何も聞こえない場合、グループの決定が何であったかわかりません。
  • 3PC: 参加者は、他の参加者がコミット アクションを実行していないことを確認できます。コーディネーターに障害が発生した場合でも、操作全体をロールバックしても安全です。

次に進み、3PC での 2 回目のメッセージと確認の後、すべての参加者がグループの決定がコミットであることを知っていることが保証されます。

つまり、3PC では、参加者が別の参加者が予期していないコミット アクションを実行することはありません。

于 2019-04-24T15:59:27.770 に答える