SQL スロットリングでは、データベースに対して同時に実行される SQL ステートメントの数を上限で制限できます。これにより、特定のクエリタイプの急増によって他のリクエストがリソース不足に陥ったり、データベース全体がダウンしたりするのを防ぎます。
仕組み
スロットリングルールを作成すると、Database Autonomy Service (DAS) がすべての着信 SQL ステートメントを監視し、各ステートメントをルールのマッチング条件(キーワードまたは SQL テンプレート)と照合します。マッチするステートメントが同時に実行中の数が設定された最大同時実行数に達すると、追加のマッチステートメントは、インスタンスのバージョンおよび構成に応じて、キュー内で待機するか、即座に拒否されます。
リクエストフロー:
SQL ステートメントがデータベースに到着します。
DAS が、そのステートメントがスロットリングルール(キーワード、テンプレート、テンプレート ID、実行時間)に一致するかどうかを確認します。
ステートメントが一致し、かつ同時実行数の上限に達していない場合は、通常通り実行されます。
同時実行数の上限に達した場合:
最大同時実行数 = 正の整数: ステートメントは待機キューに入ります。キュー長が
ccl_max_waiting_countを超過すると、データベースからエラーが返されます。最大同時実行数 = 0: ステートメントは即座に拒否され、データベースからエラーが返されます。
適用範囲
| シナリオ | 例 |
|---|---|
| 特定のクエリタイプにおける同時実行数の急増 | キャッシュペネトレーションやアプリケーションの異常な呼び出しにより、SQL 同時実行数が急増する |
| データスキューを引き起こすクエリ | 販売プロモーション中にホットデータを頻繁にクエリすると、システム全体が過負荷状態になる |
| 欠落しているインデックスによる全テーブルスキャン | インデックスのないテーブルに対する大量の SQL 呼び出しにより、システム全体の応答が遅くなる |
サポート対象のデータベース
| データベースエンジン | サポート対象バージョン |
|---|---|
| ApsaraDB RDS for MySQL | 5.6、5.7、8.0 |
| ApsaraDB RDS for PostgreSQL | 13(マイナーエンジンバージョン 20250430 以降)、14(マイナーバージョン 20230330 以降)、15(マイナーバージョン 20230330 以降)、15 より後のバージョン(マイナーバージョン要件なし) |
| PolarDB for MySQL | 5.6、5.7、8.0 |
| PolarDB-X 2.0 | — |
スロットリングモード
スロットル対象の SQL ステートメントを識別する方法に応じて、適切なモードを選択してください。
| モード | 説明 | 適用可能なデータベース |
|---|---|---|
| キーワードによるスロットリング | 指定されたすべてのキーワードを含む SQL ステートメントをスロットルします。注:このモードでは単一の特定ステートメントをターゲットにすることはできません。指定されたすべてのキーワードを含むステートメントがマッチします。 | ApsaraDB RDS for MySQL、PolarDB for MySQL、PolarDB-X 2.0 |
| SQL テンプレートによるスロットリング | 代表的な SQL ステートメントを入力します。DAS がこれをテンプレートに変換し、該当テンプレートに一致するすべてのステートメントをスロットルします。 | ApsaraDB RDS for MySQL 8.0(マイナーエンジンバージョン 20230630 以降);ApsaraDB RDS for PostgreSQL 13(マイナーバージョン 20250430 以降)、14/15(マイナーバージョン 20230330 以降)、および 15 より後のバージョン;PolarDB for MySQL 8.0.1(マイナーバージョン 8.0.1.1.31 以降)および 8.0.2(マイナーバージョン 8.0.2.2.12 以降) |
| SQL テンプレート ID によるスロットリング | SQL テンプレート ID を直接入力します。テンプレート ID は、SQL ログ、セッション、または EXPLAIN 結果から取得できます。テンプレート ID は 8 文字の 16 進数文字列です。 | PolarDB-X 2.0 Enterprise Edition |
| 実行時間によるスロットリング | 実行時間のしきい値を設定します。DAS は、このしきい値を超えるステートメントのテンプレート ID を自動的にスロットリングルールに追加し、設定された同時実行数制限を適用します。 | PolarDB-X 2.0 Enterprise Edition |
スロットリングルールの作成
SQL スロットリングは緊急措置です。スロットリング期間は短めに設定し、状況が解消次第、速やかにルールを無効化してください。
DAS コンソール にログインします。
左側のナビゲーションウィンドウで、インテリジェント O&M センター > インスタンス監視 をクリックします。
対象のターゲットインスタンスを見つけ、インスタンス ID をクリックしてインスタンス詳細ページに移動します。
左側のナビゲーションウィンドウで、インスタンスセッション をクリックします。
セッション管理 ページで、SQL スロットリング をクリックします。
表示されるダイアログボックスで、スロットリングルールの作成 をクリックします。
スロットリングルールの作成 ダイアログボックスで、ご利用のデータベースエンジンに応じたパラメーターを構成します。
ApsaraDB RDS for MySQL
| パラメーター | 説明 |
|---|---|
| スロットリングモード | スロットリングモードを選択します。 |
| SQL タイプ | スロットル対象の SQL ステートメントの種類を選択します:SELECT、UPDATE、DELETE、または INSERT。スロットリングモードが キーワードによるスロットリング の場合に必須です。 説明 INSERT ステートメントは、ApsaraDB RDS for MySQL 8.0、PolarDB for MySQL 5.7 および 8.0、および PolarDB-X 2.0 のみでスロットル可能です。 |
| データベース | スロットリングモードスロットリングルールを適用するデータベースです。スロットリングモードが SQL テンプレートによるスロットリング の場合に必須です。 |
| 最大同時実行数 | 同時に実行できる SQL ステートメントの最大数です。最小値:0。マッチするステートメントの同時実行数がこの数に達すると、スロットリングがトリガーされます。 |
| スロットリング期間 | スロットリングルールが有効な期間です。期間満了前に状況が解消した場合は、手動でルールを無効化してください。 |
| SQL キーワード | スロットリングモードが キーワードによるスロットリング の場合に必須です。スロットル対象のステートメントを識別するキーワードを入力します。複数のキーワードはチルダ (~) で区切ります。ステートメントは、指定されたすべてのキーワードを含む場合のみスロットルされます(順序は問いません)。説明 ほとんどのバージョンではキーワードの大文字小文字が区別されます。 |
| SQL サンプル | スロットルモードスロットリングモードが SQL テンプレートによるスロットリング の場合に必須です。代表的な SQL ステートメントを入力します。DAS は、リテラル値をプレースホルダーに置き換えることで、これをテンプレートに変換します。たとえば、select name from das where name = \das\ and age = 21 limit 20 は、テンプレート select name from das where name = ? and age = ? limit ? になります。サンプルの正規化方法は、スロットリング効果に影響しません。 |
ApsaraDB RDS for PostgreSQL
ApsaraDB RDS for PostgreSQL では、SQL テンプレートによるスロットリング モードのみがサポートされています。
| パラメーター | 説明 |
|---|---|
| データベース | スロットリングルールを適用するデータベースです。 |
| 検索パス | スロットリングルールのスキーマ検索パスです。複数のパスはカンマ (,) で区切ります。デフォルト: information_schema,public。 |
| 最大同時実行数 | 同時に実行できる SQL ステートメントの最大数です。最小値:0。マッチするステートメントの同時実行数がこの数に達すると、スロットリングがトリガーされます。 |
| 最大待機クエリ数 | キュー内で待機することを許可されるステートメントの最大数です。 |
| スロットリング期間 | スロットリングルールが有効な期間です。期間満了前に状況が解消した場合は、手動でルールを無効化してください。 |
| SQL サンプル | 代表的な SQL ステートメントを入力します。DAS は、リテラル値をプレースホルダーに置き換えることで、これをテンプレートに変換します。たとえば、select name from das where name = "das" and age = 21 limit 20 は select name from das where name = ? and age = ? limit ? になります。 |
PolarDB for MySQL
| パラメーター | 説明 |
|---|---|
| スロットリングモード | スロットリングモードを選択します。 |
| SQL タイプ | 速度制限を適用する SQL ステートメントのタイプを選択します:SELECT、UPDATE、DELETE、または INSERT。 説明 INSERT 文は、ApsaraDB RDS for MySQL 8.0、PolarDB for MySQL 5.7 および 8.0、および PolarDB-X 2.0 のみで速度制限が可能です。 |
| 最大同時実行数 | 同時に実行可能な SQL ステートメントの最大数です。最小値:0。 |
| データベース | 速度制限ルールを適用するデータベースです。スロットリングモード が SQL テンプレートによる速度制限 に設定されている場合に必須です。 |
| 速度制限持続時間 | 速度制限ルールがアクティブな状態で維持される時間です。 |
| SQL キーワード | スロットリングモード が キーワードによる速度制限 に設定されている場合に必須です。ApsaraDB RDS for MySQL と同様のルールが適用されます。複数のキーワードを指定する場合は、~ で区切ります。速度制限の対象となるステートメントには、指定されたすべてのキーワードが含まれている必要があります。 |
| SQL サンプル | スロットリングモード が SQL テンプレートによる速度制限 に設定されている場合に必須です。DAS は、このサンプルからリテラル値をプレースホルダーに置き換えてテンプレートを生成します。 |
PolarDB-X 2.0
| パラメーター | 説明 |
|---|---|
| スロットリングモード | スロットリングモードを選択します。 |
| SQL タイプ | スロットル対象の SQL ステートメントの種類を選択します:SELECT、UPDATE、DELETE、または INSERT。 説明 INSERT ステートメントは、ApsaraDB RDS for MySQL 8.0、PolarDB for MySQL 5.7 および 8.0、および PolarDB-X 2.0 のみでスロットル可能です。 |
| 最大同時実行数 | 同時に実行できる SQL ステートメントの最大数です。最小値:0。 |
| スロットリング期間 | スロットリングルールが有効な期間です。 |
| SQL キーワード | [スロットルモード] が [キーワードによるスロットル] に設定されている場合に必須です。複数のキーワードは ~ で区切ります。スロットル対象となるには、文に指定されたすべてのキーワードが含まれている必要があります。 |
| SQL テンプレート ID | スロットリングモードPolarDB-X 2.0 Enterprise Edition で、スロットリングモードが SQL テンプレートによるスロットリング の場合に必須です。8 文字の 16 進数テンプレート ID を 1 つ以上、カンマ (,) で区切って入力します。テンプレート ID は、SQL ログ、セッション、または EXPLAIN 結果から取得できます。 |
| 最小 SQL 実行時間 | PolarDB-X 2.0 Enterprise Edition で [速度制限モード] が [実行時間による速度制限] に設定されている場合に必要です。実行時間のしきい値です。文がこのしきい値を超えると、DAS は自動的にそのテンプレート ID を速度制限ルールに追加します。 |
| 最大スロットル対象 SQL ID 数 | PolarDB-X 2.0 Enterprise Edition で [スロットルモード] が [実行時間によるスロットル] に設定されている場合に必要です。スロットル可能な SQL テンプレート ID の最大数です。この制限に達すると、しきい値を超える文がさらに存在しても、DAS は新しいテンプレート ID の追加を停止します。 |
| スロットル対象クエリのデータベースアカウント | 「[速度制限モード]」が「[キーワードによる速度制限]」または「[SQL テンプレートによる速度制限]」に設定されている場合に必須です。速度制限の対象となる SQL ステートメントを持つデータベースアカウントです。 |
送信 をクリックしてルールを作成します。
スロットリング動作およびエラーコード
スロットリングルールがトリガーされると、データベースはアプリケーションにエラーを返します。具体的なエラーコードは、インスタンスのバージョンおよび設定された最大同時実行数によって異なります。
| 最大同時実行数 | インスタンス | エラーコード | エラーメッセージ |
|---|---|---|---|
| 0 または正の整数 | ApsaraDB RDS for MySQL 5.6 | 1317 | query execution was interrupted |
| 0 または正の整数 | ApsaraDB RDS for MySQL 5.7(マイナーバージョンが 20200630 より前の場合) | 1317 | query execution was interrupted |
| 0 または正の整数 | PolarDB for MySQL 5.6 | 1317 | query execution was interrupted |
| 正の整数 | ApsaraDB RDS for MySQL 5.7(マイナーバージョンが 20200630 以降の場合) | 5041 | Concurrency control waiting count exceed max waiting count |
| 正の整数 | ApsaraDB RDS for MySQL 8.0 | 7534 | Concurrency control waiting count exceed max waiting count |
| 正の整数 | PolarDB for MySQL 5.7 | 3277 | Concurrency control waiting count exceed max waiting count |
| 正の整数 | PolarDB for MySQL 8.0 | 7533 | Concurrency control waiting count exceed max waiting count |
| 0 | ApsaraDB RDS for MySQL 5.7(マイナーバージョンが 20200630 以降の場合) | 5042 | Concurrency control refuse to execute query |
| 0 | ApsaraDB RDS for MySQL 8.0 | 7535 | Concurrency control refuse to execute query |
| 0 | PolarDB for MySQL 5.7 | 3278 | Concurrency control refuse to execute query |
| 0 | PolarDB for MySQL 8.0 | 7534 | Concurrency control refuse to execute query |
サポート対象インスタンスの追加パラメーター:
`ccl_max_waiting_count`(ApsaraDB RDS for MySQL 5.7 マイナーバージョン 20200630 以降、ApsaraDB RDS for MySQL 8.0):キューの最大長を設定します。0 に設定した場合、DAS はデフォルト値 10 を使用します。
`ccl_wait_timeout`(ApsaraDB RDS for MySQL 5.7 マイナーバージョン 20200630 以降、ApsaraDB RDS for MySQL 8.0):待機中のステートメントのタイムアウトを設定します(インスタンスバージョンが対応している場合)。タイムアウトを超えたステートメントは継続して実行され、スロットリングの対象外となります。
`ccl_mode`(PolarDB for MySQL 8.0):同時実行数制限を超えた際の動作を制御します。このパラメーターは、対応するインスタンスバージョンでのみ利用可能です。
WAIT(デフォルト):ステートメントはキュー内で待機します。REFUSE:ステートメントは待機せず、即座に拒否されます。
スロットリングルールの表示および管理
ルールを作成すると、そのルールは 実行中 タブに以下の詳細とともに表示されます。
表示されるカラムは、データベースエンジンおよびスロットリングモードによって異なります。
| カラム | 説明 |
|---|---|
| スロットリングモード | ルール作成時に選択したモードです。 |
| スロットリングルール | ルールの構成内容:キーワード(キーワードモード)、テンプレート ID(テンプレートモード)、または実行時間しきい値およびスロットル対象ステートメント数(実行時間モード)です。 |
| 最大同時実行数 | 設定された同時実行数制限です。 |
| 最大待機クエリ数 | キューの最大長です。ApsaraDB RDS for PostgreSQL(SQL テンプレートモード)で表示されます。 |
| スロットリング期間(分) | 設定された有効期間です。 |
| 開始時刻 | ルールが有効になった時刻です。 |
| 残り時間(秒) | ルールの有効期限までに残っている時間です。 |
| サンプル SQL | テンプレート生成に使用された SQL サンプルです。SQL テンプレートモードで表示されます。 |
| スロットリングテンプレート ID | スロットル対象の SQL サンプルに対応するテンプレート ID です。SQL テンプレートモードで表示されます。 |
| ステータス | 実行中のルールは 有効 と表示されます。 |
| データベース | ルールが適用されるデータベースです。SQL テンプレートモードで表示されます。 |
| 検索パス | スキーマ検索パスです。ApsaraDB RDS for PostgreSQL(SQL テンプレートモード)で表示されます。 |
| 一致した SQL クエリ | このルールでマッチした SQL ステートメントの数です。SQL テンプレートモードで表示されます。 |
| 待機中の SQL クエリ | 現在キュー内で待機中の SQL ステートメントの数です。SQL テンプレートモードで表示されます。 |
| 操作 | 無効化 または 編集 を実行します。 |
次のステップ
自動 SQL スロットリング — DAS が自動的にスロットリングルールを検出し、適用する機能です。
API リファレンス
| API | 説明 |
|---|---|
| EnableSqlConcurrencyControl | SQL スロットリングを有効化します。 |
| DisableSqlConcurrencyControl | 指定されたスロットリングルールを無効化します。 |
| DisableAllSqlConcurrencyControlRules | すべての実行中のスロットリングルールを無効化します。 |
| GetRunningSqlConcurrencyControlRules | 実行中のスロットリングルールを取得します。 |
| GetSqlConcurrencyControlRulesHistory | 実行中またはトリガー済みのスロットリングルールを取得します。 |
| GetSqlConcurrencyControlKeywordsFromSqlText | SQL ステートメントからスロットリングキーワードを生成します。 |