Alibaba Cloudは同時実行制御 (CCL) 機能を提供し、予期しないリクエストトラフィック、リソース消費ステートメント、SQLアクセスモデルの変更が発生した場合にApsaraDB RDS for MySQLインスタンスの安定性を確保します。 DBMS_CCLパッケージは、CCL機能を使用するためにインストールできます。
前提条件
RDSインスタンスは、次のいずれかのMySQLバージョンを実行します。
MySQL 8.0
MySQL 5.7
使用上の注意
ログが生成されないため、CCL操作は現在のRDSインスタンスにのみ影響します。 たとえば、プライマリRDSインスタンスで実行されるCCL操作は、セカンダリRDSインスタンス、読み取り専用RDSインスタンス、またはディザスタリカバリRDSインスタンスに同期されません。
CCLは、DMLステートメントによって引き起こされるトランザクションデッドロックを解決するタイムアウトメカニズムを提供します。 保留中のスレッドはまた、トランザクションタイムアウトに応答し、デッドロックを防止するためにスレッドを終了する。
説明
CCLは、次の寸法に基づいて機能を提供します。
SQLコマンド
SELECT、UPDATE、INSERT、DELETEなどのSQL文の種類。
オブジェクト
テーブルやビューなど、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、
「キーワード」テキストCOLLATE utf8mb3_bin、
'State' enum('N' 、'Y') 文字SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Y' 、
'Ordered' enum('N' 、'Y') 文字SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N' 、
'Digest' varchar (64) COLLATE utf8mb3_bin DEFAULT NULL、
'SQL_template' ロングテキストCOLLATE utf8mb3_bin、
主要なキー ('Id')
) /*!50100 TABLESPACE 'mysql' */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0 COMMENT='Concurrency control '
パラメーター | 説明 |
Id | CCLルールのID。 |
データ型 | SQL 文のタイプです。 |
Schema_name | データベースの名前。 |
テーブル_名 | データベース内のテーブルの名前。 |
Concurrency_count | 同時スレッドの数。 |
キーワード | キーワード。 複数のキーワードをセミコロン (;) で区切ります。 |
状態 | ルールを有効にするかどうかを指定します。 |
注文済み | 複数のキーワードを順番に一致させるかどうかを指定します。 |
ダイジェスト | SQL_templateに基づいてハッシュ計算を実行することによって得られる64バイトのハッシュ文字列。 |
SQL_template | SQL文のダイジェスト。 |
CCLルールの管理
AliSQLは、DBMS_CCLパッケージに4つの管理インターフェイスを提供します。 次のリストは、インターフェイスについて説明します。
add_ccl_rule
ルールを作成します。 サンプルコマンド:
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<キーワード>');
例:
SELECT文の同時スレッド数が10のルールを作成します。
mysql> dbms_ccl.add_ccl_rule('SELECT' 、''、'' 、10、'');
SELECTステートメントの同時スレッド数が20で、ステートメントのキーワードがkey1であるルールを作成します。
mysql> dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1') を呼び出す;
test.t表のSELECT文の同時スレッド数が20のルールを作成します。
mysql> dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 20, '');
説明Id値が大きいルールの優先度は高くなります。
add_ccl_template_rule
テンプレートルールを作成します。 サンプルコマンド:
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<キーワード>');
説明Table_nameおよびKeywordsパラメーターを指定する必要はありません。 SQLクエリパラメーターに1つのSQL文を指定する必要があります。
このルールは、MySQL 8.0を実行し、20230630以降のマイナーエンジンバージョンを実行するRDSインスタンスでのみサポートされます。
例:
テストデータベース内の
'SELECT c FROM t1 WHERE id=?
テンプレートを持つSQL文の同時スレッド数が30であるテンプレートルールを作成します。mysql> call dbms_ccl.add_ccl_rule('SELECT', 'test', '', 30, SELECT c FROM t1 WHERE id=4 ');
del_ccl_rule
ルールを削除します。 サンプルコマンド:
dbms_ccl.del_ccl_rule(<Id>);
例:
IDが15のCCLルールを削除します。
mysql> dbms_ccl.del_ccl_rule(15) を呼び出します。
説明削除するルールが存在しない場合、システムはエラーを報告します。
SHOW WARNINGS;
ステートメントを実行して、エラーメッセージを表示できます。mysql> dbms_ccl.del_ccl_rule(100) を呼び出します。 クエリOK、影響を受ける0行、2警告 (0.00秒) mysql> 警告を表示します。+ -------- + ------- + ---------------------------------------------------- + | レベル | コード | メッセージ | + -------- + ------- + ---------------------------------------------------- + | 警告 | 7514 | 同時実行制御ルールの100がテーブルに見つかりません | | 警告 | 7514 | 同時実行制御ルールの100がキャッシュに見つかりません | + -------- + ------- + ---------------------------------------------------- +
show_ccl_rule
メモリ内の有効なルールを表示します。 サンプルコマンド:
dbms_ccl.show_ccl_rule();
例:
mysql> 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パラメーターを示します。
パラメーター
説明
マッチした
ルールが一致する回数。
ランニング
ルールの下で同時に実行されているスレッドの数。
待っている
ルールの下で実行されるスレッドの数。
flush_ccl_rule
concurrency_controlテーブルのルールを変更する場合は、ルールを再度有効にする必要があります。 サンプルコマンド:
dbms_ccl.flush_ccl_rule();
例:
mysql> update mysql.concurrency_control set CONCURRENCY_COUNT = 15ここでId = 18; クエリOK、影響を受ける1行 (0.00秒) 一致した行: 1変更: 1警告: 0 mysql> dbms_ccl.flush_ccl_rule() を呼び出します。クエリOK、影響を受ける0行 (0.00秒)
機能テスト
テストスクリプト
次のステートメントを実行して、3次元のルールを作成します。
sbtest1キーワードのSELECT文の同時スレッド数が3であるルールを作成します。 dbms_ccl.add_ccl_rule('SELECT' 、'test' 、'sbtest1' 、3、'') を呼び出します。-- sbtest2キーワードのSELECT文の同時スレッド数が2であるルールを作成します。 dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2') を呼び出します。-- SELECT文の同時スレッド数が2のルールを作成します。 dbms_ccl.add_ccl_rule('SELECT', '', '', 2 '');
テストシナリオ
次のシナリオでは、テストにsysbenchを使用します。
64スレッド
4つのテーブル
select.lua
テスト結果
次のステートメントを実行して、ルールに基づく同時スレッド数を照会します。
mysql> 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秒)
[実行] 列に表示される数値は、ルールの作成時に指定した数値と同じです。