blog

ShardingSphere 4.x 分散トランザクション

データベース・トランザクションは、4つのACID特性を満たす必要があります。 Atomicity(原子性)とは、トランザクションが全体として実行され、すべて実行されるか、まったく実行されないかを意味し...

Dec 3, 2020 · 4 min. read

背景

データベーストランザクションは4つのACID特性を満たす必要があります。

  • 原子性とは、トランザクションが全体として実行されることを意味します。
  • 一貫性とは、トランザクションがデータをある一貫性のある状態から別の状態に確実に変更することを意味します。
  • 分離とは、複数のトランザクションが同時に実行される場合、あるトランザクションの実行が他のトランザクションの実行に影響を与えないようにすることです。
  • 永続性とは、コミットされたトランザクションによって変更されたデータが永続化されることを意味します。

単一のデータノードでは、トランザクションはローカルトランザクションと呼ばれる単一のデータベースリソースに対するアクセス制御に限定されます。ほぼすべての成熟したリレーショナルデータベースは、ローカルトランザクションをネイティブにサポートしています。しかし、マイクロサービスに基づく分散アプリケーション環境では、複数のサービスとそれに対応する複数のデータベースリソースへのアクセスを同じトランザクションに含める必要があるアプリケーションシナリオが増えており、分散トランザクションが出現しています。

リレーショナル・データベースは、ローカル・トランザクションに対して完璧なACIDネイティブ・サポートを提供します。しかし、これは分散シナリオではシステム性能の足かせとなります。分散シナリオにおいてデータベースをどのようにACIDの特徴を満足させるか、あるいはそれに代わるものを見つけるかが分散トランザクションの焦点です。

ちほうじむし

分散トランザクションマネージャをオンにしないと、各データノードは自分のトランザクションを管理します。データノードは互いに協調して通信する能力を持たず、他のデータノードのトランザクションの成功を知りません。ローカル・トランザクションの性能低下はありませんが、強力で最終的な一貫性に対してはロバストではありません。

二段階コミット

X/Open Distributed Transaction ProcessingXAプロトコルの最も初期の分散トランザクションモデルは、X/Open International Consortiumによって提案されたモデル、略してXAプロトコルでした。

XAプロトコルに基づく分散トランザクションは、ビジネスへの介入はほとんどありません。その最大の利点は、ユーザーにとって透過的であることです。ユーザーは、XAプロトコルに基づく分散トランザクションを使用するように、ローカルトランザクションを使用することができます。XAプロトコルは、トランザクションのACID特性を厳密に保証することができます。

厳密に保証されたトランザクションのACID機能は諸刃の剣です。トランザクションの実行には、プロセス中に必要なすべてのリソースをロックする必要があり、実行時間が定められている短いトランザクションに適しています。長時間のトランザクションの場合、トランザクション全体を通じてデータが排他的であるため、ホットスポットデータに依存するビジネスシステムの同時実行性能が著しく低下します。したがって、XAプロトコルに基づく分散トランザクションは、高い同時実行パフォーマンスを優先するシナリオでは最適な選択ではありません。

柔軟なサービス

ACIDのトランザクション要素を実装したトランザクションをリジッドトランザクションと呼ぶなら、BASEのトランザクション要素に基づいたトランザクションはフレキシブルトランザクションと呼ばれます。BASEとは、Basic Availability(基本的な可用性)、Flexible State(柔軟な状態)、Eventual Consistency(最終的な一貫性)の略。

  • 基本的な可用性は、分散トランザクションの参加者が必ずしも同時にオンラインでないことを保証します。
  • フレキシブル・ステートは、システム・ステートの更新に一定の遅れを生じさせますが、これは必ずしもお客様には気づかれません。
  • そして最終的な一貫性は通常、メッセージパッシングによってシステムに保証されます。

ACIDトランザクションの分離要件は高く、トランザクション実行中はすべてのリソースをロックしなければなりません。柔軟なトランザクションの考え方は、ビジネス・ロジックを通じて相互排他ロック操作をリソース・レベルからビジネス・レベルに移すことです。システムのスループット向上と引き換えに、強力な一貫性要件を緩和します。

ACIDに基づく強力な一貫性トランザクションとBASEに基づく最終的な一貫性トランザクションは、銀の弾丸ではありません。次の表は、開発者が技術的な選択をする際に役立つように、両者の違いを詳細に比較したものです。

ビジネス変革 いいえ いいえ 関連インターフェースの実装
一貫性 サポート対象外 サポート 最終合意
分離 サポート対象外 サポート オペレーター保証
同時実行性能 影響なし 深刻な衰退 わずかな後退
適したシナリオ 取引先による一貫性のない扱い 同時実行性能 同時実行性能

課題

アプリケーションのシナリオが異なるため、開発者は様々な分散トランザクションをパフォーマンスと機能性の間で合理的にトレードオフできるようにする必要があります。

強力な一貫性のあるトランザクションと柔軟なトランザクションは、APIや機能が同一ではなく、自由に透過的に切り替えることができません。開発決定段階で、一貫性の強いトランザクションと柔軟なトランザクションのどちらかを選択しなければならず、設計・開発コストが大幅に増加します。

XAベースの強力な一貫性のあるトランザクションは、使用するのは比較的簡単ですが、インターネットの高い同時実行性や複雑なシステムの長いトランザクションシナリオにうまく対処できません。柔軟なトランザクションは、開発者がアプリケーションを変換する必要があり、アクセスコストが非常に高く、開発者は独自のリソースロックと逆補償を実装する必要があります。

目的

既存の成熟したトランザクション・ソリューションを統合し、ローカル・トランザクション、2フェーズ・トランザクション、柔軟なトランザクションのための統一された分散トランザクション・インターフェースを提供し、現在のソリューションの欠点を補い、ワンストップの分散トランザクション・ソリューションを提供することが、ShardingSphere分散トランザクション・モジュールの主な設計目標です。

Read next

ESLintを使うためのヒント

eslintは動的で弱い型付けの言語であり、開発中にエラーが発生しやすい言語です。コンパイラがないので、コードのエラーを見つけるには通常、実行中にデバッグする必要があります。ESLintのようなものは、プログラマが実行中ではなくコーディング中に問題を見つけることを可能にします。

Dec 2, 2020 · 5 min read

デッドロックとは何か?

Nov 30, 2020 · 2 min read

vue + base64圧縮と回転

Nov 29, 2020 · 3 min read

Javaのいくつかの参照型

Nov 26, 2020 · 3 min read