OpenGaussストレージエンジンの内部機構と実装詳細

OpenGaussデータベースシステムのストレージエンジンは、データの永続化、管理、アクセスを担うコアコンポーネントである。ACID特性の確保、高並列処理、ハードウェアリソースの最適化が主要な要件となる。 OpenGaussのストレージエンジンは、SQLエンジンと物理ストレージの間でデータのやり取りを管理する。ページ単位または圧縮単位(CU)でのデータ操作を実現し、ディスクI/Oの最適化を図る。 ストレージ管理子(SMGR)は、ディスクベースのデータ操作を担当する。以下はその主要な操作関数の例:
関数機能
disk_initディスクストレージの初期化
disk_closeリソースの解放
disk_createファイルの作成
disk_existsファイルの存在確認
disk_removeファイルの削除
disk_extendファイルの拡張
disk_prefetchデータの事前読み込み
disk_readデータの読み込み
disk_writeデータの書き込み
disk_syncディスクへの同期
disk_block_countブロック数の取得
disk_truncateファイルの切り詰め
disk_immediate_sync即時同期処理
disk_async_read非同期読み込み
disk_async_write非同期書き込み
ストレージ管理子の初期化処理は、以下のようになる:
void storage_manager_init(void) {
    for (int i = 0; i < MAX_STORAGE_MANAGERS; i++) {
        if (smgr_ops[i].init) {
            smgr_ops[i].init();
        }
    }
    on_proc_exit(storage_manager_shutdown, 0);
    initialize_synchronization();
}
シャットダウン時の処理:
void storage_manager_shutdown(int code, Datum arg) {
    for (int i = 0; i < MAX_STORAGE_MANAGERS; i++) {
        if (smgr_ops[i].shutdown) {
            smgr_ops[i].shutdown();
        }
    }
}
OpenGaussは複数のストレージエンジンをサポートし、用途に応じて最適化されている。行指向エンジンはOLTPワークロード向け、列指向エンジンはOLAP向け、メモリ最適化テーブル(MOT)は低遅延処理を必要とするシナリオで使用される。これらのエンジンは同一トランザクション内で相互に操作可能であり、ACID特性を維持する。 行指向ストレージエンジンは、インプレース更新とMVCCを採用し、高並列性と低遅延を実現。バッファ管理は、データの読み込み、変更、ディスクへの反映を効率的に行う。主要な処理フローは以下の通り: - バッファの取得:データを読み込む際、既存バッファを再利用または新規生成。 - バッファの解放:使用終了時にリソースを返却。 - データの変更マーク:バッファの内容が変更されたことを記録。 多バージョン管理は、トランザクションIDとctid(行識別子)を基に実現。各データバージョンは固有のトランザクションIDを持ち、ページ内の位置を示すctidで管理。読み込み処理では、現在のトランザクションの状態に基づき適切なバージョンを選択。更新や削除時には、新しいバージョンを生成し、旧バージョンのxmaxを更新して無効化する。 さらに、CSN(コミットシーケンスナンバー)を用いた可視性判定、WALを用いた復旧、チェックポイント処理の最適化など、複数の技術が組み合わさり、システム全体の信頼性とパフォーマンスを支えている。

タグ: OpenGauss ストレージエンジン mvcc WAL 行指向ストレージ

5月28日 03:25 投稿