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

ApsaraDB RDS:rds_ccl拡張を使用してSQLスロットリングを実行する

最終更新日:Mar 19, 2024

ApsaraDB RDS for PostgreSQLには、SQLスロットリング機能があります。 この機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスに対する同時SQLクエリの最大数を制限し、リソース集約型のSQL文によって発生する問題を解決できます。 この機能により、データベースシステムが安定して実行され、ビジネス要件を満たすことができます。

背景情報

SQLスロットリングは、データベースを管理するための重要な手法です。 SQLスロットリングを使用して、同時SQL文の最大数を制限し、データベースの過度の負荷を防ぎ、データベースの安定性と信頼性を確保し、データベースのパフォーマンスと効率を向上させることができます。

シナリオ

SQLスロットリングは、同時実行性の高いアクセスシナリオと次のシナリオに適しています。

  • 攻撃防止

    SQLスロットリング機能を使用して、タイプごとに同時SQL文の最大数を制限し、サービス拒否 (DoS) 攻撃を含む攻撃を防ぐことができます。 これにより、データベースのセキュリティが確保されます。

  • リソース使用量制御

    SQLスロットリング機能を使用して、データベースリソースの使用を制御するために、型ごとに同時SQL文の最大数を制限できます。 これにより、リソースの枯渇によるデータベースの障害やパフォーマンスの低下を防ぎます。

    たとえば、データベースのバックアップ、復元、または監視のためにSQL文を実行する場合、SQLスロットリング機能を使用してSQL文の実行速度を管理し、データベースのパフォーマンスに悪影響を与えないようにすることができます。

前提条件

  • RDSインスタンスは、次の要件を満たす必要があります。

    • RDSインスタンスはPostgreSQL 14以降を実行します。

    • RDSインスタンスのマイナーエンジンバージョンが20230330以降です。

    説明

    RDSインスタンスのマイナーエンジンバージョンを更新する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのマイナーエンジンバージョンの更新」をご参照ください。

  • rds_ccl拡張を使用する前に、次のパラメーター設定が使用されていることを確認してください。

    • rds_enable_ccl: on

    • compute_query_id: autoまたはon

    説明

    ApsaraDB RDSコンソールでインスタンスパラメーターを設定できます。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。

制限

なし

影響

SQLスロットリングが適切に構成されていない場合、ワークロードが影響を受ける可能性があります。 ワークロードに基づいてSQLスロットリングを構成することを推奨します。

たとえば、アクセス要求の急増により、RDSインスタンスの負荷が高くなります。 SQLスロットリング機能を使用して、RDSインスタンスの負荷を軽減するために、同時SQLステートメントの最大数をタイプごとに制限できます。 ただし、同時SQL文の数を小さな値に設定すると、ワークロードにも影響を与える可能性があります。

使用上の注意

インスタンスの再起動やプライマリ /セカンダリの切り替えなどのシナリオでは、SQLスロットリングルールを手動でロードする必要があります。 詳細については、「SQLスロットリングルールの読み込み」をご参照ください。

課金

エクステンションは無料です。

拡張機能の作成または削除

このセクションのステートメントを実行するには、特権アカウントを使用する必要があります。

  • エクステンションを作成します。

    拡張の作成rds_ccl;
  • 拡張を削除します。

    ドロップ延長rds_ccl;

このセクションのステートメントを実行するには、特権アカウントを使用する必要があります。

SQLスロットリングルールの作成

シナリオ

次の構文の関数は、プライマリRDSインスタンスでのみ呼び出して、SQLスロットリングルールを作成できます。

構文

構文1: 指定されたSQL文でスロットリングを実行します。

SELECT rds_add_ccl_rule (
query_string varchar,
node_tag int,
max_concurrency int,
max_waiting int,
is_enabledブール値,
コメントvarchar, -- オプション
search_path varchar -- オプション
); 

構文2: query_idパラメーターに基づいてスロットリングを実行します。

SELECT rds_add_ccl_rule_with_query_id (
  query_id bigint,
  node_tag int,
  max_concurrency int,
  max_waiting int,
  is_enabledブール値,
  query_string varchar, -- オプション
  コメントvarchar-オプション
); 

Parameters

パラメーター

データ型

説明

query_string

varchar

スロットルするSQLステートメント。

スロットルするSQL文をラップするには、$$ または $<Any character>$ を使用する必要があります。 詳細については、「ドル引用文字列定数」をご参照ください。

例:

-- $$を使用してSQL文をラップします。
$$SELECT * からmy_table ;$$

-- SQL文に $$が含まれている場合は、$ccl $を使用してSQL文をラップします。
$ccl$SELECT * FROM my_table WHERE my_column = $$hello $$;$ ccl$ 

この関数は、query_stringに基づいてquery_idの値を取得し、query_idに基づいて同じ種類のSQL文をスロットルします。 query_idの詳細については、「query_idの紹介」をご参照ください。

query_id

bigint

スロットルするSQL文のクエリID。 詳細については、「Introduction to query_id」をご参照ください。

node_tag

int

SQLスロットリングを実行するインスタンス。

  • 1: SQLスロットリングは、プライマリRDSインスタンスでのみ実行されます。

  • 2: SQLスロットリングは、読み取り専用RDSインスタンスでのみ実行されます。

  • 3: SQLスロットリングは、プライマリRDSインスタンスと読み取り専用RDSインスタンスの両方で実行されます。

説明

このパラメーターには、SQLスロットリングルールの適用範囲を指定します。 このルールは、読み取り専用RDSインスタンスでは自動的に有効になりません。 読み取り専用RDSインスタンスでルールを有効にする場合は、手動でルールをロードする必要があります。 詳細については、「SQLスロットリングルールの読み込み」をご参照ください。

max_concurrency

int

型別の同時SQL文の最大数。

有効な値: 0 ~ 100000

max_waiting

int

待機状態にとどまることができるSQL文の最大数。 待機中のSQL文の数がこのパラメーターの値を超えると、AliPGは自動的にABORT文を実行してトランザクションを終了し、ロールバックします。 詳細については、「ABORT」をご参照ください。

有効な値: 0 ~ 100000

は_enabled

Boolean

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

  • true: すぐにルールを有効にします。

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

コメント

varchar

ルールの説明。

search_path

varchar

スロットルするSQL文が実行されているときの検索パス。 search_pathを引用符のペア ('') に設定した場合、デフォルトの検索パスが使用されます。 SHOW search_path; ステートメントを実行して、検索パスを照会することもできます。 引用符のペアは空の文字列を示します。

使用上の注意

  • 構文1では、commentsearch_pathを引用符のペア ('') に設定できます。 パラメーターをNULLに設定すると、関数は操作を実行せず、値を直接返します。 引用符のペアは空の文字列を示します。

  • 構文2では、次の点に注意してください。

    • query_stringcommentを引用符のペア ('') に設定できます。 パラメーターをNULLに設定すると、関数は操作を実行せず、値を直接返します。 引用符のペアは空の文字列を示します。

    • query_idquery_stringに他の値を設定した場合、AliPGは指定したquery_idに基づいてSQLスロットリングを実行します。

  • この関数はccl_idを返します。 ccl_idは、現在のデータベース内のSQLスロットリングルールの一意の識別子です。

ccl_tblテーブルは、プライマリRDSインスタンスのccl_testデータベースに作成されます。 RDSインスタンスの次の要件を満たすSQLスロットリングルールを作成できます。

  1. SELECT * FROM ccl_tblステートメントはすべてスロットリングされます。 この例では、query_idは1に設定されています。

  2. このタイプの最大3つのSQL文を同時に実行できます。

  3. このタイプの最大2つのSQL文が待機状態のままになります。

  4. ルールは作成後すぐに有効になります。

  • 構文1

    SELECT rds_add_ccl_rule (
      $$SELECT * FROM ccl_tbl $;, -- $$を使用してスロットルされ、ラップされるSQL文。
      1、-- SQLスロットリングはプライマリRDSインスタンスでのみ実行されます。
      3、-このタイプの最大3つのSQLステートメントを同時に実行できます。
      2、-このタイプの最大2つのSQLステートメントは待機状態にとどまることができます。
      true, -- ルールは作成後すぐに有効になります。
      'limit constant select', -- ルールの説明。
      ''-- search_pathのデフォルト値が使用されます。
    );
  • 構文2

    SELECT rds_add_ccl_rule_with_query_id (
      1、スロットルするSQL文の -- query_id。
      1、-- SQLスロットリングはプライマリRDSインスタンスでのみ実行されます。
      3、-このタイプの最大3つのSQLステートメントを同時に実行できます。
      2、-このタイプの最大2つのSQLステートメントは待機状態にとどまることができます。
      true, -- ルールは作成後すぐに有効になります。
      ''-SQL文のテキスト。 この例では、このパラメーターは指定されていません。	
      'limit constant select', -- ルールの説明。
    );

SQLスロットルルールの照会

シナリオ

次の構文のステートメントは、プライマリRDSインスタンスまたは読み取り専用RDSインスタンスで実行して、作成されたSQLスロットリングルールを照会できます。

構文

  • RDSインスタンス上のすべてのデータベースに対して作成されたSQLスロットリングルールを照会します。

    SELECT * FROM rds_enabled_ccl_rule;
    説明

    クエリ結果では、querice_stringcommentの値は表示制限により切り捨てられ、各値の最初の200文字のみが表示されます。 完全な値を表示するには、SELECT * FROM rds_show_current_db_ccl_rule(); ステートメントを実行します。

  • RDSインスタンスの現在のデータベースに対して作成されたSQLスロットリングルールを照会します。

    SELECT * FROM rds_show_current_db_ccl_rule();

SQLスロットリングルールの有効化

シナリオ

次の構文の関数は、プライマリRDSインスタンスでのみ呼び出すことができ、次の操作で使用できます。

  • SQLスロットリングルールを作成するときにis_enabledfalseに設定されている場合、この関数を呼び出してルールを有効にできます。

  • この関数を呼び出して、無効なSQLスロットリングルールを有効にします。

構文

SELECT rds_enable_ccl_rule(ccl_id int);

Parameters

パラメーター

データ型

説明

ccl_id

int

SQLスロットリングルールのID。 SQLスロットリングルールのIDをクエリする方法の詳細については、「SQLスロットリングルールのクエリ」をご参照ください。

使用上の注意

なし

SELECT rds_enable_ccl_rule(1);

SQLスロットリングルールの読み込み

シナリオ

次の構文の関数は、プライマリRDSインスタンスまたは読み取り専用RDSインスタンスで呼び出して、SQLスロットリングルールをロードできます。 ロードされたルールのみを使用してSQLスロットリングを実行できます。

この関数は、次のシナリオで使用できます。

  • プライマリRDSインスタンス:

    • SQLスロットリングルールの作成時にis_enabledtrueに設定されている場合、ルールは自動的にプライマリRDSインスタンスにロードされます。 人間の介入は必要ありません。

    • SQLスロットリングルールを作成するときにis_enabledfalseに設定され、rds_enable_ccl_rule関数が呼び出されてルールが有効化されると、ルールは自動的にプライマリRDSインスタンスにロードされます。 人間の介入は必要ありません。

    • プライマリRDSインスタンスが再起動された場合、この関数を呼び出してSQLスロットリングルールを手動でロードする必要があります。

  • 読み取り専用RDSインスタンス:

    読み取り専用RDSインスタンスでSQLスロットリングルールを有効にする場合は、SQLスロットリングルールを作成するときにnode_tag2または3に設定し、読み取り専用RDSインスタンスで関数を呼び出してルールをロードする必要があります。

構文

SELECT rds_load_ccl_rule(ccl_id int);

Parameters

パラメーター

データ型

説明

ccl_id

int

SQLスロットリングルールのID。 SQLスロットリングルールのIDをクエリする方法の詳細については、「SQLスロットリングルールのクエリ」をご参照ください。

使用上の注意

  • プライマリRDSインスタンスでrds_add_ccl_rule関数を呼び出し、node_tag2または3に設定してルールを作成した後にのみ、SQLスロットリングルールを読み取り専用RDSインスタンスにロードできます。

  • 無効なルールはロードできません。 無効化されたルールを読み取り専用RDSインスタンスにロードする場合は、まずプライマリRDSインスタンスで無効化されたルールを有効にする必要があります。 詳細については、「SQLスロットリングルールの有効化」をご参照ください。

SELECT rds_enable_ccl_rule(1);

SQLスロットリングルールの変更

シナリオ

次の構文の関数は、プライマリRDSインスタンスでのみ呼び出して、SQLスロットリングルールのmax_concurrencyとmax_waitingの値を変更できます。

構文

SELECT rds_update_ccl_rule ()
ccl_id int,
new_max_concurrency int、new_max_waiting int
); 

Parameters

パラメーター

データ型

説明

ccl_id

int

SQLスロットリングルールのID。 SQLスロットリングルールのIDをクエリする方法の詳細については、「SQLスロットリングルールのクエリ」をご参照ください。

new_max_並行性

int

max_concurrencyの新しい値。

  • max_concurrencyの値を増やすと、待機状態のSQL文がすぐに実行されます。

  • max_concurrencyの値を減らしても、実行中のSQL文は影響を受けません。 待機状態にあるSQL文は、同時実行SQL文の数がmax_concurrencyの新しい値を下回った後にのみ実行されます。

new_max_待機中

int

max_waitingの新しい値。

  • max_waitingの値を増やすと、指定された型のSQL文が待機状態にとどまる可能性があります。

  • 待機中のSQL文の最大数を減らしても、待機中のSQL文は影響を受けません。 新しいSQL文が待機状態になり、待機中のSQL文の数がmax_waitingの新しい値よりも大きい場合、AliPGは自動的にABORT文を実行してトランザクションを終了し、ロールバックします。

使用上の注意

  • SQLスロットリングルールを変更すると、その変更はすぐに有効になります。

  • SQLスロットリングルールでは、同時SQL文の最大数と待機中のSQL文の最大数を変更できます。

SELECT rds_update_ccl_rule ()
 2、-- ccl_id
 4、-同時SQL文の新しい最大数は4です。
 5 -- 待機中のSQL文の新しい最大数は5です。
);

SQLスロットリングルールの無効化

シナリオ

次の構文の関数は、プライマリRDSインスタンスでのみ呼び出して、SQLスロットリングルールを無効にできます。 無効なルールは、SQLスロットリングに使用できなくなりました。

説明

SQLスロットリングルールを有効にする方法の詳細については、「SQLスロットリングルールの有効化」をご参照ください。

構文

  • SQLスロットリングルールを無効にします。

    SELECT rds_disable_ccl_rule(ccl_id int);
  • データベースのすべてのSQLスロットリングルールを無効にします。

    SELECT rds_disable_all();

Parameters

パラメーター

データ型

説明

ccl_id

int

SQLスロットリングルールのID。 SQLスロットリングルールのIDをクエリする方法の詳細については、「SQLスロットリングルールのクエリ」をご参照ください。

使用上の注意

  • 無効なルールはロードできません。 無効化されたルールを読み取り専用RDSインスタンスにロードする場合は、まずプライマリRDSインスタンスで無効化されたルールを有効にする必要があります。 詳細については、「SQLスロットリングルールの有効化」をご参照ください。

  • SQLスロットリングルールを無効にすると、ルールはプライマリRDSインスタンスから自動的にアンロードされ、SQLスロットリングに使用できなくなります。

SELECT rds_disable_ccl_rule(1);

SQLスロットリングルールのアンロード

シナリオ

次の構文の関数は、プライマリRDSインスタンスまたは読み取り専用RDSインスタンスで呼び出して、SQLスロットリングルールをアンロードできます。 アンロードされたルールは、SQLスロットリングの実行に使用できなくなりました。

この関数は、次のシナリオで使用できます。

  • プライマリRDSインスタンス:

    • プライマリRDSインスタンスでrds_disable_ccl_ruleまたはrds_disable_all関数を呼び出してSQLスロットリングルールを無効にすると、ルールはプライマリRDSインスタンスから自動的にアンロードされます。 人間の介入は必要ありません。

    • プライマリRDSインスタンスでrds_del_ccl_rule関数を呼び出してSQLスロットリングルールを削除すると、ルールは自動的にプライマリRDSインスタンスからアンロードされます。 人間の介入は必要ありません。

    • この関数を呼び出して、プライマリRDSインスタンスからルールをアンロードすることもできます。

  • 読み取り専用RDSインスタンス:

    読み取り専用RDSインスタンスのSQLスロットリングルールを無効にする場合は、読み取り専用RDSインスタンスでこの関数を呼び出すことができます。

構文

SELECT rds_unload_ccl_rule(ccl_id int、db_name varcharデフォルト '');

Parameters

パラメーター

データ型

説明

ccl_id

int

SQLスロットリングルールのID。 SQLスロットリングルールのIDをクエリする方法の詳細については、「SQLスロットリングルールのクエリ」をご参照ください。

db_name

varchar

デフォルト値は、現在のデータベースを指定する空の文字列です。 他のデータベースを指定して、データベースからSQLスロットリングルールをアンロードすることもできます。

使用上の注意

SQLスロットリングルールがアンロードされると、そのルールを使用してSQLスロットリングを実行できなくなります。 ルールを再利用する場合は、ルールをリロードする必要があります。 詳細については、「SQLスロットリングルールの読み込み」をご参照ください。

SELECT rds_unload_ccl_rule(1,'');

SQLスロットリングルールの削除

シナリオ

次の構文の関数は、プライマリRDSインスタンスでのみ呼び出して、SQLスロットリングルールを削除できます。 ルールが削除されると、プライマリRDSインスタンスから自動的にアンロードされます。

構文

SELECT rds_del_ccl_rule(ccl_id int);

Parameters

パラメーター

データ型

説明

ccl_id

int

SQLスロットリングルールのID。 SQLスロットリングルールのIDをクエリする方法の詳細については、「SQLスロットリングルールのクエリ」をご参照ください。

使用上の注意

なし

SELECT rds_del_ccl_rule(1);

次の結果を返すことができます。

rds_del_ccl_rule
----------------------
 -7851264404688445170
(1行) 
説明
  • query_idが返されます。

  • ルールが存在しない場合、エラーが報告されます。

付録

Introduction to query_id

  • query_idは、PostgreSQLのSQL文の特別な識別子です。 同じタイプのSQL文は、同じquery_id値を持ちます。

    例:

    -次のステートメントは同じquery_id値を持ちます。
    SELECT * FROM tbl WHERE a = 1;
    SELECT * FROM tbl WHERE a = 2; 
  • query_idには、SQL文のオブジェクトに関するoid情報が含まれます。 異なるデータベースで同じ名前のテーブルは、同じオブジェクトではありません。 異なるスキーマで同じ名前のテーブルは、同じオブジェクトではありません。 SQL文を使用して異なるデータベース内の異なるオブジェクトをクエリする場合、SQL文のデータベース内のquery_id値は異なります。

  • SQL文を使用してグローバルテーブルまたはグローバル関数をクエリする場合、SQL文は異なるデータベースで同じquery_id値を持ちます。

    • 例1: pg_databaseはグローバルテーブルです。 異なるデータベースで同じステートメントを実行すると、異なるデータベースで同じquery_id値が使用されます。

      • ccl_testデータベースで次のステートメントを実行します。

        SELECT rds_get_query_id($$SELECT * FROM pg_database $;$);

        次の結果を返すことができます。

        rds_get_query_id
        ----------------------
         -8733244708994363681
        (1行) 
      • ccl_test2データベースで次のステートメントを実行します。

        SELECT rds_get_query_id($$SELECT * FROM pg_database $;$);

        次の結果を返すことができます。

        rds_get_query_id
        ----------------------
         -8733244708994363681
        (1行) 
    • 例2: pg_sleepはグローバル関数です。 異なるデータベースで同じステートメントを実行すると、異なるデータベースで同じquery_id値が使用されます。

      • ccl_testデータベースで次のステートメントを実行します。

        SELECT rds_get_query_id($$SELECT pg_sleep(1);$$);

        次の結果を返すことができます。

        rds_get_query_id
        --------------------
         440101247839410938
        (1行) 
      • ccl_test2データベースで次のステートメントを実行します。

        SELECT rds_get_query_id($$SELECT pg_sleep(1);$$);

        次の結果を返すことができます。

        rds_get_query_id
        --------------------
         440101247839410938
        (1行) 
  • 関数呼び出しのシナリオでは、パラメーターのデータ型が変更された場合、またはFROM句の存在が変更された場合、query_idが変更されます。

    たとえば、pg_sleep関数を呼び出すと、query_idの値は状況によって異なります。

    • FROM句なし

      SELECT rds_get_query_id($$SELECT pg_sleep(1);$$);

      次の結果を返すことができます。

      rds_get_query_id
      --------------------
       440101247839410938
      (1行) 
    • FROM句付き

      SELECT rds_get_query_id($$SELECT * FROM pg_sleep(1);$$);

      次の結果を返すことができます。

      rds_get_query_id
      ----------------------
       -3404018605099167039
      (1行) 
    • パラメータのデータ型の変更

      select rds_get_query_id($$SELECT * FROM pg_sleep(1.0);$$);

      次の結果を返すことができます。

      rds_get_query_id
      ---------------------
       3073869725037049158
      (1行)