メモリ割り当て
システムテナント
システムテナントは、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内のスキーマバージョンとテーブルIDの対応関係をキャッシュします。 vtable_cache テーブルのロケーション情報をキャッシュします。 index_block_cache マイクロブロックのインデックスをキャッシュし、マイクロブロックデータへのアクセスを高速化します。 user_block_cache マイクロブロックデータをキャッシュします。マイクロブロックは圧縮アルゴリズムによって圧縮される可能性があるため、クエリパフォーマンスを向上させるために、解凍後のマイクロブロックデータをキャッシュします。 user_row_cache 特定のテーブル内のホット行データをキャッシュします。 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値数、最大値、最小値などをキャッシュします。