本文介紹了PolarDB PostgreSQL版的多租戶資源配置功能。
概念
租戶:在多租戶中,租戶是一個邏輯實體,它代表一個特定的數據和資源分配單元。租戶的層級定位在集群之下,用戶和數據庫之上,它們之間的對應關系是多對一的,多個賬戶或數據庫對應一個租戶。租戶與用戶或數據庫不是等同的概念。租戶分為兩大類:
系統租戶:這是一個特殊的管理實體,通常只有一個。系統租戶擁有對資源的優先訪問權,能夠占用普通租戶的資源。當通過系統租戶的用戶連接到數據庫時,如果該用戶具備相應的集群訪問權限,他們將能夠訪問所有租戶下的集群。
普通租戶:每個普通租戶的資源是完全隔離的,租戶之間無法相互訪問。普通租戶必須在系統租戶的上下文中創建。
資源配置:資源配置涉及為特定的租戶分配確定的資源(如CPU和內存)。這種配置方式允許高權限賬戶根據業務需求,為每個租戶指定資源限制。
租戶資源配置功能旨在限制單個或多個進程所使用的資源量。在PolarDB PostgreSQL版中,一個會話對應一個進程,且一個會話只能由一個用戶登錄到一個數據庫。因此,進程、用戶和數據庫構成了進程的基本元素。系統允許將任意進程、用戶、數據庫映射到指定的租戶,但一個進程只能屬于一個租戶,從而避免了資源使用量的重復統計。后臺并行查詢的子進程屬于發起查詢的進程所屬的租戶。因此基于進程的屬性可以將資源限制分為三個維度:
進程:指用戶主動發起的賬戶連接進程(會話進程),包括與進程相關的并行查詢進程,但不包括系統輔助進程。
用戶:指由同一用戶發起的所有用戶連接進程(會話進程),包括與進程相關的并行查詢進程,但不包括系統輔助進程。
數據庫:指訪問同一數據庫的所有用戶連接進程(會話進程),包括與進程相關的并行查詢進程,但不包括系統輔助進程。
由于系統進程特定的功能作用,默認情況下不對其資源使用進行限制。
前提條件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(內核小版本14.12.24.0及以上)。
您可通過如下語句查看PolarDB PostgreSQL版的內核小版本的版本號:
SELECT version();
參數說明
參數 | 描述 | 生效方式 |
polar_max_tenants | 最大租戶數量,取值范圍為0~65536,默認值為32。 | 重啟生效。 |
polar_resource_manager.enable_resource_manager | 是否打開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字節以內的名稱,超過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字節以內的名稱,超過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
將數據庫歸屬到租戶下。數據庫只能歸屬到一個租戶,否則無法歸屬成功。
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
將用戶歸屬到租戶下。用戶只能歸屬到一個租戶,否則無法歸屬成功。
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
將進程歸屬到租戶下。進程只能歸屬到一個租戶,歸屬多個租戶時,以最后一次為準。
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 | idle進程數量。 |
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使用率過大時,集群會進行限制,將CPU使用率降低,使其小于限制值。
通過polar_resource_manager.polar_alter_resource_config
設置cpu_rate_limit
,參數值為float類型。
參數值表示CPU的使用率(一段時間內的CPU使用時間比率)。例如,0.3表示使用一個核的30%,2表示使用2個核的能力。由于限制的是最大使用率,因此所有租戶資源配置的cpu_limit和可以大于規格額T,即cpu_limit_A + cpu_limit_B + cpu_limit_C + ... >= T
。
內存資源管理
由于內存資源是剛性資源(swap off),無法像CPU可以動態限制,如果內存資源超過硬性限制,一般是通過中止進程來釋放資源。租戶的內存管理類似操作系統的OOM處理策略,相比于系統的整個數據庫級別的OOM處理,這里只是一個租戶級別的OOM處理。
內存使用量限制
通過polar_resource_manager.polar_alter_resource_config
來設置mem_limit
,參數值為float類型。與CPU使用率限制類似,用于限制內存使用的最大值,總的限制值可以大于等于規格額。包含以下兩種策略:
主動資源超限管理:當總內存使用量大于主動淘汰閾值(
total_mem_request_rate
,默認值為80%)時,如果租戶內存使用量大于此租戶資源配置的內存limit量,則釋放相應會話釋放資源,并返回給用戶內存超限的錯誤。直到內存使用量小于主動淘汰閾值。強制資源超限管理:為了避免集群內存過量使用,引起集群OOM,當總內存使用量大于強制淘汰閾值(
total_mem_limit_rate
,默認值為95%)時,遍歷所有進程,釋放相應會話的資源,并返回給用戶內存超限的錯誤。
內存限制進行淘汰時,會中止用戶會話并釋放進程資源,可以通過發送SIGUSR2實現,向用戶返回指定的OOM錯誤。如果存在并行查詢的后臺進程內存超限,會中止對應的用戶進程。目前只對用戶進程進行限制,系統后臺進程目前屬于系統租戶,不會主動中止釋放資源。