ApsaraDB RDS for PostgreSQLには、SQLスロットリング機能があります。 この機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスに対する同時SQLクエリの最大数を制限し、リソース集約型のSQL文によって発生する問題を解決できます。 この機能により、データベースシステムが安定して実行され、ビジネス要件を満たすことができます。
背景情報
SQLスロットリングは、データベースを管理するための重要な手法です。 SQLスロットリングを使用して、同時SQL文の最大数を制限し、データベースの過度の負荷を防ぎ、データベースの安定性と信頼性を確保し、データベースのパフォーマンスと効率を向上させることができます。
シナリオ
SQLスロットリングは、同時実行性の高いアクセスシナリオと次のシナリオに適しています。
攻撃防止
SQLスロットリング機能を使用して、タイプごとに同時SQL文の最大数を制限し、サービス拒否 (DoS) 攻撃を含む攻撃を防ぐことができます。 これにより、データベースのセキュリティが確保されます。
リソース使用量制御
SQLスロットリング機能を使用して、データベースリソースの使用を制御するために、型ごとに同時SQL文の最大数を制限できます。 これにより、リソースの枯渇によるデータベースの障害やパフォーマンスの低下を防ぎます。
たとえば、データベースのバックアップ、復元、または監視のためにSQL文を実行する場合、SQLスロットリング機能を使用してSQL文の実行速度を管理し、データベースのパフォーマンスに悪影響を与えないようにすることができます。
影響
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; ステートメントを実行して、検索パスを照会することもできます。 引用符のペアは空の文字列を示します。 |
使用上の注意
例
ccl_tblテーブルは、プライマリRDSインスタンスのccl_testデータベースに作成されます。 RDSインスタンスの次の要件を満たすSQLスロットリングルールを作成できます。
SELECT * FROM ccl_tbl
ステートメントはすべてスロットリングされます。 この例では、query_id
は1に設定されています。
このタイプの最大3つのSQL文を同時に実行できます。
このタイプの最大2つのSQL文が待機状態のままになります。
ルールは作成後すぐに有効になります。
構文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_stringとcommentの値は表示制限により切り捨てられ、各値の最初の200文字のみが表示されます。 完全な値を表示するには、SELECT * FROM rds_show_current_db_ccl_rule();
ステートメントを実行します。
RDSインスタンスの現在のデータベースに対して作成されたSQLスロットリングルールを照会します。
SELECT * FROM rds_show_current_db_ccl_rule();
SQLスロットリングルールの有効化
シナリオ
次の構文の関数は、プライマリRDSインスタンスでのみ呼び出すことができ、次の操作で使用できます。
構文
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スロットリングを実行できます。
この関数は、次のシナリオで使用できます。
構文
SELECT rds_load_ccl_rule(ccl_id int);
Parameters
パラメーター | データ型 | 説明 |
ccl_id | int | SQLスロットリングルールのID。 SQLスロットリングルールのIDをクエリする方法の詳細については、「SQLスロットリングルールのクエリ」をご参照ください。 |
使用上の注意
プライマリRDSインスタンスでrds_add_ccl_rule
関数を呼び出し、node_tagを2または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の新しい値。 |
new_max_待機中 | int | max_waitingの新しい値。 |
使用上の注意
例
SELECT rds_update_ccl_rule ()
2、-- ccl_id
4、-同時SQL文の新しい最大数は4です。
5 -- 待機中のSQL文の新しい最大数は5です。
);
SQLスロットリングルールの無効化
シナリオ
次の構文の関数は、プライマリRDSインスタンスでのみ呼び出して、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スロットリングの実行に使用できなくなりました。
この関数は、次のシナリオで使用できます。
構文
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値を持ちます。
関数呼び出しのシナリオでは、パラメーターのデータ型が変更された場合、または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行)