PolarDB-X は、SQL 速度制限機能を提供します。この機能を使用すると、データベースノードで問題を引き起こす SQL 文の実行に制限を指定できます。問題には、リクエストの急増、大量のリソースの消費、SQL アクセスモデルの変更などがあります。この機能により、PolarDB-X インスタンスが継続的かつ安定的に実行されるようになります。このトピックでは、SQL 速度制限機能の使用方法について説明します。
サポートされているバージョン
SQL 速度制限機能は、計算ノードのバージョンが 5.4.9-16167266 以降の PolarDB-X Enterprise Edition インスタンスでのみサポートされています。低速 SQL 速度制限トリガーは、計算ノードのバージョンが 5.4.11-16251897 以降の PolarDB-X Enterprise Edition インスタンスでのみサポートされています。
インスタンスのバージョンの命名規則については、「リリースノート」をご参照ください。
インスタンスのバージョンを表示する方法については、「インスタンスのバージョンを表示および更新する」をご参照ください。
速度制限ルールを作成する
構文
CREATE CCL_RULE [ IF NOT EXISTS ] `ccl_rule_name`
ON `database`.`table`
TO '<username>'@'<host>'
FOR { UPDATE | SELECT | INSERT | DELETE }
[ filter_options ]
with_options
filter_options:
[ FILTER BY KEYWORD('KEYWORD1', 'KEYWORD2',…) ]パラメーター:
パラメーター | 必須 | 説明 | |
速度制限のために制限される SQL 文を識別するために使用されるパラメーター |
| はい | 速度制限ルール名。 説明 ルール名を SQL キーワードと区別するために、ルール名をバックティック (`) で囲むことをお勧めします。 |
| はい | データベース名とテーブル名。アスタリスク (*) はワイルドカード文字としてサポートされています。 説明 名前を SQL キーワードと区別するために、各データベース名とテーブル名をバックティック (`) で囲むことをお勧めします。 | |
| はい | アカウントのユーザー名。 | |
| はい | SQL クエリタイプ。値は UPDATE、SELECT、INSERT、または DELETE を指定できます。 説明 各速度制限ルールは、1 つの SQL クエリタイプにのみ適用されます。 | |
| いいえ | フィルター条件。有効な値:
| |
速度制限操作を決定するために使用されるパラメーター |
| はい | WITH 句は、速度制限操作を決定するために次のパラメーターをサポートしています。
説明
|
WITH 句に含まれるパラメーターは、速度制限のために制限される SQL 文を識別するために使用されるパラメーターに含まれるすべての条件を満たす SQL 文にのみ有効です。
例
selectrule という名前の速度制限ルールを作成して、'ccltest'@'%' ユーザーによって実行され、cclmatched キーワードを含む SELECT クエリの最大同時実行数を 10 に制限します。
CREATE CCL_RULE IF NOT EXISTS `selectrule` ON *.* TO 'ccltest'@'%'
FOR SELECT
FILTER BY KEYWORD('cclmatched')
WITH MAX_CONCURRENCY=10;任意の IP から ccltest アカウントによって実行され、cclmatched キーワードを含む SELECT クエリの最大同時実行数は 10 です。
速度制限の結果
システムが速度制限ルールに一致する SQL 文を検出すると、SQL 文は速度制限ルールで指定された WITH オプションに基づいて次の状態に入ります。
RUN
ルールに一致する SQL 文の同時実行数が MAX_CONCURRENCY で指定された値に達していない場合、SQL 文は想定どおりに実行されます。
WAIT
同時実行数が最大同時実行数に達したが、キューに入れられた SQL 文の数が WAIT_QUEUE_SIZE で指定された値に達していない場合、SQL 文は WAIT 状態に入り、次に RUN または WAIT_TIMEOUT 状態に入ります。
次の文を実行して、速度制限ルールに一致するキューに入れられた SQL 文をクエリできます。
SHOW FULL PROCESSLIST;結果例:
+----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | SQL_TEMPLATE_ID | +----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+ | 2 | polardbx_root | ***.*.*.*:62787 | polardbx | Query | 0 | | show full processlist | NULL | | 1 | polardbx_root | ***.*.*.*:62775 | polardbx | Query(Waiting-selectrulereal) | 12 | | select 1 | 9037e5e2 | +----+---------------+-----------------+----------+-------------------------------+------+-------+-----------------------+-----------------+ 2 rows in set (0.08 sec)説明select 1SQL 文はselectrulereal速度制限ルールに一致し、処理されるのを待機しています。WAIT_TIMEOUT
キューに入れられた SQL 文は、待機時間が
WAIT_TIMEOUTで指定された期間を超えると、実行に失敗し、エラーを返します。たとえば、速度制限ルールの WAIT_TIMEOUT オプションを 10 秒に設定し、速度制限ルールに一致する
SELECT sleep(11)文が 10 秒間キューに留まっている場合、次のエラーが返されます。ERROR 3009 (HY000): [11a07e23fd800000][30.225.XXX.XX:8527][polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal after waiting for 10060 msKILL
最大同時実行数と最大キュー長に達したときに、システムが速度制限ルールに一致する SQL 文を検出すると、クライアントはエラーを受信します。エラーメッセージは、最大同時実行数に達したことを示し、SQL 文が一致する速度制限ルール名を含みます。
たとえば、最大同時実行数と最大キュー長に達したときに
SELECT 1;文を実行し、文が速度制限ルールに一致する場合、次のエラーが返されます。ERROR 3009 (HY000): [11a07c4425c00000][**.***.***.**:8527][polardbx]Exceeding the max concurrency 0 of ccl rule selectrulereal説明SELECT 1;は、selectrulerealで指定された最大同時実行数を超えているため、実行に失敗します。
速度制限ルールをクエリする
特定の速度制限ルールをクエリする
特定のルールを表示するには、次の文でルール名を指定し、名前をコンマ (,) で区切ります。
構文:
SHOW CCL_RULE `ccl_rule_name1` [, `ccl_rule_name2` ]例:
SHOW CCL_RULE `selectrulereal` 結果例:
NO.: 1
RULE_NAME: selectrulereal
RUNNING: 2
WAITING: 29
KILLED: 0
MATCH_HIT_CACHE: 21374
TOTAL_MATCH: 21406
ACTIVE_NODE_COUNT: 2
MAX_CONCURRENCY_PER_NODE: 1
WAIT_QUEUE_SIZE_PER_NODE: 100
WAIT_TIMEOUT: 600
FAST_MATCH: 1
SQL_TYPE: SELECT
USER: ccltest@%
TABLE: *.*
KEYWORDS: ["SELECT"]
TEMPLATEID: NULL
CREATED_TIME: 2020-11-26 17:04:08フィールド:
フィールド | 説明 |
NO. | ルールの優先順位。値が小さいほど、優先順位が高くなります。 |
RULE_NAME | 速度制限ルール名。 |
RUNNING | 速度制限ルールに一致し、想定どおりに実行された SQL 文の数。 |
WAITING | 速度制限ルールに一致する SQL 文を使用して送信された、キューに入れられたリクエストの数。 |
KILLED | 速度制限ルールに一致し、終了された SQL 文の数。 |
MATCH_HIT_CACHE | 速度制限ルールに一致し、テンプレート ID がキャッシュキーに見つかった SQL 文の数。 |
TOTAL_MATCH | 速度制限ルールが一致した回数の合計。 |
ACTIVE_NODE_COUNT | SQL 速度制限が有効になっている計算ノードの数。 |
MAX_CONCURRENCY_PER_NODE | 各計算ノードの SQL 文の最大同時実行数。 |
WAIT_QUEUE_SIZE_PER_NODE | 各計算ノードの待機キューの最大長。 |
WAIT_TIMEOUT | SQL 文を待機キューに保持できる最大期間。 |
FAST_MATCH | 一致プロセスを高速化するためにキャッシュを有効にするかどうかを指定します。 |
SQL_TYPE | SQL 文のタイプ。 |
USER | ユーザー名。 |
TABLE | データベース名。 |
KEYWORDS | キーワードのリスト。 |
TEMPLATEID | SQL テンプレートの ID。 |
CREATED_TIME | 速度制限ルールが作成されたローカル時刻。時刻は |
すべての速度制限ルールを表示する
SHOW CCL_RULES;速度制限ルールを削除する
速度制限ルールが削除されると、速度制限ルールはすぐに無効になり、キューに入れられた SQL 文は想定どおりに実行できます。
特定の速度制限ルールを削除する
特定の速度制限ルールを削除するには、次の文でルール名を指定し、名前をコンマ (
,) で区切ります。構文:
DROP CCL_RULE [ IF EXISTS ] `ccl_rule_name1` [, `ccl_rule_name2`, ...]例:
DROP CCL_RULE IF EXISTS `selectrulereal`;すべての速度制限ルールを削除する:
CLEAR CCL_RULES;
低速 SQL 速度制限トリガー
低速 SQL 速度制限トリガーを有効にする
低速 SQL 速度制限トリガーは、指定された実行時間のしきい値を超える SQL クエリに対して速度制限ルールを自動的に作成するように設計されたメカニズムです。
構文:
SLOW_SQL_CCL GO ['SQL_TYPE'[MAX_CONCURRENCY] [SLOW_SQL_TIME] [MAX_CCL_RULE]]例:
SLOW_SQL_CCL GO 'SELECT' 2 5 2;パラメーター:
SQL_TYPE: SQL クエリタイプ。有効な値: ALL、SELECT、UPDATE、および INSERT。デフォルト値: SELECT。
MAX_CONCURRENCY: 自動的に作成された速度制限ルールで許可される SQL クエリの最大同時実行数。デフォルトでは、値は CPU コア数の半分です。
SLOW_SQL_TIME: 低速 SQL クエリのしきい値実行時間。デフォルト値: システムパラメーター SLOW_SQL_TIME の値。単位: ミリ秒。
MAX_CCL_RULE: 作成できる速度制限ルールの最大数。デフォルト値: 1000。
低速 SQL 速度制限トリガーの仕組み:
インスタンス全体のすべてのセッションをスキャンして、指定されたタイプのすべての低速 SQL クエリのテンプレート ID を識別します。
低速 SQL 速度制限トリガーを作成します。トリガーには、_SYSTEM_SLOW_SQL_CCL_TRIGGER_{SQL_TYPE}_ 形式で名前が付けられます。
すべての低速 SQL クエリのテンプレート ID をトリガーに送信します。次に、トリガーは識別された テンプレート ID の速度制限ルールを作成します。
MAX_CONCURRENCY制限を超える、識別されたテンプレート ID を持つすべての SQL クエリを終了します。
低速 SQL 速度制限トリガーを表示する
SLOW_SQL_CCL SHOW;結果のフィールド:
フィールド | 値 |
NO. | 1 |
SCHEMA | __cdc__ |
TEMPLATE_ID | 1394f5db |
SQL | SELECT * FROM test |
RULE_NAME | AUTO__SYSTEM_SLOW_SQL_CCL_TRIGGER_SELECT____cdc___1394f5db_9e1c7f6d |
RUNNING | 0 |
WAITING | 0 |
KILLED | 0 |
TOTAL_MATCH | 0 |
ACTIVE_NODE_COUNT | 4 |
MAX_CONCURRENCY_PER_NODE | 2 |
CREATED_TIME | 2025-04-23 00:00:00 |
低速 SQL のしきい値を調整する
低速 SQL のしきい値は、次の方法のいずれかを使用して調整できます (優先順位の高い順にリストされています)。
SLOW_SQL_CCL GO文で SLOW_SQL_TIME を指定します。SLOW_SQL_CCL GO を実行する前に SLOW_SQL_TIME を指定します。
例:
SET @slow_sql_time=2000; SLOW_SQL_CCL GO;PolarDB-X コンソールで SLOW_SQL_TIME を指定します。
低速 SQL 速度制限トリガーを無効にする
SLOW_SQL_CCL GO 文を使用して作成された低速 SQL 速度制限トリガーを無効にすると、トリガーによって作成された速度制限ルールも削除されます。
SLOW_SQL_CCL BACK;