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を用いた復旧、チェックポイント処理の最適化など、複数の技術が組み合わさり、システム全体の信頼性とパフォーマンスを支えている。