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.6以降の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、
タイプvarchar(64) 、
Schema_name varchar(64) 、
Table_name varchar(64) 、
Concurrency_count bigint NOT NULL、
キーワードテキスト、
状態列挙 ('N','Y') COLLATE utf8_general_ci DEFAULT 'Y' NOT NULL,
Ordered enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL、
ダイジェストvarchar(64) 、
Digest_text longtext、
余分なmediumtext、
PRIMARY KEY Rule_id(id)
) エンジン=InnoDB STATS_PERSISTENT=0文字セット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>,'<キーワード>');
例
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を実行している場合にのみサポートされます。構文
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);
次の応答が返されます。
クエリOK、影響を受ける0行、2警告 (0.00秒)
次のステートメントを実行して警告メッセージを表示します。
ショー警告;
次の応答が返されます。
+ -------- -------- + ---------------------------------------------------- + | レベル | コード | メッセージ | + -------- + ------- + ---------------------------------------------------- + | 警告 | 7517 | 同時実行制御ルールの100がテーブルに見つかりません | | 警告 | 7517 | 同時実行制御ルールの100がキャッシュに見つかりません | + -------- + ------- + ---------------------------------------------------- +
説明上記の例では、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 | スキーマ | テーブル | ステート | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | キーワード | ------ -------- -------- --------- ------------------------------------------------------------------ | 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 | スキーマ | テーブル | ステート | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | キーワード | ------ -------- -------- --------- ------------------------------------------------------------------ | 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 | スキーマ | テーブル | ステート | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | キーワード | ------ -------- -------- --------- ------------------------------------------------------------------ | 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;
次の応答が返されます。
クエリOK、影響を受ける1行 (0.00秒) 一致した行: 1変更: 1警告: 0
次のステートメントを実行して、変更されたCCLルールを検証します。
CALL dbms_ccl.flush_ccl_rule();
次の応答が返されます。
クエリOK、影響を受ける0行 (0.00秒)
機能のテスト
次のディメンションに基づいてCCLルールを作成します。
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); // TYPEディメンションをSELECTに、SCHEMAディメンションをtestに、TABLEディメンションをsbtest1に、同時スレッドの最大数を3に設定します。 dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2') を呼び出します。// TYPEディメンションをSELECTに、KEYWORDディメンションをsbtest2に、同時スレッドの最大数を2に設定します。 CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); // TYPEディメンションをSELECTに設定し、スレッドの最大数を2に設定します。
次のシナリオでは、sysbenchを使用して機能を確認します。
64スレッド
4つのテーブル
select.lua
次のステートメントを実行して、ルールの同時スレッド数を照会します。
CALL dbms_ccl.show_ccl_rule();
次の応答が返されます。
------ -------- --------- ----------- ----------------------------------------------------------------- | ID | TYPE | スキーマ | テーブル | ステート | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | キーワード | ------ -------- --------- ---------- ---------------------------------------------------------------------- | 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列 (0.00秒)
[実行] 列に表示される数値は、ルールの作成時に指定した数値と同じです。