このトピックでは、PolarDB for PostgreSQL (Oracle 互換) のマルチテナントリソース構成機能について説明します。
基本概念
テナント:マルチテナンシーアーキテクチャにおいて、テナントはデータとリソース割り当ての特定の単位を表す論理エンティティです。テナントは、クラスターより下、ユーザーとデータベースより上のレベルにあります。複数のアカウントまたはデータベースが単一のテナントに属することができます。テナントはユーザーやデータベースと同じではありません。テナントは次の 2 つのカテゴリに分類されます:
システムテナント:これは特別な管理エンティティです。クラスターには通常、1 つのシステムテナントしかありません。システムテナントはリソースへの優先アクセス権を持ち、通常テナントのリソースを使用できます。システムテナントのユーザーがデータベースに接続する際、そのユーザーが必要なクラスターアクセス権限を持っていれば、すべてのテナントのリソースにアクセスできます。
通常テナント:各通常テナントのリソースは、他のテナントから完全に分離されています。通常テナントは、システムテナントのコンテキストで作成する必要があります。
リソース構成:これは、CPU やメモリなどの特定のリソースを特定のテナントに割り当てることを含みます。この構成方法により、特権アカウントは必要に応じて各テナントのリソース制限を指定できます。
テナントリソース構成機能は、1 つ以上のプロセスが使用するリソース量を制限するために設計されています。PolarDB for PostgreSQL (Oracle 互換) では、1 つのセッションが 1 つのプロセスに対応し、そのセッション内では 1 人のユーザーのみが 1 つのデータベースにログインできます。システムでは、任意のプロセス、ユーザー、またはデータベースを指定されたテナントにマップできます。ただし、1 つのプロセスは 1 つのテナントにしか属せません。これにより、リソース使用量が複数回カウントされるのを防ぎます。パラレルクエリの子プロセスは、クエリを開始したプロセスのテナントに属します。したがって、リソース制限はプロセスの属性に基づいて、次の 3 つのディメンションに分けることができます:
プロセス:ユーザーによってアクティブに開始された接続プロセス (セッションプロセス) です。これには関連するパラレルクエリプロセスが含まれますが、システム補助プロセスは含まれません。
ユーザー:同じユーザーによって開始されたすべての接続プロセス (セッションプロセス) です。これには関連するパラレルクエリプロセスが含まれますが、システム補助プロセスは含まれません。
データベース:同じデータベースにアクセスするすべての接続プロセス (セッションプロセス) です。これには関連するパラレルクエリプロセスが含まれますが、システム補助プロセスは含まれません。
デフォルトでは、システムプロセスはその特定の機能のため、リソース制限は課されません。
適用範囲
PolarDB for PostgreSQL (Oracle 互換) の次のバージョンがサポートされています:マイナーエンジンバージョンが 2.0.14.12.24.0 以降の Oracle 構文互換 2.0。
マイナーエンジンバージョン番号は、コンソールで表示するか、SHOW polardb_version; 文を実行して確認できます。ご利用のクラスターがバージョン要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードできます。
パラメーター
パラメーター | 説明 | 有効になるタイミング |
polar_max_tenants | テナントの最大数。有効値は 0~65536 です。デフォルト値は 32 です。 | 再起動後に有効になります。 |
polar_resource_manager.enable_resource_manager | メモリ制限とメモリ不足 (OOM) 防止のためにリソースマネージャープロセスを有効にするかどうかを指定します。デフォルト値は on です。 | 再起動後に有効になります。 |
polar_resource_manager.database_name | テナントのメタデータを格納するデータベースの名前。デフォルト値は | 再起動後に有効になります。 |
polar_resource_manager.stat_interval | データ収集の間隔。単位:ミリ秒。有効値は 10~10000 です。デフォルト値は 500 ms です。 | RELOAD 後に有効になります。 |
polar_resource_manager.total_mem_request_rate | アクティブなエビクションのしきい値。有効値は 50%~100% です。デフォルト値は 80% です。 | RELOAD 後に有効になります。 |
polar_resource_manager.total_mem_limit_rate | 強制的なエビクションのしきい値。有効値は 50%~100% です。デフォルト値は 95% です。 | RELOAD 後に有効になります。 |
polar_resource_manager.total_mem_limit_remain_size | 予約済みメモリのサイズ。有効値は 131072~INT_MAX (整数データ型の最大値) です。単位:KB。デフォルト値は 256000 KB です。 | RELOAD 後に有効になります。 |
polar_resource_manager.enable_log | ログレコードを有効にするかどうかを指定します。有効な値:
| RELOAD 後に有効になります。 |
使用方法
マルチテナンシー機能を使用するには、polar_resource_manager.database_name パラメーターで指定されたデータベースに polar_resource_manager 拡張機能をインストールする必要があります。
polar_resource_manager.database_name の値を変更すると、既存のすべてのマルチテナンシー構成情報が無効になります。
CREATE EXTENSION polar_resource_manager;リソース構成の作成
polar_create_resource_config 関数を使用してリソース構成を作成します。
SELECT polar_resource_manager.polar_create_resource_config('resource_config_name');resource_config_name パラメーターは、データベースオブジェクトの命名規則に従う必要があります。名前の長さは最大 64 バイトで、この制限を超えると自動的に切り捨てられます。
リソース構成の削除
polar_drop_resource_config 関数を使用してリソース構成を削除します。
SELECT polar_resource_manager.polar_drop_resource_config('resource_config_name');リソース構成の変更
polar_alter_resource_config 関数を使用して、リソース構成を変更できます。
SELECT polar_resource_manager.polar_alter_resource_config('resource_config_name', 'config_name', value);config_name は以下のタイプに対応しています:
cpu_rate_limit:CPU 上限をコア単位で指定します。mem_limit:メモリ上限をバイト単位で指定します。
テナントの作成
polar_create_tenant 関数を使用してテナントを作成できます。
SELECT polar_resource_manager.polar_create_tenant('tenant_name', 'resource_config_name');ここで:
tenant_nameパラメーターは、データベースオブジェクトの命名規則に従う必要があります。名前の長さは最大 64 バイトで、この制限を超えた場合は自動的に切り捨てられます。まず、
resource_config_nameのリソース構成を作成する必要があります。そうしないと、テナントを作成できません。
テナントの削除
polar_drop_tenant 関数を使用してテナントを削除できます。テナントを削除しても、そのリソース構成は削除されません。
SELECT polar_resource_manager.polar_drop_tenant('tenant_name');テナントの変更
polar_alter_tenant 関数を使用してテナントを変更できます。
SELECT polar_resource_manager.polar_alter_tenant('tenant_name', 'config_name', 'value');config_name パラメーターは、以下のタイプをサポートしています:
name:テナントの名称です。resource_config:リソースの構成です。
データベーステナントの所有権
polar_tenant_add_database 関数を使用して、テナントにデータベースを割り当てることができます。データベースは、1 つのテナントにのみ割り当てることができます。データベースを別のテナントに割り当てようとすると、失敗します。
SELECT polar_resource_manager.polar_tenant_add_database('tenant_name', 'database_name');データベースとテナントの表示
polar_tenants_dbs ビューにクエリを実行すると、データベースとそれに割り当てられているテナントを表示できます。
SELECT dbsname, tenantname FROM polar_resource_manager.polar_tenants_dbs;ユーザーをテナントに割り当てる
polar_tenant_add_user 関数を使用して、ユーザーをテナントに割り当てることができます。ユーザーは、1 つのテナントにのみ割り当てることができます。ユーザーを別のテナントに割り当てようとすると、操作は失敗します。
SELECT polar_resource_manager.polar_tenant_add_user('tenant_name', 'user_name');ユーザーとテナントの表示
polar_tenants_users ビューを使用して、ユーザーとテナントの割り当てを確認します。
SELECT username, tenantname FROM polar_resource_manager.polar_tenants_users;テナントにプロセスを割り当てる
polar_tenant_add_process 関数を使用して、プロセスをテナントに割り当てることができます。プロセスは、1 つのテナントにのみ割り当てることができます。プロセスを複数のテナントに割り当てた場合、最後の割り当てのみが有効になります。
SELECT polar_resource_manager.polar_tenant_add_process('tenant_name', pid);テナントのリソース情報の表示
テナントのリソース情報は、polar_all_resource_configs_detail ビューから表示できます。
SELECT * FROM polar_resource_manager.polar_all_resource_configs_detail;ビューには、以下の情報が含まれています。
列名 | 列のタイプ | 説明 |
tenantname | NAME | テナント名。 |
resource_config_name | NAME | リソース構成名。 |
num_processes | INTEGER | プロセス数。 |
num_idle_processes | INTEGER | アイドルプロセス数。 |
num_active_processes | INTEGER | アクティブなプロセス数。 |
cpu_rate_limit | DOUBLE PRESISION | テナントの CPU リソース制限。 |
per_process_cpu_rate_limit | DOUBLE PRESISION | プロセスごとの CPU 制限。 |
mem_limit | DOUBLE PRESISION | メモリ制限。 |
mem_usage | DOUBLE PRESISION | メモリ使用量。 |
idle_processes_mem_usage | DOUBLE PRESISION | アイドルプロセスによるメモリ使用量。 |
active_processes_mem_usage | DOUBLE PRESISION | アクティブなプロセスによるメモリ使用量。 |
cpu_usage_rate | DOUBLE PRESISION | CPU 使用率。 |
CPU リソース管理
プロセス、ユーザー、またはデータベースをテナントに割り当てた後、テナントのリソース構成で CPU 関連の制限を設定できます。パラレルクエリが開始されると、そのバックエンドの子プロセスは、クエリを発行したセッションのテナントに割り当てられます。これにより、バックエンドの子プロセスとセッションプロセスは、テナントによって制限されたリソースを共有できます。パラレルクエリが終了すると、バックエンドの子プロセスはテナントから削除されます。このメカニズムにより、パラレルクエリのリソース制限が動的に適用および削除されます。
CPU 使用率の制限
これは、テナントの最大 CPU 使用率を制限します。テナントに割り当てられたエンティティの CPU 使用率が構成された制限を超えた場合、クラスターは対応するプロセスをスロットリングして制限を適用します。
polar_alter_resource_config 関数を使用して cpu_rate_limit を設定できます。パラメーターの値は float 型です。
このパラメーターの値は、CPU 使用率の制限を指定します。たとえば、値 0.3 は単一 CPU コアの 30% の使用制限を表し、値 2 は 2 つの CPU コアを完全に利用するのと同等の使用制限を表します。このパラメーターは CPU 使用率の上限を設定するため、すべてのテナントリソース構成における cpu_limit の値の合計が、物理 CPU の総容量 (T) を超えることがあります。つまり、cpu_limit_A + cpu_limit_B + cpu_limit_C + ... >= T となります。
メモリリソース管理
メモリは厳格なリソースであるため (スワップは無効)、CPU のように動的にスロットリングすることはできません。メモリのハードリミットを超えた場合、通常はプロセスが中止されてリソースが解放されます。テナントのメモリ管理は、オペレーティングシステムの OOM 処理ポリシーに似ています。ただし、これはデータベース全体レベルではなく、テナントレベルでの OOM プロセスです。
メモリ使用量の制限
polar_alter_resource_config 関数を使用して mem_limit を設定できます。CPU 使用率の制限と同様に、これは最大メモリ使用量を制限します。制限の合計は、利用可能な総メモリ以上になることがあります。これには、次の 2 つのポリシーが含まれます:
アクティブなリソース超過管理:総メモリ使用量がアクティブなエビクションのしきい値 (
total_mem_request_rate、デフォルト 80%) を超えた場合、テナントのメモリ使用量がそのリソース構成で設定されたメモリ制限を超えると、システムは対応するセッションを終了してリソースを解放します。メモリ超過エラーがユーザーに返されます。この処理は、総メモリ使用量がアクティブなエビクションのしきい値を下回るまで続行されます。強制的なリソース超過管理:クラスターでの過剰なメモリ使用による OOM エラーを防ぐため、総メモリ使用量が強制的なエビクションのしきい値 (
total_mem_limit_rate、デフォルト 95%) を超えた場合、システムはすべてのプロセスを走査し、対応するセッションを終了してリソースを解放します。メモリ超過エラーがユーザーに返されます。
メモリ制限によってエビクションがトリガーされると、ユーザーセッションは中止され、そのプロセスリソースが解放されます。これは SIGUSR2 シグナルを送信することによって行われ、指定された OOM エラーがユーザーに返されます。パラレルクエリのバックグラウンドプロセスがメモリ制限を超えた場合、対応するユーザープロセスが中止されます。現在、制限されるのはユーザープロセスのみです。システムのバックグラウンドプロセスはシステムテナントに属し、リソースを解放するためにアクティブに中止されることはありません。