MySQL リソース グループを使用して CPU 割り当てを管理する

このドキュメントでは、Cloud SQL for MySQL で MySQL リソース グループを構成して使用し、さまざまなデータ処理ニーズの CPU リソース 割り当てを管理して優先順位を付ける方法について説明します。

概要

MySQL 8.0 で導入された MySQL リソース グループを使用すると、単一のデータベース インスタンスで実行されているさまざまなスレッド間で CPU リソースの割り当てを管理して優先順位を付けることができます。これは、毎日の分析やバッチレポートなどの優先度の低いタスクが CPU 使用率を急増させ、オンライン トランザクション処理(OLTP)などの重要な優先度の高いクライアント接続のパフォーマンスを低下させる「うるさい隣人」問題を軽減するのに役立ちます。

リソース グループは、Cloud SQL Enterprise エディションと Cloud SQL Enterprise Plus エディションの両方で、Cloud SQL for MySQL 8.0 以降のすべてのインスタンスでサポートされています。

コミュニティ MySQL と Cloud SQL リソース グループの違い

Cloud SQL for MySQL はフルマネージド サービスです。インスタンスの信頼性を確保し、Cloud SQL の内部プロセスを保護するため、コミュニティ MySQL の動作と比較して、次の違いと制限が適用されます。

CPU コア アフィニティはサポートされていません

コアレベルの CPU ピン留めはサポートされていません。たとえば、Cloud SQL for MySQL でリソース グループを作成するときに、VCPU = 2-3VCPU = 0 を指定することはできません。基盤となる VM コア トポロジは抽象化されているため、CREATE RESOURCE GROUP ステートメントまたは ALTER 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_USER または RESOURCE_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;

次のステップ