Alibaba Cloud は、予期しないリクエストトラフィック、リソースを大量に消費するステートメント、SQL アクセスモデルの変更などが発生した場合に ApsaraDB RDS for MySQL インスタンスの安定性を確保するため、同時実行制御 (CCL) 機能と DBMS_CCL パッケージを提供します。CCL 機能は構文ルールに基づいて開発されています。DBMS_CCL パッケージを使用すると、特定の種類の SQL ステートメントの最大同時実行数を制限できます。同時実行される SQL ステートメントの数が上限に達した場合、超過した SQL ステートメントは、その数が上限を下回るまで待機状態になります。
前提条件
RDS インスタンスで、次のいずれかの MySQL バージョンが実行されている必要があります。
MySQL 8.4
マイナーエンジンバージョンが 20190816 以降の MySQL 8.0
マイナーエンジンバージョンが 20200630 以降の MySQL 5.7
パラメーター
パラメーター | 説明 |
ccl_max_waiting_count | 同一の CCL ルールに一致し、 |
ccl_wait_timeout | SQL ステートメントが |
注意事項
CCL 操作はログを生成しないため、現在の RDS インスタンスにのみ影響します。たとえば、プライマリ RDS インスタンスで実行された CCL 操作は、セカンダリ RDS インスタンス、読み取り専用 RDS インスタンス、またはディザスタリカバリインスタンスには同期されません。
CCL は、DML ステートメントによって引き起こされるトランザクションのデッドロックを解決するためのタイムアウトメカニズムを提供します。保留中のスレッドもトランザクションのタイムアウトとスレッドの終了に応答して、デッドロックを防止します。
機能の説明
CCL は、以下のディメンションに基づいた機能を提供します。
SQL コマンド:SELECT、UPDATE、INSERT、DELETE などの SQL コマンドのタイプ。
オブジェクト:TABLE や VIEW など、SQL コマンドが実行されるオブジェクト。
キーワード:SQL コマンド内のキーワード。
テンプレート:SQL コマンドのテンプレート。
CCLテーブルの作成
AliSQL は、concurrency_control という名前のシステムテーブルを使用して CCL ルールを格納します。このシステムテーブルは、システムの起動時に自動的に作成されます。次のステートメントを実行してテーブルを作成できます。
CREATE TABLE `concurrency_control` (
`Id` bigint NOT NULL AUTO_INCREMENT,
`Type` enum('SELECT','UPDATE','INSERT','DELETE','TEMPLATE') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'SELECT',
`Schema_name` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`Table_name` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`Concurrency_count` bigint NOT NULL,
`Keywords` text COLLATE utf8mb3_bin,
`State` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Y',
`Ordered` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N',
`Digest` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`SQL_template` longtext COLLATE utf8mb3_bin,
PRIMARY KEY (`Id`)
) /*!50100 TABLESPACE `mysql` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0 COMMENT='同時実行制御'パラメーター | 説明 |
Id | CCL ルールの ID。 |
Type | SQL ステートメントのタイプ。 |
Schema_name | データベースの名前。 |
Table_name | データベース内のテーブルの名前。 |
Concurrency_count | 同時実行数。このパラメーターを 0 に設定すると、ルールに一致するすべての SQL ステートメントが拒否され、 |
Keywords | キーワード。複数のキーワードはセミコロン (;) で区切ります。 |
State | ルールを有効にするかどうかを指定します。 |
Ordered | 複数のキーワードを順番に照合するかどうかを指定します。 |
Digest | SQL_template に基づいてハッシュ計算を実行して取得される 64 バイトのハッシュ文字列。 |
SQL_template | SQL ステートメントのテンプレート。 |
CCLルールの管理
AliSQL は、DBMS_CCL パッケージに 4 つの管理インターフェイスを提供します。各インターフェイスを以下に説明します。
add_ccl_rule:ルールの追加
構文
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');
例
すべての SELECT ステートメントの同時実行数を 10 に設定します。
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');キーワード key1 を含む SELECT ステートメントの同時実行数を 20 に設定します。
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');test.t テーブルで実行され、キーワード key2 を含む SELECT ステートメントの同時実行数を 20 に設定します。
mysql> call dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 20, 'key2');
add_ccl_rule:テンプレートルールの追加
前提条件
テンプレートルールを追加するには、インスタンスで次のいずれかのバージョンが実行されている必要があります。
MySQL 8.4
マイナーエンジンバージョンが 20230630 以降の MySQL 8.0
マイナーエンジンバージョンが 20241231 以降の MySQL 5.7
構文
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'', 'Template_sql');説明Table_name パラメーターを指定する必要はありません。Template_sql パラメーターには 1 つの SQL ステートメントを指定する必要があります。
STATEMENT_DIGEST_TEXT 組み込み関数を使用して、SQL ステートメントに対応する SQL テンプレートを表示できます。
例
test データベース内の、
'SELECT c FROM t1 WHERE id=?'テンプレートに一致する SQL ステートメントの同時実行数を 30 に設定します。call dbms_ccl.add_ccl_rule('TEMPLATE', 'test', '', 30, '', 'SELECT c FROM t1 WHERE id=4');説明各 SQL ステートメントが一致するルールは 1 つだけです。
異なるタイプのルールは、テンプレートルール、完全ルール、キーワードルール、SQL ステートメントルールの降順で評価されます。各ルールセットは、ルールに一致するかどうかを判断するために順番にチェックされます。
del_ccl_rule:ルールの削除
構文
dbms_ccl.del_ccl_rule(<Id>);
例
ID が 15 の CCL ルールを削除します。
mysql> call dbms_ccl.del_ccl_rule(15);説明削除するルールが存在しない場合、システムから警告が出力されます。
show warnings;コマンドを実行して警告の詳細を表示できます。mysql> call dbms_ccl.del_ccl_rule(100); Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> show warnings; +---------+------+----------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------+ | Warning | 7514 | Concurrency control rule 100 is not found in table | | Warning | 7514 | Concurrency control rule 100 is not found in cache | +---------+------+----------------------------------------------------+
show_ccl_rule:有効なルールの表示
構文
dbms_ccl.show_ccl_rule();
例
mysql> call dbms_ccl.show_ccl_rule(); +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 17 | SELECT | test | t | Y | N | 30 | 0 | 0 | 0 | | | 16 | SELECT | | | Y | N | 20 | 0 | 0 | 0 | key1 | | 18 | SELECT | | | Y | N | 10 | 0 | 0 | 0 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+次の表では、MATCHED、RUNNING、および
WAITTINGについて説明します。パラメーター
説明
MATCHED
ルールに一致した回数。
RUNNING
ルールに基づいて同時に実行されているスレッドの数。
WAITTING
ルールに基づいて保留中のスレッドの数。
flush_ccl_rule:ルールの適用
構文
concurrency_control テーブルでルールを直接変更した場合、変更はすぐには有効になりません。次のコマンドを実行してルールを適用する必要があります。
dbms_ccl.flush_ccl_rule();
例
mysql> update mysql.concurrency_control set CONCURRENCY_COUNT = 15 where Id = 18; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> call dbms_ccl.flush_ccl_rule(); Query OK, 0 rows affected (0.00 sec)
機能テスト
テストスクリプト
次のステートメントを実行して、3 つのディメンションのルールを作成します。
-- キーワード sbtest1 を持つ SELECT ステートメントの同時実行数を 3 にするルールを作成します。 call dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); -- キーワード sbtest2 を持つ SELECT ステートメントの同時実行数を 2 にするルールを作成します。 call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); -- SELECT ステートメントの同時実行数を 2 にするルールを作成します。 call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');テストシナリオ
次のシナリオでテストに sysbench を使用します。
64 スレッド
4 テーブル
select.lua
テスト結果
次のステートメントを実行して、ルールに基づいた同時スレッドの数を照会します。
mysql> call dbms_ccl.show_ccl_rule(); +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS | +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | 20 | SELECT | test | sbtest1 | Y | N | 3 | 389 | 3 | 9 | | | 21 | SELECT | | | Y | N | 2 | 375 | 2 | 14 | sbtest2 | | 22 | SELECT | | | Y | N | 2 | 519 | 2 | 34 | | +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ 3 rows in set (0.00 sec)[実行中] 列に表示される数値は、ルールの作成時に指定したものと同じです。