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

PolarDB:同時実行制御

最終更新日:May 27, 2024

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ルールが選択される。 優先度は、次のディメンション値の降順で決定されます。

  1. DIGEST値

  2. TYPE、SCHEMA、およびTABLEの値

  3. TYPE値

パラメーター

PolarDBコンソールでパラメーターを変更できます。 下表に、各パラメーターを説明します。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。

パラメーター

説明

loose_ccl_mode

同時スレッドの最大数に達したときのSQL文のアクション。 有効な値:

  • WAIT (デフォルト): SQL文は、他のSQL文が実行されるまでキューで待機します。

  • REFUSE: エラーが返されます。

説明

このパラメーターは、PolarDB for MySQL 8.0クラスターに対してのみ有効です。 PolarDB For MySQL 5.6および5.7クラスターの場合、同時スレッドの最大数に達するとSQL文は待機します。

loose_ccl_max_waiting_count

loose_ccl_modeパラメーターをWAITに設定した場合、単一のCCLルールに一致するキューに入れられたSQL文の最大数。

有効な値: 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ブラックリスト機能を有効にし、そのようなクエリの実行を防ぐには、Concurrency_countを0に設定します。

キーワード

キーワード。 複数のキーワードをセミコロン (;) で区切ります。

状態

CCLルールを有効にするかどうかを指定します。 有効な値:

  • Y (デフォルト): CCLルールを有効にします。

  • N: CCLルールを無効にします。

注文済み

keywordsパラメーターの複数のキーワードを順番に一致させるかどうかを指定します。 有効な値:

  • N (デフォルト): keywordsパラメーターの複数のキーワードと順番に一致しません。

  • Y: keywordsパラメーターの複数のキーワードを順番に一致させます。

ダイジェスト

Digest_textパラメーターから取得した64バイトのハッシュ文字列。 詳細については、「STATEMENT_DIGEST() 」をご参照ください。

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; ステートメントを実行して、警告メッセージを表示できます。 例:

    1. IDが100のCCLルールを削除します。

      CALL dbms_ccl.del_ccl_rule(100);

      次の応答が返されます。

      クエリOK、影響を受ける0行、2警告 (0.00秒)
    2. 次のステートメントを実行して警告メッセージを表示します。

      ショー警告;

      次の応答が返されます。

      + -------- -------- + ---------------------------------------------------- +
      | レベル | コード | メッセージ |
      + -------- + ------- + ---------------------------------------------------- +
      | 警告 | 7517 | 同時実行制御ルールの100がテーブルに見つかりません |
      | 警告 | 7517 | 同時実行制御ルールの100がキャッシュに見つかりません |
      + -------- + ------- + ---------------------------------------------------- + 
    説明

    上記の例では、PolarDB for MySQL 8.0クラスターのCode値は7517PolarDB for MySQL 5.7クラスターのCode値は3267PolarDB 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 | |
    ------ -------- --------- ---------- ------------------------------------------------------------------ 
    説明

    次のセクションでは、MATCHEDRUNNING、およびWAITTINGパラメーターについて説明します。

    • 一致: ルールが一致した回数。

    • RUNNING: ルールの同時スレッド数。

    • WAITTING: このルールの保留中のスレッドの数。

  • UPDATEステートメントを実行すると、ルールのIDを変更して優先順位を変更できます。

    構文

    UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;

    1. 次のステートメントを実行して、メモリ内の有効なルールを表示します。

      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 | |
      ------ -------- --------- ---------- ------------------------------------------------------------------ 
    2. 次のステートメントを実行して、CCLルールのIDを17から20に変更します。

      UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17;
    3. 次のステートメントを実行して、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秒)

機能のテスト

  1. 次のディメンションに基づいて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に設定します。
  2. 次のシナリオでは、sysbenchを使用して機能を確認します。

    • 64スレッド

    • 4つのテーブル

    • select.lua

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

    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秒) 

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