このドキュメントでは、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-3 や VCPU = 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 では、CREATE、ALTER、DROP 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 でリソース グループを管理するには、次の操作を行います。
- リソース グループを作成する: ユーザーレベルのリソース グループを作成し、カスタム スレッドの優先度を指定します。
- リソース グループの優先度を変更する: 既存のユーザーレベルのリソース グループの CPU スケジューリングの優先度を調整します。
- リソース グループを削除する: 不要になったリソース グループを削除します。
- 接続とクエリをリソース グループに割り当てる: アクティブなセッション、データベース ユーザー、または特定のクエリをリソース グループにマッピングします。
- リソース グループをモニタリングする: 構成されたリソース グループとスレッドの割り当てを確認します。
始める前に
リソース グループを作成する前に、次のことを確認します。
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: 削除するリソース グループの名前。
接続とクエリをリソース グループに割り当てる
ワークロードにリソース制約を適用するには、アクティブな接続または特定のクエリをユーザー リソース グループに割り当てます。
セッション接続をグループに割り当てるには:
ワークロード ユーザーに権限を付与します。
GRANT RESOURCE_GROUP_USER ON *.* TO 'USERNAME'@'%';
次のように置き換えます。
USERNAME: 権限を付与するデータベース ユーザー。
ユーザーが接続したら、次を実行します。
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;
次のステップ
- Cloud SQL インスタンスをモニタリングする
- システム分析情報を使用してシステム パフォーマンスを向上させる
- CPU の高使用率を最適化する
- Query Insights を使用してクエリのパフォーマンスを向上させる
- アクティブなクエリをモニタリングする