本文將向您介紹如何以資料庫帳號、資料庫、單條查詢、資料庫連接4種維度進行資料庫資源管理。
版本限制
僅支援企業版。
產品系列為叢集版時:
PolarDB MySQL版8.0.1版本,且修訂版本為8.0.1.1.48及以上。
PolarDB MySQL版8.0.2版本,且修訂版本為8.0.2.2.27及以上。
當系列為多主叢集(Limiless)時:
PolarDB MySQL版8.0.1,且修訂版本為8.0.1.0.33及以上。
注意事項
該功能目前處於申請使用階段,如有需要,請提交工單諮詢和開啟。您也可以加入官方DingTalk群進行諮詢,擷取更多支援人員。DingTalk群號:59535005981。
PolarDB Resource Control功能與MySQL官方Resource Group功能並不相同,分別使用如下2種機制控制叢集的資源使用:
PolarDB Resource Control功能能夠在資料庫、資料庫使用者以及資料庫連接維度上限制所能使用的資源,更適配於雲原生資料庫。
MySQL官方Resource Group功能能夠為不同資源群組設定所能使用的CPU核以及線程的優先順序。其功能試用可參考MySQL官方文檔 Resource Groups,目前PolarDB MySQL版中暫不支援開啟。
使用Resource control功能需開啟Thread Pool功能。
唯讀(RO)節點非同步從讀寫(RW)節點同步資源控制資訊,因此可能會出現延遲。
測試環境
測試需要的ECS執行個體和PolarDB MySQL版叢集需要在同一個Region和VPC下。
測試所用ECS執行個體規格:
ecs.g7.2xlarge(8 vCPU,32 GB記憶體)。
測試所用PolarDB MySQL版叢集配置如下:
產品版本:企業版。
系列:叢集版。
子系列:獨享規格。
資料庫引擎:MySQL 8.0.1。
規格:polar.mysql.x4.xlarge(8 vCPU,32 GB記憶體)。
測試準備
以下操作中的Sysbench測試相關內容均在ECS執行個體中執行。更多資訊,請參見使用Sysbench工具進行測試。
建立資料庫帳號和資料庫
執行如下SQL,建立2個資料庫帳號user_1和user_2,2個資料庫database_1和database_2:
CREATE USER user_1 IDENTIFIED WITH mysql_native_password BY 'password';
CREATE USER user_2 IDENTIFIED WITH mysql_native_password BY 'password';
CREATE DATABASE database_1;
CREATE DATABASE database_2;
GRANT ALL ON database_1.* TO user_1;
GRANT ALL ON database_2.* TO user_1;
GRANT ALL ON database_1.* TO user_2;
GRANT ALL ON database_2.* TO user_2;匯入測試資料
執行如下命令,使用Sysbench工具分別為database_1和database_2匯入測試資料:
sysbench oltp_read_write --threads=16 --mysql-host=<host> --mysql-user=user_1 --mysql-password=<password> --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=7200 prepare
sysbench oltp_read_write --threads=16 --mysql-host=<host> --mysql-user=user_1 --mysql-password=<password> --mysql-port=3306 --mysql-db=database_2 --tables=10 --table-size=500000 --report-interval=1 --time=7200 prepare建立資源管理(Resource Control)
執行如下SQL,建立多個Resource Control:
CREATE polar_resource_control rc_1 max_cpu 20;
CREATE polar_resource_control rc_2 max_cpu 50;
CREATE polar_resource_control rc_3 max_cpu 70;
CREATE polar_resource_control rc_4 max_cpu 100;通過如下SQL,可以查詢已建立的Resource Control資訊:
SELECT * FROM mysql.polar_resource_control;執行測試
以下操作中的Sysbench測試相關內容均在ECS執行個體中執行。
以下操作中的資料庫內容均為高許可權帳號登入資料庫後執行。
以資料庫帳號維度限制CPU資源
使用
user_1帳號對資料庫database_1和database_2進行壓力測試(Sysbench測試):sysbench oltp_read_only --threads=256 --mysql-host=<host> --mysql-user=user_1 --mysql-password=<password> --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run sysbench oltp_read_only --threads=256 --mysql-host=<host> --mysql-user=user_1 --mysql-password=<password> --mysql-port=3306 --mysql-db=database_2 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run執行如下SQL,依次將
user_1和rc_1、rc_2、rc_3、rc_4進行綁定和解除綁定:SET polar_resource_control rc_1 FOR USER user_1; -- 相隔3分鐘再執行解除綁定rc_1並綁定rc_2,便於觀察結果 RELEASE polar_resource_control rc_1 FOR USER user_1; SET polar_resource_control rc_2 FOR USER user_1; -- 相隔3分鐘再執行解除綁定rc_2並綁定rc_3,便於觀察結果 RELEASE polar_resource_control rc_2 FOR USER user_1; SET polar_resource_control rc_3 FOR USER user_1; -- 相隔3分鐘再執行解除綁定rc_3並綁定rc_4,便於觀察結果 RELEASE polar_resource_control rc_3 FOR USER user_1; SET polar_resource_control rc_4 FOR USER user_1;控制台查看效能監控,觀察以資料庫使用者維度限制CPU資源後CPU使用率和QPS的變化,具體操作,請參見效能監控:
RW節點和RO節點的CPU使用率:

RW節點和RO節點的QPS:

說明如上圖所示CPU使用率以及QPS都隨著
user_1綁定的Resource Control的變化而變化(例如rc_1的CPU最大為20%,rc_2的CPU最大為50%)。通過綁定不同CPU資源的Resource Control可以對user_1所能使用的CPU資源進行有效控制。
以資料庫維度限制CPU資源
分別使用
user_1與user_2對database_1進行壓力測試(Sysbench測試):sysbench oltp_read_only --threads=256 --mysql-host=<host> --mysql-user=user_1 --mysql-password=<password> --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run sysbench oltp_read_only --threads=256 --mysql-host=<host> --mysql-user=user_2 --mysql-password=<password> --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run執行如下SQL,依次將
database_1和rc_1、rc_2進行綁定和解除綁定:SET polar_resource_control rc_1 FOR DATABASE database_1; -- 相隔3分鐘再執行解除綁定rc_1並綁定rc_2,便於觀察結果 RELEASE polar_resource_control rc_1 FOR DATABASE database_1; SET polar_resource_control rc_2 FOR DATABASE database_1; -- 相隔3分鐘再執行解除資源管理操作,便於觀察結果 RELEASE polar_resource_control rc_2 FOR DATABASE database_1;控制台查看效能監控,觀察以資料庫維度限制CPU資源後CPU使用率和QPS的變化,具體操作,請參見效能監控:

說明如上圖所示CPU使用率以及QPS都隨著
database_1綁定的Resource Control的變化而變化(例如rc_1的CPU最大為20%,rc_2的CPU最大為50%)。通過綁定不同CPU資源的Resource Control可以對database_1所能使用的CPU資源進行有效控制。
以單條查詢維度限制CPU資源
使用Resource Control可以對單條查詢進行資源限制,當這個查詢執行結束後,限制會自動結束,後續同一個串連(Connection)中的查詢不受影響。
執行如下SQL,類比大查詢:
CREATE DATABASE rc_test; USE rc_test; CREATE TABLE t1(id INT NOT NULL auto_increment PRIMARY KEY, name VARCHAR(10)); INSERT INTO t1(name) VALUES('aaaaaaaaaa'); INSERT INTO t1(name) SELECT name FROM t1; -- 重複執行20次此SQL -- 在2個用戶端分別同時執行,類比產生2條大查詢 SELECT COUNT(*) FROM t1 a JOIN t1 B ON a.name = B.name;擷取2個大查詢的Connection ID:
SHOW processlist;建立
rc_5並分別綁定到兩個大查詢的Connection ID:CREATE polar_resource_control rc_5 max_cpu 5; -- 開始綁定資源管理 SET polar_resource_control rc_5 FOR query <connection_id_1>; SET polar_resource_control rc_5 FOR query <connection_id_2>; -- 間隔5分鐘,對大查詢解除綁定資源管理限制 RELEASE polar_resource_control rc_5 FOR query <connection_id_1>; RELEASE polar_resource_control rc_5 FOR query <connection_id_2>;控制台查看效能監控,觀察以單條查詢維度限制CPU資源後CPU使用率的變化,具體操作,請參見效能監控:

以串連維度限制CPU資源
在長會話情境過程中,可以使用Resource Control按照Connection維度限制所有查詢可以使用的資源。
執行如下SQL,類比大查詢:
CREATE database rc_test; USE rc_test; CREATE TABLE t1(id INT NOT NULL auto_increment PRIMARY KEY, name VARCHAR(10)); INSERT INTO t1(name) VALUES('aaaaaaaaaa'); INSERT INTO t1(name) SELECT name FROM t1; -- 重複執行20次此SQL -- 在2個用戶端分別同時執行,類比產生2條大查詢 SELECT COUNT(*) FROM t1 A JOIN t1 B ON a.name = B.name;擷取2個大查詢的Connection ID:
SHOW processlist;建立
rc_5並分別綁定到2個大查詢的Connection ID:CREATE polar_resource_control rc_5 max_cpu 5; SET polar_resource_control rc_5 FOR connection <connection_id_1>; SET polar_resource_control rc_5 FOR connection <connection_id_2>;控制台查看效能監控,觀察以串連維度限制CPU資源後CPU使用率的變化,具體操作,請參見效能監控:
說明如上圖所示,對2個Connection進行資源限制後,叢集整體的CPU佔用率有明顯下降(15:28:25之後)。手動中斷2個大查詢後(15:30:35之後),再次執行2個大查詢(15:31:40之後),叢集整體的CPU佔用率仍然受到限制。
分別對2個大查詢釋放保留:
-- 對connection 解除resource control限制 RELEASE polar_resource_control rc_5 FOR connection <connection_id_1>; RELEASE polar_resource_control rc_5 FOR connection <connection_id_2>;大查詢釋放保留之後,叢集整體CPU上升至原來水平:
