PolarDB for MySQL は、特定のユーザー、データベース、または接続 ID の CPU 使用率を制限するルールを作成できるリソースコントロール機能を提供します。この機能は、トラフィックの急増によるビジネスへの影響を軽減し、大規模なクエリに迅速にリソース制限を課すのに役立ちます。
バージョン制限
Enterprise Edition クラスターのみがサポートされます。
クラスター版クラスターの場合:
PolarDB for MySQL 8.0.1 (リビジョンバージョン 8.0.1.1.48 以降)。
PolarDB for MySQL 8.0.2 (リビジョンバージョン 8.0.2.2.27 以降)。
マルチマスタークラスター (無制限) の場合:
PolarDB for MySQL 8.0.1 (リビジョンバージョン 8.0.1.0.33 以降)。
注意事項
PolarDB のリソースコントロール機能は、MySQL 公式のリソースグループ機能とは異なります。これらは 2 つの異なるメカニズムを使用して、クラスター内のリソース使用量を制御します:
PolarDB のリソースコントロール機能は、データベース、データベースユーザー、およびデータベース接続によってリソースを制限します。この機能は、クラウドネイティブデータベースに適しています。
MySQL 公式のリソースグループ機能では、異なるリソースグループに対して CPU コア数とスレッド優先度を設定できます。詳細については、MySQL 公式ドキュメントの「Resource Groups」をご参照ください。この機能は、現在 PolarDB for MySQL ではサポートされていません。
リソースコントロール機能を使用するには、スレッドプール機能を有効にする必要があります。
読み取り専用 (RO) ノードは、読み書き (RW) ノードからリソースコントロール情報を非同期で同期します。そのため、遅延が発生する可能性があります。
使用方法
PolarDB データベースクラスターに接続した後、特権アカウントでログインします。
リソースコントロール機能の有効化
PolarDB クラスターパラメーターの変更方法は、コンソールとデータベースセッションで異なります。違いは次のとおりです:
互換性:MySQL 構成ファイルとの互換性を保つため、PolarDB コンソールのいくつかのクラスターパラメーターには loose_ プレフィックスが付いています。
手順:
loose_プレフィックスが付いているパラメーターを見つけて変更します。
データベースセッション内 (コマンドラインまたはクライアントを使用)
手順:データベースセッションで
SETコマンドを使用してパラメーターを変更する場合、loose_プレフィックスを削除し、元のパラメーター名を使用します。
パラメーター名 | レベル | 説明 |
| グローバル | クラスターのリソースコントロール機能を有効または無効にします。
|
リソースコントロールの作成
CREATE polar_resource_control <rc_name> max_cpu <max_cpu_value>;パラメーター:
パラメーター | 説明 |
rc_name | 作成するリソースコントロールの名前。最大長は 64 文字です。 |
max_cpu_value | リソースコントロールの最大 CPU。値は、クラスター全体の CPU に対するパーセンテージです。有効値は 1 から 100 です。 |
リソースコントロールを作成した後、特権アカウントから次の SQL クエリを実行して、すべてのリソースコントロールを表示できます。
SELECT * FROM mysql.polar_resource_control;特権アカウントから次の SQL クエリを実行して、リソースコントロール下のスレッドグループを取得できます。
SELECT id, resource_control_name FROM information_schema.thread_pool_status;リソースコントロールの更新
ALTER polar_resource_control <rc_name> max_cpu <max_cpu_value>;説明:
パラメーター | 説明 |
rc_name | リソースコントロールの名前。名前の長さは最大 64 文字です。 |
max_cpu_value | リソースコントロールで許可される新しい最大 CPU 使用率。値は、クラスターの総 CPU 容量に対するパーセンテージとして指定します。有効値:1~100。 |
リソースコントロールで許可される最大 CPU 使用率を更新すると、リソースコントロールに関連付けられているスレッドグループの数が変更される場合があります。
リソースコントロールの削除
DROP polar_resource_control <rc_name>;説明:
パラメーター | 説明 |
rc_name | 削除するリソースコントロールの名前。 |
リソースコントロールが削除されると、関連付けられているスレッドグループは解放されます。以前リソースコントロールによって制限されていたユーザー、データベース、または接続は、制限されなくなります。
ユーザーまたはデータベースへのリソースコントロールの設定
アタッチ
SET polar_resource_control <rc_name> FOR [database|USER] <db_name/user_name>;SQL 文は次のとおりです:
パラメーター | 説明 |
rc_name | 適用するリソースコントロールの名前。 |
db_name/user_name | リソースコントロールを適用するデータベースまたはユーザー。 |
この文を実行すると、指定したデータベースまたはユーザーは、リソースコントロールによって設定された CPU リソース制限の対象となります。この変更は、現在実行中の文には影響しません。リソースコントロールが適用された後に実行される文にのみ適用されます。
解放
RELEASE polar_resource_control <rc_name> FOR [database|USER] db_name/user_name>;この文を実行すると、指定したデータベースまたはユーザーは、リソースコントロールの CPU リソース制限を受けなくなります。すでに実行中の文は、引き続き制限の対象となります。リソースコントロールが削除された後に開始される文は、制限の対象にはなりません。
クエリまたは接続へのリソースコントロールの設定
アタッチ
SET polar_resource_control <rc_name> FOR [query|connection] <connection_id>;パラメーター:
パラメーター | 説明 |
rc_name | アタッチするリソースコントロールの名前。 |
connection_id | 制限する接続の ID。 |
クエリにリソースコントロールをアタッチする場合、
SHOW PROCESSLISTを実行して対応する接続 ID を表示できます。クエリが完了すると、そのクエリはリソースコントロールによる制限を受けなくなります。接続にリソースコントロールをアタッチする場合、現在のクエリが完了した後もリソース制限は有効なままです。この制限は、接続が閉じるまで適用されます。
リリース
RELEASE polar_resource_control <rc_name> FOR [query|connection] <connection_id>;パラメーター:
パラメーター | 説明 |
rc_name | アタッチするリソースコントロールの名前。 |
connection_id | 制限する接続の ID。 |
クエリからリソースコントロールを解放すると、そのクエリはコントロールによる制限を受けなくなります。クエリが完了した後、他に適用されるリソースコントロールがない場合、接続は制限されません。
接続からリソースコントロールを解放すると、その接続は、接続、ユーザー、またはデータベースに設定されている適用可能なリソースコントロールによって制限されます。他に適用されるリソースコントロールがない場合、接続は制限されません。
リソースコントロールの優先度
リソースコントロールは、次の優先順位でクエリ文に適用されます。最初に見つかった一致が使用されます。
接続 ID によってクエリに明示的にアタッチされたコントロール。これが最も高い優先度を持ちます。
現在の接続がリソースコントロールにアタッチされているかどうかを判断し、それに応じてリソース制限を適用します。
システムは、接続ユーザーがリソースコントロールにアタッチされているかを確認します。アタッチされている場合、リソース制限が適用されます。
現在接続されているデータベースがリソースコントロールにアタッチされている場合、システムはリソース制限を適用します。
上記のどの条件も満たされない場合、リソース制限は適用されません。
マルチマスタークラスターの使用
マルチマスタークラスターはシングルマスタークラスターと同様に動作し、構文は完全に互換性があります。CREATE POLAR_RESOURCE_CONTROL、ALTER POLAR_RESOURCE_CONTROL、または DROP POLAR_RESOURCE_CONTROL 文を実行すると、クラスター内の読み書きノードにランダムに転送されます。その後、文はすべての読み書きノード間で同期されるため、多少の遅延が発生する可能性があります。クエリまたは接続のリソースを制限するには、HINT 構文を使用してノードを指定できます。
ベストプラクティス
シナリオ
悪意のあるユーザーが過剰なクラスターリソースを消費するのを防ぐ。
突然のスロークエリに対処する。
サーバーレスクラスターで悪意のあるユーザーが自動スケーリングをトリガーするのを防ぐ。
マルチテナント環境や、異なるサービスがクラスターを共有する場合の CPU 使用率を制限する。
使用例
悪意のあるユーザーが過剰なクラスターリソースを消費するのを防ぐ
悪意のあるユーザーに対処するために、CPU リソース制限を設定できます。これらの制限は、事前または悪意のあるアクティビティに応じて適用できます。
CREATE polar_resource_control rc_for_trouble_user max_cpu 10; SET polar_resource_control rc_for_trouble_user FOR USER trouble_user;ユーザー
trouble_userにリソースコントロールを設定すると、そのユーザーのスレッドはクラスター全体の CPU の最大 10% しか使用できなくなります。これにより、悪意のあるユーザーが過剰な CPU リソースを消費し、他のサービスに影響を与えるのを効果的に防ぎます。突然のスロークエリに対処する
本番環境では、予期しないスロークエリが発生することがあります。これらは、不正確な SQL の解析や最適化によって引き起こされ、CPU 負荷を増大させる可能性があります。これにより、クエリが長時間実行され、大量の CPU リソースを消費します。
killコマンドでクエリを終了させることはできますが、クエリが実行中の特定のポイントに達するまで待つ必要があり、時間がかかります。さらに、killプロセス中のトランザクションのロールバックも CPU リソースを消費し、時間がかかります。スロークエリによる CPU 負荷を迅速に軽減したり、CPU が完全に使い果たされるのを防いだりするには、そのクエリに CPU 使用率の制限を適用できます。CREATE polar_resource_control rc_for_slow_query max_cpu 10; SET polar_resource_control rc_for_slow_query FOR query query_id;説明スロークエリにリソースコントロールを設定する場合、
SHOW PROCESSLISTを実行してそのquery_idを見つけることができます。ID が
query_idのスロークエリにリソースコントロールを設定すると、クエリの最大 CPU 使用率はクラスター全体の CPU の 10% に制限されます。これにより、クラスターの CPU 負荷が迅速に軽減され、クエリが他の本番サービスに影響を与えるのを防ぎます。PolarDB クラスターには複数の計算ノードがあり、異なるノードで同じ接続 ID を持つクエリが存在する可能性があります。したがって、クエリにリソースコントロールを設定する場合は、HINT 構文を使用して特定ノードに設定を適用します。
/*force_node='pi-bpxxxxxxxx'*/ SET polar_resource_control rc_for_slow_query FOR query query_id;サーバーレスクラスターで悪意のあるユーザーがクラスターのスケーリングをトリガーするのを防ぐ
クラスターが サーバーレスモードの場合、ワークロードに基づいて自動的にスケーリングし、突然の高負荷バーストに対応します。ただし、悪意のあるユーザーからのリクエストに応じてクラスターがスケーリングするのを防ぎたい場合があります。この場合、サーバーレスクラスター上のこれらの悪意のあるユーザーにリソース制限を適用できます。
CREATE polar_resource_control rc_for_trouble_user max_cpu 10; SET polar_resource_control rc_for_trouble_user FOR USER trouble_user;マルチテナントまたはマルチサービスクラスターでの CPU 使用率の制限
SaaS (Software as a Service) シナリオでは、多くの場合、複数のテナントが同じクラスター上で実行されます。また、異なるビジネスサービスがクラスターを共有することも一般的です。このような状況では、単一のテナントまたはサービスが使用できるリソースを制限することが重要です。これにより、1 人のユーザーまたは 1 つのサービスが CPU を過剰に消費し、クラスター全体のパフォーマンスに影響を与えるのを防ぎます。これを行うには、サービスごとに個別の CPU リソース制限を設定できます。たとえば、ユーザーごとまたはデータベースごとに制限を適用してこれを実現できます。
CREATE polar_resource_control rc_for_business_1 max_cpu 20; CREATE polar_resource_control rc_for_business_2 max_cpu 20; SET polar_resource_control rc_for_business_1 FOR USER user_1; SET polar_resource_control rc_for_business_2 FOR USER user_2;これらの設定に基づき、
user_1とuser_2が使用するサービスは、それぞれクラスター全体の CPU の最大 20% に制限されます。したがって、2 人のユーザーは合計で最大 40% の CPU リソースを使用できます。user_1のワークロードが急増した場合でも、その CPU 使用率は 20% に抑えられ、クラスター上の他のサービスに影響が及ばないようにします。単一のサービスが複数のユーザーを使用する場合、それらすべてに同じリソースコントロールを割り当てることができます。
CREATE polar_resource_control rc_for_business_1 max_cpu 20; SET polar_resource_control rc_for_business_1 FOR USER user_1; SET polar_resource_control rc_for_business_1 FOR USER user_2;これらの設定に基づき、
user_1とuser_2が使用するサービスは、クラスター全体の CPU の最大 20% に制限されます。したがって、2 人のユーザーは合計で最大 20% の CPU リソースを使用できます。これにより、一方のユーザーのワークロードが増加しても、サービスが CPU 制限を超えるのを防ぎます。これにより、公正なリソース割り当てが保証されます。