2 フェーズコミット

アトミック操作で複数のノード上のリソースを更新する

問題

データをクラスタノードの複数にアトミックに保存する必要がある場合、他のクラスタノードの決定が明らかになるまで、ノードはデータをクライアントにアクセス可能にできません。各ノードは、他のノードがデータを正常に保存したのか、失敗したのかを知る必要があります。

解決策

当然ながら、2 フェーズコミットの本質は、2 つのフェーズで更新を実行することです

  1. 準備フェーズでは、各ノードに更新を実行することを約束できるかどうか尋ねます。
  2. コミットフェーズでは、実際それを実行します。

準備フェーズの一環として、トランザクションに参加している各ノードは、2 番目のフェーズでコミットできることを保証するために必要なものを取得します。たとえば、必要なロックなどです。各ノードが 2 番目のフェーズでコミットできることを確認できると、コーディネーターに通知し、2 番目のフェーズでコミットできる、またそうすることを約束します。いずれかのノードがその約束をすることができない場合、コーディネーターはすべてのノードにロールバックし、ロックを解放するように指示し、トランザクションは中止されます。すべての参加者が続行することに同意した場合にのみ、2 番目のフェーズが開始されます。そのときには、すべてのノードが正常に更新することが期待されます。各参加者は、Write-Ahead Log などのパターンを使用して、決定の永続性を確保することが不可欠です。これは、ノードがクラッシュして再起動しても、問題なくプロトコルを完了できる必要があることを意味します。

詳細については、oreilly.com のオンライン電子書籍のChapter 21 にアクセスしてください。

このパターンは Patterns of Distributed Systems の一部です。

2023 年 11 月 23 日