この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 11764|答える: 0

分散トランザクションの2PCおよび3PCモデル

[リンクをコピー]
掲載地 2021/03/17 10:15:10 | | |
XA仕様

XAはトランザクションミドルウェアとX/Open DTPによって定義されたデータベースとの間のインターフェース仕様(すなわちインターフェース機能)であり、トランザクションミドルウェアはトランザクションの開始、終了、コミット、ロールバックなどの情報をデータベースに通知するために使われます。 XAインターフェース機能はデータベースベンダーによって提供されています。
第二命令提出契約書と第三命令提出契約書はこの考えから派生しました。 二段階コミットこそがXA分散トランザクションの実装の鍵であると言える(正確には、二段階コミットは主に分散トランザクションの原子性を保証する。つまり、すべてのノードがすべてまたは何もしない)

2PC

二段階コミットとは、分散システムアーキテクチャに基づくすべてのノードのトランザクションコミットの一貫性を維持するために設計されたアルゴリズムであり、コンピュータネットワークやデータベースの分野においてです。 しばしば、2段階コミットはプロトコルとも呼ばれます。 分散システムでは、各ノードは自分の操作の成功または失敗を知ることができますが、他のノードの操作の成功や失敗を知ることはできません。 トランザクションが複数のノードにまたがる場合、トランザクションのACID特性を維持するために、すべてのノード(参加者と呼ばれる)の結果を制御し、最終的にはこれらのノードに結果を提出するよう指示するコーディネーターとなるコンポーネントを導入する必要があります(例:ディスクへの更新データ書き込みなど)。 したがって、2段階提出のアルゴリズムの考え方は次のようにまとめられます。参加者は操作の成功または失敗をコーディネーターに通知し、コーディネーターは全参加者のフィードバック情報に基づいて操作を提出するか中止するかを決定します。
いわゆる2つの段階は、第1段階(準備段階、投票段階)と第2段階:提出段階(実行段階)です。

準備段階

トランザクションコーディネーター(トランザクションマネージャー)は各参加者(リソースマネージャー)にPrereadyメッセージを送信し、各参加者は失敗(例えば権限検証の失敗)を直接返すか、ローカルでトランザクションを実行し、ローカルで再実行・元に戻すログを書き込むがコミットせず、「すべて準備完了、東風のみが支払われている」状態に到達します。

準備段階はさらに以下の3つのステップに分けられます:

1) コーディネーターノードはすべての参加者ノードに投票を行えるか尋ね、各参加者ノードからの回答を待ち始めます。

2) 参加者ノードはクエリが開始されるまですべてのトランザクション操作を実行し、Undo情報とRedo情報をログに書き込みます。 (注:成功した場合、各参加者はすでにトランザクション操作を行っています)

3) 各参加者ノードは、コーディネーターノードから開始された問い合わせに応答します。 参加者ノードのトランザクション操作が実際に成功裏に実行された場合、「同意」メッセージを返します。 もし参加者ノードのトランザクション操作が実際に失敗した場合、「中止」メッセージを返します。

サブミッションステージ
コーディネーターが参加者から失敗メッセージやタイムアウトを受け取った場合、各参加者に直接ロールバックメッセージを送信します。 それ以外の場合は、コミットメッセージを送信します。 参加者はコーディネーターの指示に従ってコミットまたはロールバック操作を行い、トランザクションプロセスで使用されるすべてのロックリソースを解放します。 (注:ロック資源は最終ステージで解放されなければなりません)

次に、提出段階のプロセスについて2つのケースで別々に議論します。

すべての参加ノードからコーディネーターノードが受信する対応するメッセージがAgreeの場合:

サブミッションステージ
コーディネーターが参加者から失敗メッセージやタイムアウトを受け取った場合、各参加者に直接ロールバックメッセージを送信します。 それ以外の場合は、コミットメッセージを送信します。 参加者はコーディネーターの指示に従ってコミットまたはロールバック操作を行い、トランザクションプロセスで使用されるすべてのロックリソースを解放します。 (注:ロック資源は最終ステージで解放されなければなりません)

次に、提出段階のプロセスについて2つのケースで別々に議論します。

すべての参加ノードからコーディネーターノードが受信する対応するメッセージがAgreeの場合:

1) コーディネーターノードがすべての参加ノードに「コミット」リクエストを発行します。

2) 参加ノードが正式に操作を完了し、トランザクション期間中に占有していたリソースを解放します。

3) 参加者ノードがコーディネーターノードに「完了」メッセージを送信します。

4) コーディネーターノードは、すべての参加者ノードから「完了」メッセージのフィードバックを受け取った後にトランザクションを完了します。
もしいずれかの参加者ノードが第1フェーズで「Aborted」の応答メッセージを返すか、コーディネーターノードが第1フェーズのクエリタイムアウト前にすべての参加者ノードに対して応答メッセージを得られなかった場合:

1) コーディネーターノードがすべての参加ノードに「ロールバック」リクエストを発行します。

2) 参加ノードは以前に書かれたUndo情報を使ってロールバックを行い、トランザクション期間中に占有していたリソースを解放します。

3) 参加ノードがコーディネーターノードに「ロールバック完了」メッセージを送信します。

4) コーディネーターノードは、すべての参加者ノードから「ロールバック完了」メッセージのフィードバックを受け取った後、トランザクションをキャンセルします。
最終的な結果にかかわらず、第2フェーズで現在の取引は終了します。
フェーズ2コミットは原子操作を提供するようですが、残念ながらステージ2コミットにもいくつかの欠点があります。


1. 同期ブロッキング問題。 実行中、すべての参加ノードがトランザクションブロッキングを行います。 参加者が公共リソースを占有している場合、他の第三者ノードがその公共リソースにアクセスするのをブロックしなければなりません。

2. 単一障害点。 コーディネーターの重要性から、コーディネーターが失敗すると、 参加者は引き続きブロックを妨害します。 特に第2段階では、コーディネーターが失敗した場合、すべての参加者が依然としてトランザクションリソースをロックした状態にあり、トランザクション操作を継続できません。 (コーディネーターが電話を切った場合、コーディネーターを再選できますが、コーディネーターがダウンして参加者がブロックされる問題は解決しません)

3. データの不一致。 コミットの第2段階の第2段階では、コーディネーターが参加者にコミット要求を送信すると、ローカルネットワークの例外が発生したか、コミット要求プロセス中にコーディネーターが失敗し、一部の参加者のみがコミット要求を受け入れます。 コミットリクエストを受け取った後、これらの参加者はコミット操作を実行します。 しかし、コミットリクエストを受け取らない他のマシンはトランザクションコミットを実行することはできません。 その結果、データ部門の整合性は分散システム全体で実現します。

4. 第2段階で解決できない問題:コミットメッセージを送信した後にコーディネーターがダウンし、そのメッセージを受け取った唯一の参加者もダウンします。 したがって、ファシリテーターが選挙合意を通じて新しいファシリテーターを選出しても、取引の状況は不確実であり、取引が提出されたかどうかは誰にも分かりません。
第2段階の提出の欠陥、例えば同期ブロッキング、単一点問題、分裂脳などを考慮し、研究者たちは第2段階提出を基に改良を加え、3段階提出を提案しました。

3PC

三相コミットは、三相コミットプロトコルとも呼ばれ、二段階コミット(2PC)の改良版です。


2段階コミットとは異なり、3段階コミットには2つの変更があります。

1. タイムアウト機構を導入する。 同時に、ファシリテーターと参加者の両方にタイムアウトのメカニズムが導入されます。
2. 第1および第2段階に準備段階を挿入する。 これにより、最終コミット段階まで参加ノードの状態が一貫していることが保証されます。
言い換えれば、タイムアウト機構の導入に加え、3PCは2PCの準備段階を再び2つに分割し、コミットの3段階にCanCommit、PreCommit、DoCommitの3段階があります。


CanCommitステージ

3PCのCanCommit段階は、実際には2PCの準備段階と非常に似ています。 コーディネーターは参加者にコミット要求を送信し、参加者はコミットできるなら「はい」または「いいえ」の応答を返します。
1. トランザクション問い合わせ ファシリテーターは参加者にCanCommitリクエストを送信します。 トランザクションコミット操作を実行できるか尋ねてみてください。 そして参加者からの返答を待ち始めます。
2. 応答フィードバック CanCommitリクエストを受信した後、参加者はYesの応答を返し、トランザクションがスムーズに実行可能と判断した場合、準備完了状態に入ります。 そうでなければフィードバックは「いいえ」


プリコミットフェーズ

ファシリテーターは参加者の反応に基づいて、取引のPreCommit操作を暗記するかどうかを判断します。 回答によっては二つの可能性があります。
ファシリテーターが全参加者から「はい」というフィードバックを受け取った場合、事前実行が行われます。


1. PreCommitリクエストを送信 ファシリテーターは参加者にPreCommitリクエストを送信し、PrePreyステージに進みます。

2. トランザクション事前コミット 参加者が事前コミット要求を受け取った後、トランザクション操作を実行し、取り消し再実行情報をトランザクションログに記録します。

3. 応答フィードバック 参加者がトランザクション操作を正常に実行した場合、最終命令を待ちながらACK応答が返されます。
もし参加者がコーディネーターにNoの応答を送るか、タイムアウトを待った場合、コーディネーターが参加者から応答を受け取らなければ、トランザクションは中断されます。

1. 割り込みリクエストを送信 ファシリテーターはすべての参加者に中止リクエストを送信します。

2. トランザクションを中断する 参加者がコーディネーターからABORTリクエストを受け取った後(またはタイムアウト後にコーディネーターからのリクエストが受信されていない場合)、トランザクションの中断が実行されます。
doCommitフェーズ

この実トランザクションコミットの段階は、以下の2つの状況にも分けられます。

コミットを実行する


1. コミットリクエストを送信 コーディネーションは参加者から送信されたACK応答を受け取り、その後、プレコミット状態からコミット状態へ移行します。 そしてすべての参加者にdoCommitリクエストを送信します。

2. トランザクション提出 doCommitリクエストを受信した後、参加者は正式なトランザクションコミットを実行します。 トランザクションコミット完了後にすべてのトランザクションリソースを解放します。

3. フィードバックへの応答 トランザクションが提出された後、コーディネーターにAck応答を送信します。

4. トランザクション完了 コーディネーターが全参加者からACK応答を受け取った後、トランザクションは完了します。
割り込みトランザクション

コーディネーターが参加者からACK応答を受け取らない場合(受信側からのACK応答でない場合や、応答がタイムアウトしている場合)、割り込みトランザクションが実行されます。


1. 割り込みリクエストを送信 ファシリテーターが全参加者に中止リクエストを送信します

2. トランザクションロールバック ABORTリクエストを受け取った後、参加者はフェーズ2で記録された元に戻し情報を使ってトランザクションロールバック操作を行い、ロールバック完了後にすべてのトランザクションリソースを解放します。

3. フィードバック結果 参加者がトランザクションロールバックを完了した後、コーディネーターにACKメッセージを送信します

4. トランザクションを割り込む コーディネーターが参加者からACKメッセージを受け取った後、トランザクションは中断されます。
doCommitフェーズでは、参加者がコーディネーターからdoCommitまたはリボートリクエストを期限内に受け取れない場合、タイムアウトが待機した後もトランザクションは送信を続けられます。 (実際には、これは確率に基づいて判断されるべきであり、第3段階に入る時点で参加者が第2段階でPreCommitリクエストを受け取っていることを意味します。したがって、コーディネーターがPreCommitリクエストを生成する前提条件は、第2段階開始前に全参加者からYes CanCommit応答を受け取ることです。) (参加者がPreCommitを受け取った時点で、全員が実際に修正に同意したことを知っていることを意味します)つまり、ネットワークのタイムアウトやその他の理由により第3段階に入る際、参加者はコミットや中止応答を受け取っていなくても、成功するコミットの確率は非常に高いと考える理由があります。 )

2PCと3PCの違い


2PCと比べて、3PCは主に単一障害点の問題を解決し、ブロッキングを軽減します。なぜなら、参加者がコーディネーターからのメッセージを時間内に受信できなかった場合、デフォルトでコミットを実行するからです。 常にトランザクションリソースを保持し、ブロック状態にいるのではなく、 しかしこの仕組みはデータの整合性問題も引き起こします。なぜなら、コーディネーターから送信されたアボート応答がネットワーク上の理由で参加者に時間内に届かず、参加者はタイムアウトを待ってからコミット操作を実行するからです。 これにより、中止コマンドを受け取りロールバックを行う他の参加者とデータに不一致が生じます。




先の:.NET CoreはBaidu PaddleOCRを呼び出して画像やテキストを認識します
次に:Markdown構文のCSVオンライン変換
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com