すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ステートメント同時実行制御

最終更新日:Sep 27, 2024

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,
  `Keywords` text COLLATE utf8mb3_bin,
  `State` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Y',
  `Ordered` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N',
  `Digest` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
  `SQL_template` longtext COLLATE utf8mb3_bin,
  PRIMARY KEY (`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>,'<Keywords>');

    例:

    SELECT文の同時スレッド数が10のルールを作成します。

    mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');

    SELECTステートメントの同時スレッド数が20で、ステートメントのキーワードがkey1であるルールを作成します。

    mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');

    test.t表のSELECT文の同時スレッド数が20のルールを作成します。

    mysql> call 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>,'', 'Template_sql');
    説明
    • Table_nameパラメーターを指定する必要はありません。 Template_sqlパラメーターに1つのSQL文を指定する必要があります。

    • このルールは、MySQL 8.0を実行し、20230630以降のマイナーエンジンバージョンを実行するRDSインスタンスでのみサポートされます。

    例:

    テストデータベース内の 'SELECT c FROM t1 WHERE id=? テンプレートを持つSQL文の同時スレッド数が30であるテンプレートルールを作成します。

    call dbms_ccl.add_ccl_rule('TEMPLATE', 'test', '', 30, '', 'SELECT c FROM t1 WHERE id=4');
  • del_ccl_rule

    ルールを削除します。 サンプルコマンド:

    dbms_ccl.del_ccl_rule(<Id>);

    例:

    IDが15のCCLルールを削除します。

    mysql> call dbms_ccl.del_ccl_rule(15);
    説明

    削除するルールが存在しない場合、システムはエラーを報告します。 SHOW WARNINGS; ステートメントを実行して、エラーメッセージを表示できます。

    mysql> call dbms_ccl.del_ccl_rule(100);
      Query OK, 0 rows affected, 2 warnings (0.00 sec)
    
    mysql> show warnings;
    +---------+------+----------------------------------------------------+
    | Level   | Code | Message                                            |
    +---------+------+----------------------------------------------------+
    | Warning | 7514 | Concurrency control rule 100 is not found in table |
    | Warning | 7514 | Concurrency control rule 100 is not found in cache |
    +---------+------+----------------------------------------------------+
  • show_ccl_rule

    メモリ内の有効なルールを表示します。 サンプルコマンド:

    dbms_ccl.show_ccl_rule();

    例:

    ​mysql> 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 |          |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+​

    次の表に、MATCHEDRUNNING、およびWAITTINGパラメーターを示します。

    パラメーター

    説明

    マッチした

    ルールが一致する回数。

    ランニング

    ルールの下で同時に実行されているスレッドの数。

    待っている

    ルールの下で実行されるスレッドの数。

  • flush_ccl_rule

    concurrency_controlテーブルのルールを変更する場合は、ルールを再度有効にする必要があります。 サンプルコマンド:

    dbms_ccl.flush_ccl_rule();

    例:

    ​mysql> 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
    
    mysql> call dbms_ccl.flush_ccl_rule();
    Query OK, 0 rows affected (0.00 sec)​

機能テスト

  • テストスクリプト

    次のステートメントを実行して、3次元のルールを作成します。

    Create a rule for which the number of concurrent threads of the SELECT statement with the sbtest1 keyword is 3.
    call dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');
    
    -- Create a rule for which the number of concurrent threads of the SELECT statement with the sbtest2 keyword is 2.
    call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2');  
    
    -- Create a rule for which the number of concurrent threads of the SELECT statement is 2.
    call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');
  • テストシナリオ

    次のシナリオでは、テストにsysbenchを使用します。

    • 64スレッド

    • 4つのテーブル

    • select.lua

  • テスト結果

    次のステートメントを実行して、ルールに基づく同時スレッド数を照会します。

    ​mysql> 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)​

    [実行] 列に表示される数値は、ルールの作成時に指定した数値と同じです。