全部產品
Search
文件中心

PolarDB:多租戶

更新時間:Oct 15, 2024

本文介紹了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

存放租戶中繼資料的資料庫名稱,預設值為polardb_admin

重啟生效。

polar_resource_manager.stat_interval

資料擷取間隔時間,單位為毫秒,取值範圍為10~10000。預設值為500 ms。

RELOAD載入生效。

SELECT pg_reload_conf();

polar_resource_manager.total_mem_request_rate

主動淘汰閾值,取值範圍為50%~100%,預設值為80%。

RELOAD載入生效。

SELECT pg_reload_conf();

polar_resource_manager.total_mem_limit_rate

強制淘汰閾值,取值範圍為50%~100%,預設值為95%。

RELOAD載入生效。

SELECT pg_reload_conf();

polar_resource_manager.total_mem_limit_remain_size

記憶體預留大小,取值範圍為131072~INT_MAX(整數資料型別最大值),單位為KB,預設值為256000 KB。

RELOAD載入生效。

SELECT pg_reload_conf();

polar_resource_manager.enable_log

是否開啟日誌記錄,取值範圍如下:

  • ON(預設值):開啟日誌記錄。

  • OFF:關閉日誌記錄。

RELOAD載入生效。

SELECT pg_reload_conf();

使用說明

在使用多租戶時,需要在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錯誤。如果存在並行查詢的後台進程記憶體超限,會中止對應的使用者進程。目前只對使用者進程進行限制,系統後台進程目前屬於系統租戶,不會主動中止釋放資源。