Alibaba Cloud は、同時実行制御 (CCL) 機能と DBMS_CCL パッケージを提供し、予期しないリクエストトラフィック、リソースを大量に消費する文、SQL アクセスモデルの変更が発生した場合でも ApsaraDB RDS for MySQL インスタンスの安定性を確保します。CCL 機能は構文ルールに基づいて開発されています。DBMS_CCL パッケージを使用すると、特定の種類の SQL 文の最大同時実行数を制限できます。同時実行される SQL 文の数が上限に達した場合、超過した SQL 文は、数が上限を下回るまで待機状態になります。
前提条件
サポートされているインスタンスのバージョンは次のとおりです。
マイナーエンジンバージョンが 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='Concurrency control'パラメーター | 説明 |
Id | CCL ルールの ID です。 |
Type | SQL 文の種類です。 |
Schema_name | データベースの名前です。 |
Table_name | データベース内のテーブルの名前です。 |
Concurrency_count | 同時実行数です。0 に設定すると、このルールに一致するすべての SQL 文が拒否され、エラーコード |
Keywords | キーワードです。複数のキーワードはセミコロン (;) で区切ります。 |
State | ルールを有効にするかどうかを指定します。 |
Ordered | 複数の keywords を順番に照合するかどうかを指定します。 |
Digest | SQL_template に基づいてハッシュ計算を実行して取得される 64 バイトのハッシュ文字列です。 |
SQL_template | SQL 文のテンプレートです。 |
CCL ルールの管理
CCL ルールの管理を簡素化するために、AliSQL は DBMS_CCL で次の 4 つのローカル記憶域ルールを提供します:
add_ccl_rule:ルールの追加
コマンドテンプレート
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');
例
SQL コマンドの種類に対するルールの追加:すべての SELECT 文の同時実行数を 10 に設定します。
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');キーワードに対するルールの追加:キーワード `key1` を含む SELECT 文の同時実行数を 20 に設定します。
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');完全なルールの追加:キーワード `key2` を含む `test.t` テーブルに対する SELECT 文の同時実行数を 20 に設定します。
mysql> call dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 20, 'key2');
add_ccl_template_rule:テンプレートベースのルールの追加
前提条件
テンプレートベースのルールを追加するには、インスタンスが次のいずれかのバージョン要件を満たしている必要があります:
マイナーエンジンバージョンが 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、および
WAITING列について、次の表で説明します。パラメーター
説明
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 つのルールは 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)RUNNING 列に表示される数値は、ルールの作成時に指定した数値と同じです。