云数据库 PostgreSQL SQL 限流

检查 shared_preload_libraries 参数中已经加入 tencentdb_sql_throttlingpostgres=> show shared_preload_libraries; shared_preload_libraries ———————————————————————————–。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

使用限制

创建插件

创建 tencentdb_sql_throttling 插件,并检查创建完成:

postgres=> create extension tencentdb_sql_throttling;
CREATE EXTENSION
postgres=> select * from pg_extension where extname='tencentdb_sql_throttling'; oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition ——-+————————–+———-+————–+—————-+————+———–+————– 16415 | tencentdb_sql_throttling | 16385 | 2200 | t | 1.0 | | (1 row)

新增限流规则

云数据库 PostgreSQL 支持通过 query_id 和 SQL 来新增限流规则。其中 query_id 是内核将 query 语句规范化后哈希得到的64位整数,是一个用于标识查询的唯一标识符,更多 query_id 的详细说明请参考 产品文档。

一、通过 query_id 新增限流规则

如你需要获取 SQL 语句的 query_id,你可通过查询 pg_stat_statements 或 pg_stat_activity 得到。这篇是通过查询 pg_stat_activity 得到。

postgres=> select datname,usename,client_addr,state,query_id,query from pg_stat_activity where usename='dbadmin' and client_addr='172.16.76.48' limit 10; datname | usename | client_addr | state | query_id | query ———-+———+—————+——–+——————–+——————————– postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 1 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 53 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 54 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 4 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 52 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 51 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 7 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 10 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 11 postgres | dbadmin | 172.16.76.48 | active | 497939862935121343 | SELECT id FROM t WHERE id = 8
(10 rows)

在获取到 query_id 之后,我们可基于 query_id 新增限流规则。云数据库 PostgreSQL 提供了一个函数供你使用,函数定义如下:

tencentdb_sql_throttling.add_rule_with_queryid( queryid bigint, work_node int, max_concurrency int, is_enabled boolean, memory_only boolean, query_string text );

add_rule_with_queryid 函数的参数解释如下:

注意:说明:

·work_node:限流规则生效的节点,0表示主实例和只读实例都生效,1表示只有主实例生效,2表示只有只读实例生效;

·max_concurrency:该限流规则允许的最大并发数量;

·is_enabled:当前规则是否生效;

·memory_only:可选,是否需要将规则持久化到表中,重启或者 HA 后可使用命令重新将规则加载进内存以生效;

·query_string:可选,可以将 query 语句加入规则中,此时不对此 query_string 计算 queryid 进行校验,该限流规则以 queryid 为准。若不提供此参数,内核将自动在 pg_stat_statements 视图中查找该 queryid 对应的 sql 语句,并将结果记录在该规则中。SQL 限流示例如下 SQL 限流示例如下:

postgres=> SELECT tencentdb_sql_throttling.add_rule_with_queryid(497939862935121343,0,10,true); add_rule_with_queryid ———————–
(1 row)

二、通过 SQL 语句新增限流规则

注意:说明:

云数据库 PostgreSQL 提供了限流的函数供你使用,函数定义如下:

tencentdb_sql_throttling.add_rule_with_query( query_string text, work_node int, max_concurrency int, is_enabled boolean, memory_only boolean)

add_rule_with_query 函数的参数解释如下,该函数返回值为限流的 SQL 语句的 query_id:

注意:说明:

SQL 限流示例如下:

postgres=# select tencentdb_sql_throttling.add_rule_with_query('select pg_sleep(1);',0,1,true); add_rule_with_query ———————- -3416356442043621232(1 row)

限流规则设置完成后可查看限流规则,请参考 查看限流规则。

删除限流规则

三、通过 query_id 删除规则

在获取到 query_id 之后,我们可基于 query_id 删除限流规则。云数据库 PostgreSQL 提供了一个函数供你使用,函数定义如下:

tencentdb_sql_throttling.drop_rule( queryid bigint, memory_only boolean);

drop_rule 函数的参数解释如下:

注意:说明:

删除示例如下:

postgres=> SELECT tencentdb_sql_throttling.drop_rule(497939862935121343,true);
-[ RECORD 1 ]
drop_rule |

当需要删除某些没有加载到内存中的 SQL 限流规则时,你可直接删除持久化表格中对应的 SQL 限流规则数据即可。

四、删除所有规则

当你需要删除所有 SQL 限流规则时,云数据库 PostgreSQL 提供了一个函数供你使用,函数定义如下:

tencentdb_sql_throttling.drop_all_rules( memory_only boolean);

drop_all_rules 函数的参数解释如下:

注意:说明:

删除示例如下:

postgres=> select tencentdb_sql_throttling.drop_all_rules(true); drop_all_rules —————- (1 row)

加载限流规则

加载限流规则是指将存储在磁盘中的 SQL 限流规则加载到内存中,并使之生效。

五、通过 query_id 加载限流规则

在获取到 query_id 之后,我们可基于 query_id 加载限流规则。云数据库 PostgreSQL 提供了一个函数供你使用,函数定义如下:

tencentdb_sql_throttling.load_rule(queryid bigint);

load_rule 函数的参数解释如下:

注意:说明:

注意:queryid:将 query 语句规范化后哈希得到的64位整数,可通过 pg_stat_statements 或 pg_stat_activity 查询得到;

加载示例如下:

postgres=> SELECT tencentdb_sql_throttling.load_rule(497939862935121343);
-[ RECORD 1 ]
load_rule | postgres=> SELECT * FROM tencentdb_sql_throttling.rules;
-[ RECORD 1 ]——-+———————————–
queryid | 497939862935121343
work_node | 0
max_concurrency | 10
is_enabled | t
query_string | SELECT id FROM t WHERE id = 594017
current_concurrency | 10
total_hit_count | 4760
reject_count | 4713
postgres=>

六、加载所有限流规则

当你需要加载所有限流规则时,云数据库 PostgreSQL 提供了一个函数供你使用,函数定义如下:

tencentdb_sql_throttling.load_all_rules();

加载示例如下:

postgres=> select tencentdb_sql_throttling.load_all_rules(); load_all_rules —————- (1 row)

持久化限流规则

持久化是指在将内存中的 SQL 限流规则存储到表格中,以便后续可以直接加载生效,不需要重新设置。

七、通过 query_id 持久化限流规则

在获取到 query_id 之后,我们可基于 query_id 持久化限流规则。云数据库 PostgreSQL 提供了一个函数供你使用,函数定义如下:

tencentdb_sql_throttling.dump_rule(queryid bigint);

dump_rule 函数的参数解释如下:

注意:说明:

注意:queryid:将 query 语句规范化后哈希得到的64位整数,可通过 pg_stat_statements 或 pg_stat_activity 查询得到;

持久化示例:

postgres=> select tencentdb_sql_throttling.dump_rule(440101247839410938); dump_rule ———– (1 row)

八、持久化所有限流规则

如你需要持久化所有的限流规则,云数据库 PostgreSQL 提供了一个函数供你使用,函数定义如下:

tencentdb_sql_throttling.dump_all_rules();

持久化所有 SQL 限流规则示例:

postgres=> select tencentdb_sql_throttling.dump_all_rules();; dump_all_rules —————- (1 row)

如果已持久的规则被再次持久化会报错,请知悉,具体报错如下所示。

postgres=> SELECT tencentdb_sql_throttling.dump_all_rules();
NOTICE: duplicate key value violates unique constraint "persistent_rules_table_pkey"
NOTICE: duplicate key value violates unique constraint "persistent_rules_table_pkey" dump_all_rules —————-
(1 row)

查看限流规则

你可以使用 SQL 语句SELECT * FROM tencentdb_sql_throttling.rules;来查看当前内存中的限流规则,输出的字段解释如下:

注意:说明:

查看内存中的限流规则示例:

postgres=> SELECT * FROM tencentdb_sql_throttling.rules;
-[ RECORD 1 ]——-+——————————–
queryid | 497939862935121343
work_node | 0
max_concurrency | 10
is_enabled | t
query_string | SELECT id FROM t WHERE id = 553
current_concurrency | 0
total_hit_count | 91
reject_count | 81
postgres=>

你可以使用 SQL 语句SELECT * FROM tencentdb_sql_throttling.persistent_rules_table;来查看当前存储中的限流规则,输出的字段解释如下:

注意:说明:

查看持久化到表格中的规则示例:

postgres=> SELECT * FROM tencentdb_sql_throttling.persistent_rules_table;
-[ RECORD 1 ]—+———————————–
queryid | 497939862935121343
work_node | 0
max_concurrency | 10
is_enabled | t
query_string | SELECT id FROM t WHERE id = 594017

修改限流规则

云数据库 PostgreSQL 提供了函数 change_rule_status 来修改限流规则,函数定义如下:

tencentdb_sql_throttling.change_rule_status( queryid bigint, is_enabled boolean, max_concurrency int);

函数参数解释如下:

注意:说明:

修改示例:

postgres=> select tencentdb_sql_throttling.change_rule_status(440101247839410938,true,300); change_rule_status ——————– (1 row)

当系统出现异常,你可以调用 change_rule_current_concurrency 函数来手动修改某个规则的当前并发数,保障规则继续运行,函数定义如下:

tencentdb_sql_throttling.change_rule_current_concurrency( queryid bigint, new_currenct_concurrency int);

change_rule_current_concurrency 参数说明如下:

注意:说明:

调用示例如下:

postgres=> SELECT tencentdb_sql_throttling.change_rule_current_concurrency(497939862935121343,20);
-[ RECORD 1 ]——————-+-
change_rule_current_concurrency | postgres=> SELECT * FROM tencentdb_sql_throttling.rules;
-[ RECORD 1 ]——-+——————————–
queryid | 497939862935121343
work_node | 0
max_concurrency | 10
is_enabled | t
query_string | SELECT id FROM t WHERE id = 553
current_concurrency | 20
total_hit_count | 286028
reject_count | 283788
postgres=>

修改规则生效状态且增加并发数,生效:

postgres=> SELECT * FROM tencentdb_sql_throttling.rules;
-[ RECORD 1 ]——-+——————————–
queryid | 497939862935121343
work_node | 0
max_concurrency | 10
is_enabled | t
query_string | SELECT id FROM t WHERE id = 553
current_concurrency | 20
total_hit_count | 286028
reject_count | 283788
postgres=> SELECT tencentdb_sql_throttling.change_rule_status(497939862935121343,false,20);
-[ RECORD 1 ]——+-
change_rule_status | postgres=> SELECT * FROM tencentdb_sql_throttling.rules;
-[ RECORD 1 ]——-+——————————–
queryid | 497939862935121343
work_node | 0
max_concurrency | 20
is_enabled | f
query_string | SELECT id FROM t WHERE id = 553
current_concurrency | 20
total_hit_count | 358931
reject_count | 356691

赞 (0)
上一篇 4天前
下一篇 4天前