このトピックでは、 PolarDB for PostgreSQL (Compatible with Oracle) のマルチテナント機能について説明します。
条件
テナント: マルチテナントでは、テナントはデータとリソースの割り当て単位を表す論理エンティティです。 テナントは、クラスタよりも上位にあり、ユーザまたはデータベースよりも下位にある。 複数のアカウントまたはデータベースが1つのテナントに対応できます。 テナントは、ユーザーやデータベースとは異なります。 テナントは2つのカテゴリに分けられます。
システムテナントは特別な管理エンティティです。 通常、システムテナントは1つだけ作成されます。 システムテナントは、共通テナントのリソースを占有できます。 システムテナントのユーザーがデータベースに接続し、クラスターにアクセスする権限を持っていれば、すべてのテナントのクラスターにアクセスできます。
共通テナント: テナントのリソースは、別のテナントのリソースから完全に分離されています。 共通テナントはシステムテナントで作成する必要があります。
リソース設定: テナントにCPUやメモリリソースなどのリソースを割り当てることができます。 特権アカウントは、ビジネス要件に基づいて各テナントのリソース制限を指定できます。
テナントリソース構成機能は、単一のプロセスまたは複数のプロセスによって使用されるリソースの量を制限するように設計されています。 PolarDB for PostgreSQL (Oracle互換) では、1つのセッションが1つのプロセスに対応します。 1つのセッションで、1人のユーザーのみが1つのデータベースにログオンできます。 プロセス、ユーザー、およびデータベースは、テナントの基本要素です。 任意のプロセス、ユーザー、およびデータベースを指定されたテナントにマッピングできます。 プロセスは1つのテナントにのみ属することができ、リソース使用の重複統計を回避します。 並列クエリの子プロセスは、並列クエリを開始するテナントに属します。 したがって、プロセス属性に基づいてリソースを3次元で制限できます。
プロセス: ユーザによって開始される接続プロセス (セッションプロセス) 。 そのようなプロセスは、並列クエリプロセスを含むが、システム補助プロセスを含まない。
ユーザ: ユーザによって開始された全ての接続プロセス (セッションプロセス) 。 それらは並列クエリプロセスを含むが、システム補助プロセスは含まない。
データベース: ユーザーによって開始された1つのデータベースへのすべての接続プロセス (セッションプロセス) 。 それらは並列クエリプロセスを含むが、システム補助プロセスは含まない。
デフォルトでは、特別な機能により、システムプロセスにリソース制限は課されません。
前提条件
PolarDB for PostgreSQL (Compatible with Oracle) クラスターは、次のエンジンを実行します。
PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.24.0以降)
次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。
SHOW polar_version; Parameters
パラメーター | 説明 | アプリケーションモード |
polar_max_tenants | テナントの最大数。 有効な値: 0 ~ 65536 デフォルト値: 32。 | この設定は、クラスターの再起動後に有効になります。 |
polar_resource_manager.enable_resource_manager | メモリ制限とOOM防止のためにリソースマネージャープロセスを有効にするかどうかを指定します。 デフォルト値 : on。 | この設定は、クラスターの再起動後に有効になります。 |
polar_resource_manager.database_name | テナントメタデータを格納するデータベースの名前。 デフォルト値: | この設定は、クラスターの再起動後に有効になります。 |
polar_resource_manager.stat_interval | データ収集間隔。 単位:ms。 有効な値: 10 ~ 10000 デフォルト値: 500 ms。 | 設定は、リロード操作の実行後に有効になります。 |
polar_resource_manager.total_mem_request_rate | アクティブな削除のしきい値。 有効な値: 50% 〜100% 。 デフォルト値: 80% | 設定は、リロード操作の実行後に有効になります。 |
polar_resource_manager.total_mem_limit_rate | 強制的な有罪判決のしきい値。 有効な値: 50% 〜100% 。 デフォルト値: 95% | 設定は、リロード操作の実行後に有効になります。 |
polar_resource_manager.total_mem_limit_remain_size | 予約されたメモリのサイズ。 有効な値: 131072〜INT_MAX (整数データ型の最大値) 。 (単位:KB) デフォルト値: 256000 | 設定は、リロード操作の実行後に有効になります。 |
polar_resource_manager.enable_log | ログを有効にするかどうかを指定します。 有効な値:
| 設定は、リロード操作の実行後に有効になります。 |
使用法
マルチテナントを使用するには、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コア単位のCPU制限。mem_limit、メモリの制限 (バイト単位) 。
テナントの作成
polar_create_tenant関数を使用してテナントを作成できます。
SELECT polar_resource_manager.polar_create_tenant('tenant_name', 'resource_config_name');
tenent_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 | 名前 | テナント名。 |
resource_config_name | 名前 | リソース構成の名前。 |
num_processes | INTEGER | プロセスの数。 |
num_idle_processes | INTEGER | アイドルプロセスの数。 |
num_active_processes | INTEGER | アクティブなプロセスの数。 |
cpu_rate_limit | ダブルプレス | テナントの最大CPUリソース。 |
per_process_cpu_rate_limit | ダブルプレス | プロセスの最大CPUリソース。 |
mem_limit | ダブルプレス | 最大メモリリソース。 |
mem_usage | ダブルプレス | メモリ使用量。 |
idle_process_mem_usage | ダブルプレス | アイドルプロセスによるメモリ使用量。 |
active_processes_mem_usage | ダブルプレス | アクティブなプロセスによるメモリ使用量。 |
cpu_usage_rate | ダブルプレス | CPU使用率 (%) 。 |
CPUリソース管理
プロセス、ユーザー、およびデータベースをテナントに追加した後、リソース構成でCPU制限を設定できます。 バックグラウンド子プロセスを割り当てることができる場合、バックグラウンド子プロセスは並列クエリを開始するテナントに割り当てられ、バックグラウンド子プロセスとセッションプロセスの両方がテナントのリソース制限の対象となります。 並列クエリが完了すると、背景の子プロセスがテナントから削除されます。 このメカニズムは、テナントにリソース制限を動的に課し、削除します。
CPU使用制限
テナントの最大CPU使用率を設定できます。 テナントでCPU使用量の制限を超えると、クラスターはCPU消費量を削減して制限内に収まります。
polar_resource_manager.polar_alter_resource_config関数を使用して、cpu_rate_limit値 (floatデータ型) を設定できます。
パラメーター値は、一定期間のCPU使用率を示します。 たとえば、0.3は1つのコアの30% 使用量を示し、2は2つのコアの完全使用量を示します。 ここでは最大CPU使用率を指定しているため、cpu_limit値の合計はクラスタ指定値Tよりも大きくなることがあります:cpu_limit_A + cpu_limit_B + cpu_limit_C + ... >= T。
メモリリソース管理
メモリは厳格なリソースであり、CPUと同じように動的に制限することはできません。 メモリ使用量の制限を超えた場合、システムはメモリリソースを解放するプロセスを終了します。 このメカニズムは、オペレーティングシステムがOOMの問題を処理する方法と似ていますが、この制限はデータベース全体ではなくテナントに設定されます。
メモリ使用制限
polar_resource_manager.polar_alter_resource_config関数を使用して、mem_limit値 (floatデータ型) を設定できます。 同様に、ここで最大メモリ使用量を指定するため、mem_limit値の合計がクラスター指定値よりも大きくなる場合があります。 次の2つのポリシーを使用できます。
アクティブしきい値の管理: アクティブな削除しきい値 (
total_mem_request_rate、デフォルトは80%) を超え、テナントのメモリ使用量が指定された制限を超えると、セッションは終了してメモリリソースを解放します。 メモリオーバーランエラーが返されます。 システムは、メモリ使用量がアクティブな削除しきい値より小さくなるまで、このメカニズムを継続します。強制しきい値管理: 強制削除しきい値 (
total_mem_limit_rate、デフォルトは95%) を超えた場合、システムはすべてのプロセスをトラバースし、セッションのリソースを解放し、メモリオーバーランエラーを返します。 これにより、クラスター内のOOMエラーが防止されます。
エビクションの間、ユーザセッションは終了し、プロセスによって消費されたリソースは解放されます。 システムは、SIGUSR2信号をセッションプロセスに送信してセッションを終了し、指定されたOOMエラーを返します。 並列クエリのバックグラウンドプロセスのメモリ使用量がメモリ制限を超えた場合、対応するユーザープロセスは終了します。 現在、ユーザープロセスのみを終了できます。 システムバックグラウンドプロセスはシステムテナントに属しており、メモリリソースを解放するために終了することはできません。