同時実行制御 (CCL) は、Alibaba Cloud が提供する機能で、トラフィックの急増やリソース消費の激しい SQL ステートメントの実行、アクセスモデルの変更が発生した場合でも、ご利用の PolarDB クラスターの安定した運用を保証します。CCL は SQL ステートメントに基づいたルールを使用し、DBMS_CCL ツールキットで管理できます。
前提条件
ご利用の PolarDB クラスターは、次のいずれかのバージョンである必要があります。
-
PolarDB for MySQL 8.0。
-
PolarDB for MySQL 5.7 (マイナーエンジンバージョン 5.7.1.0.6 以降)。
説明ご利用のクラスターが PolarDB for MySQL 5.7 (マイナーエンジンバージョン 5.7.1.0.27 以降) の場合、CCL はスレッドプールと互換性があります。
-
PolarDB for MySQL 5.6。
注意事項
CCL ルールはプライマリノードでのみ変更してください。変更は他のノードに自動的に同期されます。
特徴量の設計
ディメンション特徴量
CCL は 5 つのディメンション特徴量を定義します。SQL ステートメントは、これらの特徴量に基づいて CCL ルールと照合されます。
|
ディメンション |
説明 |
|
TYPE |
SQL ステートメントのタイプ (SELECT、UPDATE、INSERT、DELETE、DDL など)。 |
|
SCHEMA |
SQL 操作が実行されるデータベースの名前。 |
|
TABLE |
SQL 操作が実行されるテーブルまたはビューの名前。 |
|
KEYWORD |
SQL ステートメント内のキーワード。1 つの CCL ルールに複数のキーワードを設定できます。複数のキーワードはセミコロン (;) で区切ります。 |
|
DIGEST |
SQL ステートメントから生成されたハッシュ文字列。詳細については、「STATEMENT_DIGEST()」をご参照ください。 |
SQL ステートメントと CCL ルールの照合方法
-
CCL ルールの DIGEST 値が空の場合、照合方法は次のとおりです。
-
DIGEST 値が空で、TYPE、SCHEMA、TABLE の値が空でない場合、SQL ステートメントの TYPE、SCHEMA、TABLE がすべて CCL ルールの対応する値と一致する場合にのみルールが有効になります。
-
DIGEST 値が空で、SCHEMA と TABLE の値が空、TYPE の値が空でない場合、SQL ステートメントの TYPE が CCL ルールの TYPE と一致する場合にのみルールが有効になります。
説明CCL ルールの KEYWORD 値が空でない場合、キーワードもチェックされます。
-
CCL ルールに 1 つのキーワードが設定されている場合、SQL ステートメントにそのキーワードが含まれていれば照合は成功します。
-
CCL ルールに複数のキーワードが設定されている場合、SQL ステートメントに設定されたすべてのキーワードが含まれている場合にのみ照合は成功します。SQL ステートメント内のキーワードの順序は問いません。
-
-
CCL ルールの DIGEST 値が空でない場合、SQL ステートメントの SCHEMA と DIGEST 値の両方が CCL ルールの対応する値と一致する場合にのみルールが有効になります。
-
CCL ルールの SCHEMA 値が空の場合、SQL ステートメントの DIGEST 値が CCL ルールの DIGEST 値と一致すればルールが有効になります。
SQL ステートメントと CCL ルールの照合順序
1 つの SQL ステートメントは 1 つの CCL ルールにのみ一致します。ステートメントが複数のルールに一致する場合、最も優先度の高いルールが使用されます。優先度は次の順序で決定されます。複数のルールが同じ優先度を持つ場合、ID の小さい方のルールが使用されます。
-
DIGEST 値による照合。
-
TYPE、SCHEMA、TABLE による照合。
-
TYPE のみによる照合。
パラメーター
PolarDB コンソールで次のパラメーターを変更できます。詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。
|
パラメーター |
説明 |
|
loose_ccl_mode |
同時実行数制限を超えた場合の SQL ステートメントの動作。有効値:
説明
このパラメーターは PolarDB for MySQL 8.0 でのみサポートされています。バージョン 5.6 および 5.7 では、ステートメントは直接キューに追加されます。 |
|
loose_ccl_max_waiting_count |
有効値の範囲:0~65536。デフォルト値:0。 説明
このパラメーターは PolarDB for MySQL 5.7 および 8.0 でのみサポートされています。 |
CCL ルールテーブル
PolarDB は concurrency_control という名前のシステムテーブルを使用して CCL ルールを格納します。このテーブルは起動時に自動的に作成されるため、手動で作成する必要はありません。このシステムテーブルの CREATE ステートメントは次のとおりです。
CREATE TABLE concurrency_control (
Id bigint AUTO_INCREMENT NOT NULL,
Type varchar(64),
Schema_name varchar(64),
Table_name varchar(64),
Concurrency_count bigint NOT NULL,
Keywords text,
State enum('N','Y') COLLATE utf8_general_ci DEFAULT 'Y' NOT NULL,
Ordered enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Digest varchar(64),
Digest_text longtext,
Extra mediumtext,
PRIMARY KEY Rule_id(id)
) Engine=InnoDB STATS_PERSISTENT=0 CHARACTER SET utf8 COLLATE utf8_bin
comment='Concurrency control' TABLESPACE=mysql;
パラメーターは次の表で説明します。
|
パラメーター |
説明 |
|
Id |
CCL ルールの ID。 |
|
Type |
SQL ステートメントのタイプ (SELECT、UPDATE、INSERT、DELETE、DDL など)。 |
|
Schema_name |
データベース名。 |
|
Table_name |
データベース内のテーブル名。 |
|
Concurrency_count |
同時実行数制限。 説明
|
|
Keywords |
キーワード。複数のキーワードはセミコロン (;) で区切ります。 |
|
State |
ルールが有効かどうかを示します。有効値:
|
|
Ordered |
Keywords に複数のキーワードが設定されている場合、このパラメーターはそれらを順序通りに照合する必要があるかどうかを指定します。有効値:
|
|
Digest |
|
|
Digest_text |
SQL ステートメントの特徴 |
|
Extra |
その他の情報。 |
CCL ルールの管理
CCL ルールの管理を支援するために、PolarDB は DBMS_CCL に次の 6 つのローカルストアドプロシージャを提供します。
-
add_ccl_rule:TYPE、SCHEMA、TABLE、KEYWORD で照合する CCL ルールを追加します。
構文
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');例
-
SELECT タイプの CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); -
キーワード `key1` を含む SELECT ステートメントの CCL ルールを追加します。同時実行数が 20 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1'); -
キーワード `key1`、`key2`、`key3` を含む SELECT ステートメントの CCL ルールを追加します。キーワードの順序は問いません。同時実行数が 20 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3'); -
testスキーマのtテーブルに対する SELECT ステートメントの CCL ルールを追加します。SELECT ステートメントの同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
-
-
add_ccl_digest_rule:DIGEST 値で照合する CCL ルールを追加します。
説明add_ccl_digest_ruleストアドプロシージャは、次のデータベースエンジンバージョンでのみサポートされています。-
PolarDB for MySQL 8.0.1 (マイナーエンジンバージョン 8.0.1.1.31 以降)。
-
PolarDB for MySQL 8.0.2 (マイナーエンジンバージョン 8.0.2.2.12 以降)。
構文
dbms_ccl.add_ccl_digest_rule('<Schema_name>', '<Query>', <Concurrency_count>);例
-
SQL ステートメント
SELECT * FROM t1に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10); -
testスキーマの SQL ステートメントSELECT * FROM t1に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10); -
SQL ステートメント
SELECT * FROM t1 WHERE col1=1に一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);説明SQL ステートメントに定数が含まれている場合、定数値が異なっていても照合できます。たとえば、上記の CCL ルールは SQL ステートメント
SELECT * FROM t1 WHERE col1 = 2にも一致します。
-
-
add_ccl_digest_rule_by_hash:DIGEST 値で照合する CCL ルールを追加します。このプロシージャは、SQL ステートメントの代わりに、事前に計算された DIGEST 値を使用します。
説明add_ccl_digest_rule_by_hashストアドプロシージャは、PolarDB for MySQL 8.0.1 (マイナーエンジンバージョン 8.0.1.1.31 以降) でのみサポートされています。構文
dbms_ccl.add_ccl_digest_rule_by_hash('<Schema_name>', '<Digest>', <Concurrency_count>);例
-
DIGEST 値
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aに一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);値
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aは、SELECT * FROM t1に対して計算された DIGEST 値です。この値は、SELECT statement_digest("SELECT * FROM t1")コマンドを実行して計算するか、他のモジュールから取得できます。 -
testスキーマに対して、DIGEST 値533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aに一致する CCL ルールを追加します。同時実行数が 10 に達すると、後続のステートメントはキューに追加されるか、エラーを報告します。CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
-
-
del_ccl_rule:CCL ルールを削除します。
構文
dbms_ccl.del_ccl_rule(<Id>);例
ID 15 の CCL ルールを削除します。
CALL dbms_ccl.del_ccl_rule(15);削除したいルールが存在しない場合、システムは警告を報告します。
SHOW WARNINGS;コマンドを実行して警告の詳細を表示できます。以下に例を示します。-
ID 100 の CCL ルールを削除します。
CALL dbms_ccl.del_ccl_rule(100);出力は次のとおりです。
Query OK, 0 rows affected, 2 warnings (0.00 sec) -
次のコマンドを実行して警告の詳細を表示します。
SHOW WARNINGS;出力は次のとおりです。
+---------+------+----------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------+ | Warning | 7517 | Concurrency control rule 100 is not found in table | | Warning | 7517 | Concurrency control rule 100 is not found in cache | +---------+------+----------------------------------------------------+
説明たとえば、PolarDB for MySQL 8.0 の
コードは7517、PolarDB for MySQL 5.7 のコードは3267、PolarDB for MySQL 5.6 のコードは3045です。 -
-
show_ccl_rule:メモリ内で有効になっている CCL ルールを表示します。
構文
dbms_ccl.show_ccl_rule();例
CALL dbms_ccl.show_ccl_rule();出力は次のとおりです。
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING | 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:このルールで同時に実行されているスレッドの数。
-
WAITING:このルールで実行を待機しているスレッドの数。
-
-
UPDATE ステートメントを使用して CCL ルールの ID を変更し、その優先度を調整できます。
構文
UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;例
-
次のコマンドを実行して、メモリ内で有効になっている CCL ルールを表示します。
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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ -
次のコマンドを実行して、ID 17 の CCL ルールの優先度を調整します。これにより、ID が 20 に変更されます。
UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17; -
次のコマンドを実行して、更新された有効な CCL ルールを表示します。
CALL dbms_ccl.show_ccl_rule();出力は次のとおりです。
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING | KEYWORDS | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 16 | SELECT | | | Y | N | 20 | 0 | 0 | 0 | key1 | | 18 | SELECT | | | Y | N | 10 | 0 | 0 | 0 | | | 20 | SELECT | test | t | Y | N | 30 | 0 | 0 | 0 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
-
-
flush_ccl_rule:
concurrency_controlテーブルを変更して CCL ルールを修正した場合、変更を有効にするにはこのコマンドを実行する必要があります。構文
dbms_ccl.flush_ccl_rule();例
UPDATE ステートメントで CCL ルール ID を変更することで、宛先ルールの優先度を調整できます。
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次のコマンドを実行して設定を有効にします。
CALL dbms_ccl.flush_ccl_rule();出力は次のとおりです。
Query OK, 0 rows affected (0.00 sec)
機能テスト
-
3 つのディメンションに対して CCL ルールを作成します。
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); // test データベースの sbtest1 テーブルに対する SELECT ステートメントの場合、同時実行数は 3 です。 CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); // キーワード sbtest2 を含む SELECT ステートメントの場合、同時実行数は 2 です。 CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); // SELECT ステートメントの場合、同時実行数は 2 です。 -
Sysbench を使用して、次の構成でテストを実行します。
-
64 スレッド
-
4 テーブル
-
select.lua
-
-
ルールの同時実行数を表示します。
CALL dbms_ccl.show_ccl_rule();出力は次のとおりです。
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING | 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 列を確認します。値は期待される同時実行数と一致しています。