グローバルスナップショットと分散整合性読み取り
従来のデータベースでは「スナップショット分離レベル」と「マルチバージョン並行制御(MVCC)」の技術が採用されています。これらの技術はデータの複数バージョンを管理し、変更操作時に異なるバージョン番号を使用して読み書きの競合を解決します。
分離レベルの比較
分離レベル : ダーティリード : 非再現読み取り : ファントムリード
Read uncommitted : ○ : ○ : ○
Read committed : × : ○ : ○
Repeatable read : × : × : ○
Serializable : × : × : ×
OceanBaseの分離レベルサポート
MySQLモード
- 読取コミット済み(デフォルト)
- 再現可能読み取り
Oracleモード
- 読取コミット済み(デフォルト)
- 直列化可能
設定方法
-- トランザクションレベル
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- セッションレベル
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
分散データベースの課題
OceanBaseは共有ナシングの分散アーキテクチャを採用しており、グローバルなスナップショット分離レベルとMVCCの実装において、分散環境特有の技術的課題に直面します。
グローバル整合性スナップショット技術
OceanBaseは集中型サービスを使用してグローバルに整合性のあるバージョン番号を提供します。すべてのトランザクションはこのサービスからバージョン番号を取得し、単調増加かつ現実世界の時間順序と整合性を保証します。
GTSサービスの高可用性
GTSはクラスタのコアコンポーネントであり、テナントレベルに応じて異なる高可用性方式を採用しています。
- ユーザーテナント:内部テーブル __all_dummy のリーダーをGTSサービスプロバイダーとして使用
- システムテナント:__all_core_table のリーダーをGTSサービスプロバイダーとして使用
GTS Leader
/ \
/ (PaxosGroup) \
GTS Follower---GTS Follower
分散トランザクションのACID保証
原子性(Atomicity)
- 2相コミットプロトコルによる分散トランザクションの原子性保証
整合性(Consistency)
- 主キー一意性などの整合性制約の保証
- グローバルスナップショット - 単一テナントGTSサービスで毎秒200万回以上の応答
分離性(Isolation)
- MVCCによる並行制御で読取コミット済み分離レベルを実現
- 変更行への排他ロックによる書き込み-書き込み競合の防止
- 特定スナップショットバージョンの読み取りによる読み書きブロッキングの回避
持続性(Durability)
- PaxosプロトコルによるRedo-Logの複製同期
分散2相コミットプロトコル
2相コミットは強力な整合性と中心化された原子性コミットプロトコルです。
- 第1相:コーディネーターが参加者に提案を通知し、参加者はローカルでトランザクションを実行試行
- 第2相:コーディネーターが参加者のフィードバックに基づいてコミットまたはロールバックを決定
OceanBaseの2相コミット最適化
- コーディネーターのログ書き込みを排除し、非永続状態のステートマシンに変更
- トランザクション状態は参加者の永続状態によって決定
- 全参加者のprepare成功で即時クライアントにコミット返答
- 参加者リストの永続化による異常回復時のコーディネーター状態再構築
トランザクション遅延分析
ユーザー感知コミット遅延
- 標準方式:4回のログ遅延 + 2回のRPC遅延
- OceanBase:1回のログ遅延 + 2回のRPC遅延
分散トランザクション最適化
- 単一パーティショントランザクション:2PCを経由せず直接ログ書き込み
- 単一マシン複数パーティショントランザクション:最適化された2相コミット
- 複数マシントランザクション:完全な2相コミット
- データモデル設計原則:マシン間分散トランザクションの回避