Alibaba Cloudは同時実行制御 (CCL) 機能を提供し、CCLルールを使用してリクエストスパイク、リソース集約型ステートメント、SQLアクセスモデルの変更を管理し、PolarDBクラスターの安定性を確保できます。 Alibaba Cloudは、CCL機能の使用を支援するDBMS_CCL
パッケージも提供しています。
前提条件
PolarDBクラスターは、次のいずれかのバージョンを実行します。
PolarDB for MySQLの8.0。
リビジョンバージョンが5.7.1.0.6以降のPolarDB for MySQL 5.7。
説明クラスターがリビジョンバージョンが5.7.1.0.27以降のPolarDB for MySQL 5.7を実行している場合、CCL機能とスレッドプール機能をクラスターで使用できます。
PolarDB for MySQLの5.6。
使用上の注意
CCLルールは、プライマリノードでのみ変更できます。 変更は他のノードに自動的に同期されます。
CCL機能は、DMLステートメントによって引き起こされるトランザクションのデッドロックを解決するタイムアウトメカニズムを提供します。 保留中のスレッドはまた、トランザクションタイムアウトに応答し、デッドロックを防止するためにスレッドを終了します。
特徴
寸法
CCLフィーチャでは5つの次元が定義されます。 SQL文は、これらのディメンションに基づいてCCLルールと照合されます。
寸法 | 説明 |
タイプ | SELECT、UPDATE、INSERT、DELETEなどのSQL文の種類。 |
スキーマ | データベースの名前。 |
テーブル | テーブルまたはビューの名前。 |
キーワード | SQL文のキーワード。 CCLルールで複数のキーワードを指定できます。 複数のキーワードをセミコロン (;) で区切ります。 |
ダイジェスト | SQL文のハッシュ値。 詳細については、「STATEMENT_DIGEST() 」をご参照ください。 |
SQL文をCCLルールと照合するメソッド
指定したCCLルールのDIGEST値が空の場合、次の一致メソッドが使用されます。
DIGEST値が空で、TYPE、SCHEMA、およびTABLE値が空でない場合、SQL文のTYPE、SCHEMA、およびTABLE値は、CCLルールの値と一致する必要があります。 それ以外の場合、CCLルールは無効です。
DIGEST値が空で、SCHEMA値とTABLE値が空で、TYPE値が空でない場合、SQL文のTYPE値はCCLルールのTYPE値と一致する必要があります。 それ以外の場合、CCLルールは無効です。
説明CCLルールのKEYWORD値が空でない場合、KEYWORD値もチェックされます。
単一のキーワードがCCLルールで指定され、キーワードがSQL文に含まれている場合、SQL文とCCLルールは一致します。
CCLルールで複数のキーワードが指定され、すべてのキーワードがSQL文に含まれている場合、SQL文とCCLルールが一致します。 CCLルールの複数のキーワードは順番に一致しません。
CCLルールのDIGEST値が空でない場合、SQL文のSCHEMA値とDIGEST値は、CCLルールの値と一致する必要があります。 それ以外の場合、CCLルールは無効です。
CCLルールのSCHEMA値が空で、SQL文のDIGEST値がCCLルールの値と一致する場合、CCLルールは有効です。
マッチング注文
単一のSQL文は、単一のCCLルールにのみ一致します。 1つのSQL文が複数のCCLルールに一致する場合、優先度が最も高いCCLルールが選択されます。 優先度が同じであれば、最も小さいIDを有するCCLルールが選択される。 優先度は、次のディメンション値の降順で決定されます。
DIGEST値
TYPE、SCHEMA、およびTABLEの値
TYPE値
パラメーター
PolarDBコンソールで、次の表に示すパラメーターを変更できます。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。
パラメーター | 説明 |
loose_ccl_mode | 同時スレッドの最大数に達したときのSQL文のアクション。 有効な値:
説明 このパラメーターは、PolarDB for MySQL 8.0クラスターでのみサポートされます。 PolarDB For MySQL 5.6および5.7クラスターの場合、同時スレッドの最大数に達するとSQL文は待機します。 |
loose_ccl_max_waiting_count |
有効な値: 0 ~ 65536 デフォルト値:0 説明 このパラメーターは、PolarDB for MySQLの5.7および8.0クラスターでのみサポートされます。 |
CCLルールテーブル
PolarDBは、concurrency_control
という名前のシステムテーブルを使用してCCLルールを格納します。 テーブルは、システムの起動時に自動的に作成されます。 次の文を使用して、concurrency_controlテーブルを作成します。
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。 |
タイプ | SELECT、UPDATE、INSERT、DELETEなどのSQL文の種類。 |
Schema_name | データベースの名前。 |
Table_name | データベース内のテーブルの名前。 |
Concurrency_count | 同時スレッドの数。 説明 クエリの実行を防ぐSQLブラックリスト機能を有効にするには、 |
キーワード | キーワード。 複数のキーワードをセミコロン (;) で区切ります。 |
状態 | CCLルールを有効にするかどうかを指定します。 有効な値:
|
注文済み | keywordsパラメーターの複数のキーワードを順番に一致させるかどうかを指定します。 有効な値:
|
ダイジェスト |
|
Digest_text | SQL文の正規化された文ダイジェスト。 |
Extra | 追加情報。 |
CCLルールの管理
PolarDBでは、CCLルールを効率的に管理できるように、DBMS_CCL
パッケージに次の6つのストアドプロシージャが用意されています。
add_ccl_rule: TYPE、SCHEMA、TABLE、およびKEYWORD値に基づいて、SQL文に一致するCCLルールを追加します。
構文
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');
例
TYPEディメンションをSELECTに設定したCCLルールを追加します。 同時スレッドの最大数は10です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');
TYPEディメンションをSELECTに設定し、KEYWORDディメンションをkey1に設定したCCLルールを追加します。 同時スレッドの最大数は20です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');
TYPEディメンションがSELECTに設定され、KEYWORDディメンションがkey1、key2、およびkey3に設定されたCCLルールを追加します。 同時スレッドの最大数は20です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。 CCLルールの複数のキーワードは順番に一致しません。
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3');
TYPEディメンションをSELECT、SCHEMAディメンションを
test
、TABLEをt
に設定したCCLルールを追加します。 同時スレッドの最大数は10です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。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>);
例
DIGESTディメンションを
SELECT * FROM t1
に設定したCCLルールを追加します。 同時スレッドの最大数は10です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10);
SCHEMAディメンションを
test
に設定し、DIGESTディメンションをSELECT * FROM t1
に設定したCCLルールを追加します。 同時スレッドの最大数は10です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10);
DIGESTディメンションを
SELECT * FROM t1 WHERE col1=1
に設定したCCLルールを追加します。 同時スレッドの最大数は10です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);
説明SQL文に定数が含まれている場合は、定数値が異なっていても一致します。 たとえば、前述のCCLルールは、
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>);
例
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa 9a
のDIGEST値に一致するCCLルールを追加します。 同時スレッドの最大数は10です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa 9a
は、SELECT * FROM t1
を計算して取得したDIGEST値です。SELECT statement_digest("SELECT * FROM t1")
ステートメントを実行して、DIGEST値を計算したり、他のモジュールからDIGEST値を取得したりできます。SCHEMAディメンションが
test
に設定され、DIGEST値が533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa 9a
に一致するCCLルールを追加します。 同時スレッドの最大数は10です。 この数に達すると、SQL文はキューで待機するか、エラーが返されます。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);
CCLルールが存在しない場合、警告メッセージが返されます。
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クラスターの
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 | 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パラメーターについて説明します。
一致: ルールが一致した回数。
RUNNING: ルールの同時スレッド数。
WAITTING: このルールの保留中のスレッドの数。
UPDATEステートメントを実行すると、ルールのIDを変更して優先順位を変更できます。
構文
UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;
例
次のステートメントを実行して、メモリ内の有効なルールを表示します。
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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
次のステートメントを実行して、CCLルールのIDを17から20に変更します。
UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17;
次のステートメントを実行して、IDが変更された有効なCCLルールを表示します。
CALL dbms_ccl.show_ccl_rule();
次の出力が返されます。
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | 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ステートメントを実行して、ルールの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
次のステートメントを実行して、変更されたCCLルールを検証します。
CALL dbms_ccl.flush_ccl_rule();
次の出力が返されます。
Query OK, 0 rows affected (0.00 sec)
機能のテスト
次のディメンションに基づいてCCLルールを作成します。
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); // Set the TYPE dimension to SELECT, the SCHEMA dimension to test, the TABLE dimension to sbtest1, and the maximum number of concurrent threads to 3. call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); // Set the TYPE dimension to SELECT, the KEYWORD dimension to sbtest2, and the maximum number of concurrent threads to 2. CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); // Set the TYPE dimension to SELECT and the maximum number of concurrent threads to 2.
次のシナリオでは、sysbenchを使用して機能を確認します。
64スレッド
4つのテーブル
select.lua
次のステートメントを実行して、ルールの同時スレッド数を照会します。
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)
[実行] 列に表示される数値は、ルールの作成時に指定した数値と同じです。