Alibaba Cloud は、SQL 文ベースの同時実行制御 (CCL) ルールと DBMS_CCL パッケージを提供しています。これらは、データベーストラフィックの急増や、リソース消費の激しい SQL 文、SQL アクセスモデルの変更に対応することで、PolarDB クラスターの安定性を確保します。
前提条件
ご利用の PolarDB クラスターは、次のいずれかのバージョンである必要があります。
PolarDB for MySQL 8.0。
PolarDB for MySQL 5.7 (マイナーエンジンバージョンが 5.7.1.0.6 以降)。
説明ご利用のクラスターが、マイナーエンジンバージョン 5.7.1.0.27 以降の PolarDB for MySQL 5.7 である場合、CCL はスレッドプールと互換性があります。
PolarDB for MySQL 5.6。
注意事項
CCL ルールはプライマリノードでのみ変更できます。変更は他のノードに自動的に同期されます。
機能設計
ディメンション
CCL は、次の 5 つのディメンションに基づいて SQL 文とルールを照合します。
ディメンション | 説明 |
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 がルール内の対応する値と一致する場合にのみ有効になります。
DIGEST 値が空で、SCHEMA と TABLE の値が空、TYPE の値が指定されている場合、ルールは SQL 文の TYPE がルール内の TYPE と一致する場合にのみ有効になります。
説明CCL ルールの KEYWORD が空でない場合、キーワードもチェックされます。
CCL ルールに単一の KEYWORD が指定されている場合、SQL 文にそのキーワードが含まれていれば一致と見なされます。
CCL ルールに複数の KEYWORD が指定されている場合、SQL 文に指定されたすべてのキーワードが含まれている場合にのみ一致と見なされます。SQL 文内のキーワードの順序は一致に影響しません。
CCL ルールの DIGEST 値が空でない場合、ルールは SQL 文の SCHEMA と DIGEST 値がルール内の対応する値と一致する場合にのみ有効になります。
CCL ルールの SCHEMA が空の場合、ルールは SQL 文の DIGEST 値がルール内の 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 TABLE` 文は次のとおりです。
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');SCHEMA が
test、TABLE が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ストアドプロシージャは、次のデータベースエンジンバージョンでサポートされています。マイナーエンジンバージョンが 8.0.1.1.31 以降の PolarDB for MySQL 8.0.1。
マイナーエンジンバージョンが 8.0.2.2.12 以降の PolarDB for MySQL 8.0.2。
構文
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ストアドプロシージャは、マイナーエンジンバージョンが 8.0.1.1.31 以降の PolarDB for MySQL 8.0.1 でのみサポートされています。構文
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 の CC ルールを削除します。
CALL dbms_ccl.del_ccl_rule(15);指定されたルールが存在しない場合、システムは警告を報告します。
SHOW WARNINGS;コマンドを実行して警告を表示できます。例:ID 100 の CC ルールを削除します。
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 の
Codeは7517、PolarDB for MySQL 5.7 のCodeは3267、PolarDB for MySQL 5.6 のCodeは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 | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+次のコマンドを実行して、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 文を使用して CC ルールの 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'); // SELECT 文にキーワード sbtest2 が含まれています。同時実行数は 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 列をチェックして、同時実行数が想定どおりであることを確認します。