本文介紹了PolarDB PostgreSQL版(相容Oracle)的多租戶資源配置功能。
概念
租戶:在多租戶中,租戶是一個邏輯實體,它代表一個特定的資料和資源分派單元。租戶的層級定位在叢集之下,使用者和資料庫之上,它們之間的對應關係是多對一的,多個賬戶或資料庫對應一個租戶。租戶與使用者或資料庫不是等同的概念。租戶分為兩大類:
系統租戶:這是一個特殊的管理實體,通常只有一個。系統租戶擁有對資源的優先訪問權,能夠佔用普通租戶的資源。當通過系統租戶的使用者串連到資料庫時,如果該使用者具備相應的叢集存取權限,他們將能夠訪問所有租戶下的叢集。
普通租戶:每個普通租戶的資源是完全隔離的,租戶之間無法相互訪問。普通租戶必須在系統租戶的上下文中建立。
資源配置:資源配置涉及為特定的租戶分配確定的資源(如CPU和記憶體)。這種配置方式允許高許可權賬戶根據業務需求,為每個租戶指定資源限制。
租戶資源配置功能旨在限制單個或多個進程所使用的資源量。在PolarDB PostgreSQL版(相容Oracle)中,一個會話對應一個進程,且一個會話只能由一個使用者登入到一個資料庫。因此,進程、使用者和資料庫構成了進程的基本元素。系統允許將任意進程、使用者、資料庫映射到指定的租戶,但一個進程只能屬於一個租戶,從而避免了資源使用量的重複統計。後台並行查詢的子進程屬於發起查詢的進程所屬的租戶。因此基於進程的屬性可以將資源限制分為三個維度:
進程:指使用者主動發起的賬戶串連進程(會話進程),包括與進程相關的並行查詢進程,但不包括系統輔助進程。
使用者:指由同一使用者發起的所有使用者串連進程(會話進程),包括與進程相關的並行查詢進程,但不包括系統輔助進程。
資料庫:指訪問同一資料庫的所有使用者串連進程(會話進程),包括與進程相關的並行查詢進程,但不包括系統輔助進程。
由於系統進程特定的功能作用,預設情況下不對其資源使用進行限制。
前提條件
支援的PolarDB PostgreSQL版(相容Oracle)的版本如下:
Oracle文法相容 2.0(核心小版本2.0.14.24.0及以上)。
您可通過如下語句查看PolarDB PostgreSQL版(相容Oracle)的核心小版本的版本號碼:
SHOW polar_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錯誤。如果存在並行查詢的後台進程記憶體超限,會中止對應的使用者進程。目前只對使用者進程進行限制,系統後台進程目前屬於系統租戶,不會主動中止釋放資源。