本文介紹了PolarDB MySQL版提供的租戶管理簡介以及使用說明等內容。
簡介
PolarDB MySQL版提供的多租戶模式,可以使得多個租戶在同一個集群下共享計算資源和存儲資源,且保證各租戶下的數據隔離和資源隔離。 各個租戶僅能訪問到自己的數據,租戶之間不會出現資源爭搶,以保證業務的穩定運行。技術原理如下圖所示:
術語
租戶:租戶(Tenant)為實現多租戶模式所提出的概念,租戶的層級結構在一個數據庫實例之下,在數據庫與用戶之上。租戶分為系統租戶和普通租戶:
系統租戶:系統租戶是為了適配原有模式下用戶的使用,原有數據庫實例中的用戶默認屬于系統租戶,也可以稱為系統用戶。當通過系統租戶下的用戶連接數據庫時,若該用戶擁有對應的數據庫實例訪問權限,即可訪問所有租戶下的數據庫實例。
普通租戶:普通租戶需要在系統租戶下進行創建,普通租戶下的數據庫實例與用戶完全隔離,無法互相訪問,并且普通租戶無法訪問系統租戶下的數據庫實例。在進行CPU資源調度時,普通租戶根據min_cpu是否大于0將普通租戶分為獨占型租戶和共享型租戶。
獨占型租戶:min_cpu>0,需要保證任何時刻的CPU資源不小于min_cpu。
共享型租戶:min_cpu=0。
獨占型租戶和共享型租戶可以通過調整min_cpu的值進行相互轉換。
資源配置:資源配置(resource_config)是為了實現多租戶資源隔離與資源調度所提出的概念,一個資源配置描述了一個租戶下能夠使用的資源。當前PolarDB MySQL版僅支持對CPU資源進行隔離以及調度。
使用前提
PolarDB MySQL版集群的產品版本為企業版,集群的內核版本需為8.0.2及以上,且集群的節點規格需要保持一致。
租戶管理與資源隔離功能目前處于灰度發布階段,如有需求,您可以添加釘釘群聯系工作人員來開啟該功能。功能開啟后,您需要重啟目標集群才能生效。釘釘群號:59535005981。
注意事項
暫不支持租戶下的Binlog信息同步。
暫不支持對用戶部分權限進行撤銷。
使用說明
開啟單機多租戶模式
開啟數據隔離功能
開啟數據隔離功能,需要將參數enable_multi_tenant
的值設置為ON,且目標集群中的數據庫名或用戶名中不包含參數multi_tenant_separator
的值。
開啟資源隔離功能
若需要同時開啟數據隔離功能和資源隔離功能,則需要將參數thread_pool_enabled
、enable_multi_tenant
以及thread_pool_multi_tenant_enabled
的值均設置為ON,且需要保證參數thread_pool_size
的值與目標集群的節點規格的核數保持一致。您可以在目標集群的基本信息頁面的數據庫節點區域查看集群的節點規格。如下圖:
若有單機多租戶需求,您可以添加釘釘群來聯系工作人員開啟數據隔離功能或同時開啟數據隔離和資源隔離功能。釘釘群號:59535005981。功能開啟后,您需要重啟目標集群才能生效。
資源管理
PolarDB MySQL版單機多租戶模式下的資源隔離僅支持CPU資源隔離,在創建資源配置時,指定此資源配置所對應的CPU資源限制條件min_cpu
和max_cpu
。當某一租戶綁定此資源限制條件時便可限制此租戶下user連接使用的CPU資源。
創建資源配置
使用高權限賬號連接數據庫,并通過CREATE語句來創建資源配置。示例如下:
CREATE resource_config r1 min_cpu 0 max_cpu 1;
CREATE resource_config r2 min_cpu 1 max_cpu 4;
創建資源配置時,PolarDB將不會檢測資源配置信息與集群節點規格的關系,僅當租戶綁定資源限制條件時才會進行檢測。
任意一個租戶的
min_cpu
不超過當前集群節點規格的核數-1,需要為系統租戶預留1CPU。否則,在創建租戶時,租戶與資源配置會綁定失敗。系統租戶下的用戶可使用的資源為CPU資源總和減去所有獨占型租戶占用的CPU資源。
查看資源配置
使用高權限賬號連接數據庫,并通過SELECT語句來查看資源配置。示例如下:
SELECT * FROM mysql.tenant_resource_config;
更新資源配置
使用高權限賬號連接數據庫,并通過ALTER語句來更新資源配置。示例如下:
ALTER resource_config r2 min_cpu 1 max_cpu 2;
若租戶正在使用該資源配置,則無法進行更新操作。
刪除資源配置
使用高權限賬號連接數據庫,并通過DROP語句來刪除資源配置。示例如下:
DROP resource_config r1;
若租戶正在使用該資源配置,則無法進行刪除操作。
租戶管理
創建租戶
使用高權限賬號連接數據庫,并通過CREATE語句來創建新租戶。示例如下:
CREATE tenant tenant_name resource_config r1;
tenant_name長度不超過10個字符,并且支持包含大寫字母、小寫字母、數字或下劃線(_)。
需要保證所有租戶的資源配置中
min_cpu
之和不能超過當前集群節點規格中的核數-1。
更新租戶
使用高權限賬號連接數據庫,并通過ALTER語句來更新租戶。示例如下:
ALTER tenant tenant_name resource_config r2;
需要保證所有租戶的資源配置中min_cpu
之和不能超過當前集群節點規格中的核數-1。
查看租戶
使用高權限賬號連接數據庫,并通過SELECT語句來查看租戶。示例如下:
SELECT * FROM mysql.tenants;
刪除租戶
使用高權限賬號連接數據庫,并通過DROP語句來刪除租戶。示例如下:
DROP tenant tenant_name;
刪除租戶時,需要保證租戶下的數據庫已經被刪除。否則,無法刪除租戶。
刪除租戶操作默認會將租戶下的所有用戶都刪除,請謹慎操作。
用戶管理
在系統租戶下創建或刪除用戶時,需要以
'用戶名稱@租戶名稱'
的方式對用戶進行操作。開啟單機多租戶模式下,用戶名稱的長度被限制為不超過20個字符,并僅可包含大寫字母、小寫字母、數字和下劃線(_)。
租戶內不可以創建以下用戶:
replicator
root
mysql.infoschema
mysql.session
mysql.sys
aurora
aliyun_root
租戶下的用戶不能擁有
__recycle_bin__
、mysql
、performance_schema
和sys
庫權限。
在系統租戶下進行用戶管理
創建用戶
連接數據庫,并通過CREATE語句來創建用戶。示例如下:
CREATE user 'user_1@tenant_1';
刪除用戶
連接數據庫,并通過DROP語句來刪除用戶。示例如下:
DROP user 'user_1@tenant_1';
用戶授權管理
對用戶授予租戶下的權限。
使用高權限賬號連接數據庫,對用戶授予租戶下的權限。如為用戶
user1@tenant_1
授予租戶tenant_1
下的權限的SQL語句如下:GRANT all privileges ON `%@tenant_1`.* to 'user_1@tenant_1'@'%' with grant option;
說明為用戶授予當前租戶下的權限時,不能超出當前租戶的權限,也不能授予其他租戶的權限。
授予CREATE USER權限。
使用高權限賬號連接數據庫,對用戶授予CREATE USER權限。示例如下:
GRANT CREATE user ON *.* to 'user_1@tenant_1'@'%';
查看當前用戶擁有的權限。示例如下:
SHOW grants for 'user_1@tenant_1';
在普通租戶下進行用戶管理
創建用戶
通過租戶下的用戶連接數據庫,并在其他租戶下創建用戶。示例如下:
CREATE user user_2;
刪除用戶
通過租戶下的用戶連接數據庫,并在其他租戶下刪除用戶。示例如下:
DROP user user_2;
用戶授權管理
通過租戶下的用戶連接數據庫,并為數據庫
db1
授權。示例如下:GRANT SELECT ON db1.* to 'user_2'@'%';
在租戶模式下,將租戶內的全局權限授予某個用戶。示例如下:
GRANT SELECT ON *.* to user
在租戶模式下,為某個數據庫授權。示例如下:
GRANT SELECT ON db.* to user
多租戶模式下,暫不支持將數據庫授權和全局授權混合使用,若混合使用,可能無法正確鑒別權限。建議僅使用全局授權或僅使用數據庫級別的授權。
數據庫管理
在系統租戶下創建或刪除數據庫時,需要以
'數據庫名稱@租戶名稱'
的方式對數據庫進行操作。開啟單機多租戶模式下,數據庫名稱的長度被限制為不超過50個字符,并且僅可包含大寫字母、小寫字母、數字和下劃線(_)。
租戶內不可以創建以下數據庫:
information_schema
performance_schema
mysql
sys
__recycle_bin__
query_rewrite
若在租戶下創建
dbms_ccl
、dbms_outln
和dbms_consensus
等庫,租戶下的用戶將無法調用數據庫中的內置存儲過程。此時,您可以使用CALL dbms_admin.show_native_procedure();
來查看數據庫中所有的內置存儲過程。若在租戶下創建的數據庫名稱與內置存儲過程中的
schema_name
相同,將無法調用該數據庫下的內置存儲過程。
在系統租戶下管理數據庫
創建數據庫
連接數據庫,在系統租戶下創建數據庫。示例如下:
CREATE database 'db1@tenant_1';
刪除數據庫
連接數據庫,在系統租戶下刪除數據庫。示例如下:
DROP database 'db1@tenant_1';
在普通租戶下管理數據庫
創建數據庫
連接數據庫,在普通租戶下創建數據庫。示例如下:
CREATE database db2;
刪除數據庫
連接數據庫,在系統租戶下刪除數據庫。示例如下:
DROP database db2;
通過租戶下的用戶連接數據庫
通過客戶端來連接數據庫時,需要將用戶指定為用戶名稱@租戶名稱
的形式。示例如下:
mysql --host=xxxxxx -u user1@tenant_1 -p pwssword
連接成功后,該用戶將受到對應租戶下的資源限制。
查看租戶綁定關系
使用高權限賬號連接數據庫,并通過以下SQL語句來查看線程組與租戶的綁定關系:
SELECT * FROM information_schema.thread_pool_status;
在開啟租戶資源隔離模式下,查詢結果中會顯示此線程組所綁定的獨占型租戶。若查詢結果中的租戶信息為空,則表示線程組被多個租戶共享。
查看審計日志
在租戶模式下進行的操作,審計日志中將會展示其使用的物理數據庫和物理用戶等信息。
例如,在租戶t2
下,用戶u1
在db3
數據庫內執行的SQL語句被記錄在審計日志中,數據庫列將顯示為db3@t2
,用戶列將顯示為u1@t2
。