GaussDB(DWS)运维 -- 资源管理SQL白名单语句
1. 现网场景
某客户现网出现连接数不足的报错,查看语句执行状态视图pgxc_stat_activity,发现大量简单语句‘select 1’处在等待状态(waiting in ccn queue)状态
2. 根因分析
2.1 'select1'从哪里来
外部业务经常使用连接池连接数据库,连接池负责数据库连接管理,业务向连接池申请数据库连接。通常情况下连接池会管理足够多的空闲连接,然后连接池会定期检测连接的可用性,检测的方式就是向数据发送一个简单语句(一般为'select 1'或者'SELECT 1'),如果执行OK,则说明此连接时有效的,如果执行失败则连接池会丢弃这个连接,并创建新的连接来代替。
2.2 为啥会阻塞
当集群因为内存资源或者并发数达到上限出现作业排队(waiting in global queue/waiting in respool queue/waiting in ccn queue中的任意状态)时,后续执行的SQL可能会出现在等待队列中。如果当前的处于执行状态的SQL语句时间比较长,那么等待队列中的SQL就会堆积的越来也多,甚至导致集群连接数撑爆,导致客户端报错。
针对连接池的场景,因为连接池可能缓存了大量连接,加上连接池的连接探活机制,可能导致大量的select1 查询,导致此问题更严重
3. 检测方案
SELECT DISTINCT query
FROM pgxc_stat_activity
WHERE query ilike 'select 1%'
AND NOT EXISTS (SELECT 1 FROM gs_wlm_sql_allow AS t(query) WHERE query ILIKE '%select 1%');
4. 解决方案
针对这种场景,DWS的资源管理模块提供了SQL白名单机制,在白名单中的SQL语句不受资源管理监控,简单的说就是白名单中的语句可以不受队列限制的方式执行,一般用于一些业务前置的简单逻辑语句执行。DWS使用参数wlm_sql_allow_list的方式让客户自定义SQL白名单
- wlm_sql_allow_list中可指定一条或多条SQL白名单语句,指定多条时,通过";"进行分隔。
- 系统通过前置匹配判断SQL语句是否受监控,不区分大小写,例如:wlm_sql_allow_list='SELECT',则所有select语句均不受资源管理监控。
- 识别参数值白名单字符串头部的空格,例如:'SELECT'与' SELECT'的含义是不一致的,或者会过滤头部带空格的SELECT语句,前者不会。
- 系统默认部分SQL语句为白名单语句,默认白名单语句不可修改;可以通过系统视图gs_wlm_sql_allow查询默认和已经通过GUC设置成功的SQL白名单语句。
- 通过wlm_sql_allow_list指定的SQL语句不可追加,只能通过覆盖的方式设置;若需追加SQL语句,需要先查出原先指定的GUC值,在原值后面加补上新增的语句,以";"分隔后重新设置。
针对当前客户场景,修改配置参数wlm_sql_allow_list
- 当wlm_sql_allow_list为空时,wlm_sql_allow_list='select 1'即可
- 当wlm_sql_allow_list不为空时,在当前配置值后面追加';select 1'即可
- 点赞
- 收藏
- 关注作者
评论(0)