使用 MySQL 資源群組管理 CPU 分配

本文說明如何在 MySQL 適用的 Cloud SQL 中設定及使用 MySQL 資源群組,藉此管理及優先分配不同資料處理需求的 CPU 資源。

總覽

MySQL 8.0 推出的 MySQL 資源群組可讓您管理及優先分配 CPU 資源,供單一資料庫執行個體上執行的不同執行緒使用。這項功能有助於減輕「吵雜鄰居」問題,也就是低優先順序工作 (例如每日分析或批次報表) 可能會導致 CPU 使用率飆升,進而降低重要的高優先順序用戶端連線 (例如線上交易處理 (OLTP)) 的效能。

所有 MySQL 8.0 以上版本的 MySQL 適用的 Cloud SQL 執行個體 (包括 Cloud SQL Enterprise 版和 Cloud SQL Enterprise Plus 版),都支援資源群組。

Community MySQL 與 Cloud SQL 資源群組的差異

MySQL 適用的 Cloud SQL 是全代管服務。為確保執行個體可靠性及保護 Cloud SQL 內部程序,與社群 MySQL 行為相比,下列差異和限制適用於:

不支援 CPU 核心親和性

系統不支援指定核心層級的 CPU 固定。舉例來說,在 MySQL 適用的 Cloud SQL 中建立資源群組時,您無法指定 VCPU = 2-3VCPU = 0。由於基礎 VM 核心拓撲已抽象化,因此在 CREATE RESOURCE GROUPALTER RESOURCE GROUP 陳述式中嘗試使用 VCPU 子句時,會因存取遭拒而失敗,並顯示下列錯誤訊息。

ERROR 1227 (42000): Access denied; This operation (CPU clause) is not allowed on the Cloud SQL environment. Only THREAD_PRIORITY allowed;

禁止使用的系統資源群組

Cloud SQL 不支援建立系統資源群組。 只允許使用者層級的資源群組 (TYPE = USER),執行緒優先順序範圍為 0 (最高使用者優先順序) 到 19 (最低使用者優先順序)。

禁止使用系統資源群組,是為了避免使用者工作負載耗盡重要 Cloud SQL 背景作業的資源,例如備份、監控和複製作業。

使用 TYPE = SYSTEM 執行 CREATE RESOURCE GROUP 指令會失敗,並顯示下列錯誤:

ERROR 1227 (42000): Access denied; This operation (TYPE=SYSTEM) is not allowed on the Cloud SQL environment. Only TYPE=USER is allowed;

自動二進位檔記錄和資源群組 DDL 複寫

在社群 MySQL 中,資源群組作業 (例如 CREATEALTERDROP RESOURCE GROUP) 絕不會寫入二進位記錄。Cloud SQL 會覆寫這項預設行為,將所有資源群組定義指令寫入二進位記錄檔。

這可確保資源群組自動複製到讀取備用資源,讓您在備用資源上使用查詢最佳化工具提示 (或 RESOURCE_GROUP 提示),避免因缺少群組而導致查詢失敗。群組定義也會擷取到二進位記錄串流中,以供時間點復原 (PITR) 使用。

執行緒工作階段指派 (例如 SET RESOURCE GROUP) 不會寫入二進位記錄檔。

已將管理員權限授予 cloudsqlsuperuser

如要使用資源群組,您必須具備下列管理資料庫權限:

  • RESOURCE_GROUP_ADMIN: 建立、變更及捨棄資源群組
  • RESOURCE_GROUP_USER:指派執行緒或在查詢中使用提示

在 Cloud SQL 中,這兩項權限預設都會授予 cloudsqlsuperuser 角色。

MySQL 管理員也可以將 RESOURCE_GROUP_USERRESOURCE_GROUP_ADMIN 資料庫權限授予其他使用者。

管理 Cloud SQL 中的資源群組

您可以在 Cloud SQL 中設定及管理使用者層級的資源群組,以最佳化資料庫的資源分配。這樣做可讓您控管及優先分配執行個體中各種資料庫工作階段工作負載的 CPU 資源。

如要進一步瞭解 MySQL 資源群組設定和參照行為,請參閱 MySQL 說明文件中的「資源群組」。

如要管理 Cloud SQL 中的資源群組,請執行下列操作:

事前準備

建立資源群組前,請先確認下列事項:

  • 您已使用具有 RESOURCE_GROUP_ADMIN 權限的使用者帳戶登入資料庫。預設 root 使用者和獲派 cloudsqlsuperuser 角色的任何資料庫帳戶,預設都會具備這項權限。

  • Cloud SQL 執行個體執行的是 MySQL 8.0 以上版本。

建立資源群組

建立使用者層級的資源群組,並設定介於 0 (最高優先順序) 和 19 (最低優先順序) 之間的執行緒優先順序。標準連線的預設執行緒優先順序為 0

如要建立資源群組,請執行下列陳述式:

CREATE RESOURCE GROUP GROUP_NAME
  TYPE = USER
  THREAD_PRIORITY = PRIORITY_VALUE;

更改下列內容:

  • GROUP_NAME:要建立的資源群組名稱。
  • PRIORITY_VALUE:資源群組的 CPU 排程優先順序,從 0 (最高優先順序) 到 19 (最低優先順序)。

修改資源群組的優先順序

如要修改現有資源群組的 CPU 排程優先順序,請執行下列陳述式:

ALTER RESOURCE GROUP GROUP_NAME
  THREAD_PRIORITY = PRIORITY_VALUE;

更改下列內容:

  • GROUP_NAME:要修改的資源群組名稱。
  • PRIORITY_VALUE:新的 CPU 排程優先順序。

捨棄資源群組

如要捨棄資源群組,請執行下列陳述式:

DROP RESOURCE GROUP GROUP_NAME;

更改下列內容:

  • GROUP_NAME:要捨棄的資源群組名稱。

將連線和查詢指派給資源群組

如要對工作負載強制執行資源限制,請將有效連線或特定查詢指派給使用者資源群組。

如要將工作階段連線指派給群組,請按照下列步驟操作:

  1. 將權限授予工作負載使用者:

    GRANT RESOURCE_GROUP_USER ON *.* TO 'USERNAME'@'%';

    更改下列內容:

    • USERNAME:您要授予權限的資料庫使用者。
  2. 使用者連線時,請執行下列指令:

    SET RESOURCE GROUP GROUP_NAME;

    更改下列內容:

    • GROUP_NAME:要將連線指派給的資源群組名稱。

    或指定特定討論串 ID:

    SET RESOURCE GROUP GROUP_NAME FOR THREAD_ID;

    更改下列內容:

    • GROUP_NAME:要將連線指派給的資源群組名稱。
    • THREAD_ID:要指派的特定資料庫執行緒 ID。

如要將單一查詢指派給群組 (透過最佳化工具提示):

在 DML 或 SELECT 陳述式中使用 RESOURCE_GROUP 最佳化工具註解提示:

SELECT /*+ RESOURCE_GROUP(GROUP_NAME) */
  COLUMN_NAME_1,
  SUM(COLUMN_NAME_2)
FROM TABLE_NAME
GROUP BY COLUMN_NAME_1;

更改下列內容:

  • GROUP_NAME:要執行查詢的資源群組名稱。
  • COLUMN_NAME_1:要用來分組結果的資料欄。
  • COLUMN_NAME_2:要加總的資料欄值。
  • TABLE_NAME:要查詢的資料表。

監控資源群組

如要檢查已設定的資源群組,請按照下列步驟操作:

SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

如要查看有效連線執行緒及其指派的資源群組,請執行下列查詢:

SELECT THREAD_ID, NAME, TYPE, RESOURCE_GROUP
  FROM performance_schema.threads;

後續步驟