メモリの割り当て
システムテナント
システムテナントは、OceanBaseデータベースのクラスタ管理者がOceanBaseデータベースをインストールする際に自動的に作成します。V4.2.1バージョン以前では、システムテナントが実際に使用できるメモリの上限はsys_unit_config.memory_sizeでした。V4.2.1バージョン以降では、システムテナントが実際に使用できるメモリの上限はhidden_sys_memory + sys_unit_config.memory_sizeとなります。
ここで:
sys_unit_config.memory_sizeの値は、リソース仕様
sys_unit_configのmemory_sizeによって決定されます。sys_unit_configはシステムテナントのデフォルトのリソース仕様であり、そのデフォルトのメモリリソースは最小リソースです。システムテナントも通常のテナントであるため、ALTER RESOURCEステートメントを使用してsys_unit_configのmemory_size値を変更できます。hidden_sys_memoryの値は、隠れたパラメータ
_hidden_sys_tenant_memoryによって制御されます。隠れたパラメータ_hidden_sys_tenant_memoryのデフォルト値は0Gであり、システムが一定のルールに従ってhidden_sys_memoryの値を適応的に割り当てることを意味します。隠れたパラメータ_hidden_sys_tenant_memoryの値を変更することは推奨されません。
ユーザーテナント
ユーザーテナントのメモリは、テナントがUnitを作成する際のmemory_sizeのサイズによって定義されます。memory_sizeはユーザーテナント全体のメモリサイズであり、そのメモリにはユーザーテナント自身のメモリと対応するMetaテナントのメモリが含まれます。ユーザーテナントを作成する際に許可される最小メモリは、隠れたパラメータ__min_full_resource_pool_memoryによって制御され、そのデフォルト値は5G、取り得る範囲は[1073741824,+∞)です。
ユーザーテナント自身のメモリと対応するMetaテナントのメモリは、増分データをロードするMemStoreおよびKVCacheキャッシュに分けられます。増分データをロードするMemStoreの詳細については、動的に拡張できないメモリ管理を参照してください。KVCacheキャッシュの詳細については、動的に拡張可能なメモリ管理を参照してください。
Metaテナント
Metaテナントのメモリリソースは共有をサポートしておらず、Metaテナントとユーザーテナントのメモリリソースは分離されている必要があります。デフォルトではMetaテナントは全体のテナント仕様の10%を占めます。Metaテナントの正常な稼働を保証するため、Metaテナントのメモリリソース仕様の最小値は512Mで、最大値は設定されていません。全体のテナントメモリ仕様からMetaテナントのメモリ仕様を差し引いたものが、ユーザーテナントのメモリ仕様となります。全体のテナント仕様の最小値は1Gに調整されました。以下に例を挙げて説明します:
テナント仕様が10G以上の場合、Metaテナントとユーザーテナントのメモリ仕様の比率は1:9です。
テナント仕様が2G以上の場合、Metaテナントのメモリ仕様は固定で1Gとなり、残りのリソースはユーザーテナントに割り当てられます。
テナント仕様が1G以上2G未満の場合、Metaテナントには固定で512Mが割り当てられ、残りのリソースはユーザーテナントに割り当てられます。
メモリ管理
OceanBaseデータベースでは、テナント内部のメモリを大まかに以下の2つの部分に分けています:
動的に拡張できないメモリ
動的に拡張可能なメモリ —— KVCache
動的に拡張できないメモリは主に、データベースの増分更新を格納するMemStoreに使用されます。動的に拡張可能なメモリは、主にKVCache(row_cacheやschema_cacheなどを含む)によって管理されます。
その他にも、Plan Cache(実行計画キャッシュ)、SQL Area(SQL実行時のメモリ)、選挙アクションなど、多くのメモリコンポーネントが一定量のメモリを占有します。oceanbase.GV$OB_MEMORYビューをクエリすることで、すべてのメモリコンポーネントの使用状況を確認できます。
動的スケーラビリティのないメモリ管理
現在、動的スケーラビリティのないメモリに関連する構成パラメータは memstore_limit_percentage と ob_sql_work_area_percentage のみです。前者は、テナントのMemStore部分がテナントの総メモリ上限の最大割合を表し、後者はSQLブロッキング演算子のワークエリアメモリ使用量の上限を表します。
テナントの書き込みまたは更新はMemStoreのメモリ使用量を増加させます。テナントのMemStore部分のメモリが上限に達すると、その後の書き込みまたは更新操作は拒否されます。
OceanBaseデータベースは、MemStoreのメモリ使用率に基づいて、いつダンプまたはマージを実行してMemStoreのメモリを解放するかを決定します。この比率は構成パラメータ freeze_trigger_percentage で制御され、MemStoreのメモリ使用量がその上限の割合に達した場合にフリーズ(ダンプの前段階の処理)を開始することを示します。デフォルト値はテナントMemStoreメモリ上限の20%です。
動的にスケーラブルなメモリ管理
動的にスケーラブルなKVCacheは、動的にスケーラブルでないメモリを除いたテナントの全メモリを可能な限り使用します。テナントのメモリが満杯になると、まず未参照のKVCache内のメモリから優先的にフェールアウトして使用されます。
OceanBaseデータベースは、ほとんどすべてのKV形式のキャッシュをKVCacheに統合して管理しています。KVCacheは動的スケーリング、異なるタイプのキャッシュの優先順位制御、およびインテリジェントなフェールアウトメカニズムをサポートしています。
通常、KVCacheは設定不要ですが、特殊なシナリオではパラメータを通じて各種キャッシュの優先順位を制御できます。優先順位が高いキャッシュは、優先順位が低いキャッシュよりもキャッシュ内に保持されやすくなります。
異なるタイプのキャッシュの優先順位を制御するパラメータは以下の表のとおりです。パラメータ値が大きいほど優先順位が高くなります。
パラメータ |
意味 |
|---|---|
| tablet_ls_cache_priority | tablet_ls_cache のキャッシュシステム内での優先順位。 |
| index_block_cache_priority | index_block_cache のキャッシュシステム内での優先順位。 |
| user_block_cache_priority | user_block_cache のキャッシュシステム内での優先順位。 |
| user_row_cache_priority | user_row_cache のキャッシュシステム内での優先順位。 |
| bf_cache_priority | Bloom Filter のキャッシュシステム内での優先順位。 |
| fuse_row_cache_priority | fuse_row_cache のキャッシュシステム内での優先順位。 |
| opt_tab_stat_cache_priority | opt_tab_stat_cache のキャッシュシステム内での優先順位。 |
KVCache内の異なるタイプのキャッシュの情報は、oceanbase.GV$OB_KVCACHE ビューをクエリすることで取得できます。その中で、sys テナントと一般テナントの重要な構成要素は若干異なります:
sysテナントで一般的なキャッシュの種類
カテゴリ説明schema_cache ユーザーのスキーマ情報を格納し、SQLおよびシステムの正常な動作に必要なデータベースオブジェクトのメタ情報を提供します。 tablet_table_cache Tablet内のschema versionとtable idの対応関係をキャッシュします。 vtable_cache TableのLocation情報をキャッシュします。 index_block_cache マイクロブロックのインデックスをキャッシュし、マイクロブロックデータへのアクセスを高速化します。 user_block_cache マイクロブロックデータをキャッシュします。マイクロブロックは圧縮アルゴリズムで圧縮される可能性があるため、クエリパフォーマンスを向上させるために、解凍後のマイクロブロックデータがキャッシュされます。 user_row_cache 特定のTable内のホットスポット行データをキャッシュします。 bf_cache ポイントクエリの結果が空であり、かつ一定回数を超えたマクロブロックに対して構築されたBloomfilterをキャッシュし、空クエリのフィルタリング効率を向上させます。 fuse_row_cache 行のスナップショットデータをキャッシュし、ポイントクエリのパフォーマンスを向上させるとともに、ダンプやメジャーコンパクションによるキャッシュ無効化問題を回避します。 opt_table_stat_cache 特定のパーティションの統計情報(行数、マクロブロック数、マイクロブロック数など)をキャッシュします。 opt_column_stat_cache パーティション内の特定の列の統計情報(NULL値数、非NULL値数、最大値、最小値など)をキャッシュします。 一般テナントで一般的なキャッシュの種類
カテゴリ説明index_block_cache マイクロブロックのインデックスをキャッシュし、マイクロブロックデータへのアクセスを高速化します。 user_block_cache マイクロブロックデータをキャッシュします。マイクロブロックは圧縮アルゴリズムによって圧縮される可能性があるため、クエリ性能を向上させるために、解凍後のマイクロブロックデータがキャッシュされます。 user_row_cache 特定のテーブル内のホットスポット行データをキャッシュします。 bf_cache ポイントクエリの結果が空であり、かつ一定回数を超えたマクロブロックに対して構築されたBloomfilterをキャッシュし、空クエリのフィルタリング効率を向上させます。 fuse_row_cache 行のスナップショットデータをキャッシュし、ポイントクエリ性能を向上させるとともに、ダンプやメジャーコンパクションによるキャッシュ無効化問題を回避します。 tmp_block_cache 一時ファイルをキャッシュし、書き込みバッファおよび書き込みキャッシュとして使用します。 tmp_page_cache 一時ファイルをキャッシュし、読み取りキャッシュとして使用します。 opt_table_stat_cache 特定のパーティションの統計情報(行数、マクロブロック数、マイクロブロック数など)をキャッシュします。 opt_column_stat_cache パーティション内の特定の列の統計情報(NULL値数、非NULL値数、最大値、最小値など)をキャッシュします。