GaussDB(DWS)如何熔断垃圾sql语句(1) —— 异常规则简介与演变
1. 前言
- 适用版本:【8.2.0及以上】
本文主要对GaussDB(DWS)的异常熔断规则进行介绍,希望读者阅读本文后,可以对DWS的熔断机制有所了解,对异常规则的原理有初步认知。
2. 背景介绍 - 为什么数据库需要熔断机制?
MPP数据库架构的局限
分布式架构的数据库,为了利用好每个节点的计算能力,会让每个节点都参与计算,例如,执行一个查询语句,集群中每个数据库节点都会存储语句查询的表的相关数据。那么,每个节点都会按照sql的执行计划,查询并计算相应的结果,最后将各个节点的计算结果一起汇总返回给客户端。这样的架构下,只要有一个计算节点成为瓶颈,就算其他节点计算迅速完成,整个查询的最终结果,也要等待这一个节点的结果汇总才能完成。
劣质语句的资源使用影响
这样就会出现一些比较极端的场景下,一个语句占用资源过多,将各个节点或者单个节点上的资源都使用到高水位,造成计算资源或者存储资源不足而产生各种问题。
例如:一个语句需要分配大量内存,导致其他语句都分配不到内存而下盘执行缓慢或者干脆由于分配不到内存而执行失败;或者一个语句执行过程中需要大量计算,占据整个集群CPU的80%+,这样也会导致数据库内其他语句因争抢cpu而变得缓慢迟钝,诸如此类场景很多,每一个都会对业务造成不可估计的影响。
这样的一个语句造成整个集群缓慢甚至不可用的情况,是任何用户都无法接受的。因此,DWS支持配置异常规则功能,可以在语句运行时识别到问题,并将其及时查杀,避免造成更大的影响。
3. DWS的熔断机制 – 异常规则功能简述
异常规则,即用户可以自定义配置的语句运行规则,可以配置一个语句能执行多久,超时则自动查杀掉;可以配置一个语句可以下盘多大,超过阈值则自动查杀,或者配置一个语句能使用多少内存,超过则查杀。
这样的一组规则,配置好了之后能够自动终止几乎所有可能造成集群异常的语句,大大降低许多灵活查询语句的不可控风险,提升DBA们的生活幸福水平。
不同的版本异常规则介绍,怎么用异常规则?
8.1.3及之前版本支持规则列表如下:
规则名称 | 说明 |
---|---|
blocktime | 作业的阻塞时间,单位秒。包括全局并发排队以及局部并发排队的总时间。如果语句中包含子语句,则每个语句排队的时间都计算在内。 |
elapsedtime | 作业的已被执行时间,单位秒。从开始执行到当前所消耗的时间。如果语句中包含子语句,则每个语句执行的时间都计算在内。 |
allcputime | 作业在所有DN上执行时所耗费的CPU总时间,单位秒 |
cpuskewpercent | 作业在DN上执行时的CPU时间的倾斜率,依赖于qualificationtime的设置。 |
qualificationtime | 检查作业执行cpu倾斜率的间隔时间,单位秒,需同cpuskewpercent一起设置。 |
spillsize | 作业在DN上下盘的数据量,单位MB。 |
broadcastsize | 作业在DN上算子大表广播数据量,单位MB。 |
mem_limit | 作业在单实例上使用内存上限,支持设置KB,MB,GB |
规则与用户之间的关联机制
上图意思为,配置规则,要关联到控制组,控制组与资源池一一对应关联。之后将用户关联到资源池。最终就实现了用户受到规则限制的关系。
下面以一个简单用法来说明一下机制。
创建一个依赖于cgroup的控制组,形成内存映射
# gs_ssh -c "gs_cgroup -c -S class1 -G wg1"
创建与控制组绑定的资源池
postgres=# CREATE RESOURCE POOL parent_pool WITH (CONTROL_GROUP="class1");
postgres=# CREATE RESOURCE POOL son_pool WITH (CONTROL_GROUP="class1:wg1");
用户与资源池关联,用户绑定到资源池
postgres=# CREATE USER usrpr1 PASSWORD "Huawei@123" RESOURCE POOL 'parent_pool';
postgres=# CREATE USER usr1 PASSWORD "Huawei@123" RESOURCE POOL 'son_pool' USER GROUP 'usrpr1';
创建异常规则,关联到控制组
# gs_ssh -c "gs_cgroup -S class_a -G workload_a1 -E "blocktime=1200,elapsedtime=2400" -a"
通过上述配置,用户与规则之间形成关联关系。用户执行的语句就会受到规则的限制。
简单说就是,用户与异常规则之间以资源池 - 控制组作为中间桥梁。使得规则能对关联着资源池的用户生效。不同资源池的用户可以配置不同的规则。
使用起来步骤相对比较繁琐,要配置控制组和资源池
功能机制简要说明
- 关联资源池的用户,会在语句执行过程中,读取资源池对应的异常规则信息,并进行各个规则的判断。
- 对于时间类规则会设置一个定时器,当时钟到了语句该结束的时候,如果语句还未结束,则在响应定时器信号之后,再给自己发送一个cancel的信号,让自己在中断处理中退出。
8.2.0版本
规则名称 | 说明 |
---|---|
blocktime | 作业的阻塞时间,单位秒。包括全局并发排队以及局部并发排队的总时间。 |
elapsedtime | 作业的已被执行时间,单位秒。从开始执行到当前所消耗的时间。 |
allcputime | 作业在所有DN上执行时所耗费的CPU总时间,单位秒。 |
cpuskewpercent | 作业在DN上执行时的CPU时间的倾斜率,需要同elapsedtime一同设置。代表作业执行满足elapsedtime时间之后,开始检测作业CPU时间的倾斜率,每5s检测一次。 |
spillsize | 作业在DN上下盘的数据量,单位MB。 |
broadcastsize | 作业在DN上算子大表广播数据量,单位MB。 |
mem_limit | 作业在单实例上使用内存上限,支持设置,单位MB。 |
规则与用户之间的关联机制
使用语法创建异常规则
postgres=# create except rule rule2 with (elapsedtime=10);
CREATE EXCEPT RULE
查看创建结果
postgres=# select * from pg_except_rule;
name | rule | value
-------------+---------------+--------
rule2 | elapsedtime | 10
rule2 | action | abort
(2 rows)
创建任意资源池,资源池关联异常规则 (此处可直接使用默认控制组,也可以根据需要创建对应控制组)
postgres=# create resource pool pool2 with (except_rule='rule2');
CREATE RESOURCE POOL
创建活修改用户与资源池关联,用户绑定到资源池
create user userg1 with resource pool 'pool2' password 'Gauss_234';
CREATE USER
8.2.0版本的机制相对于8.2.0之前版本,减少了对于控制组的依赖,配置和修改也使用数据库语法操作,全程使用库内操作,
无需使用外部shell命令,更为灵活好用。
且用户在没有关联资源池和规则的时候,会有默认规则进行约束,默认不能下盘过多,默认不能使用过多CPU。
机制说明
- 在一个独立常驻线程中,进行每一个语句的资源与执行时间信息的收集和统计,数据处理完毕后,对用户配置好的规则进行阈值对比检查。
- 如果常驻线程发现语句已规则超限,那么在共享内存中记录语句错误信息,之后发送模拟信号使语句发现自身问题,从共享内存读取错误信息之后自行退出。
4. 总结
GaussDB(DWS)的异常规则功能,对于数据库业务平稳运行有着重大的作用,从低版本到高版本,也在进行着稳定性与易用性的提升改进。
- 使用逻辑:
- 以资源池为桥梁,联通用户与规则,使用户的语句受限于规则;
- 检测到规则触发后,以信号的形式让语句自身响应信号时退出.
- 8.2.0版本的改进:
- 不论简单或者复杂语句都会受规则管控,甚至pg_sleep();
- 不同的规则之间可以组合使用,不再是最简单的单一规则一触即死;
- 全程语法配置,无需研究shell命令行的特殊命令;
不过也还存在一些可以进一步改进的点: - 规则是否可以脱离资源池直接与用户绑定?
- 使用信号处理的机制,有少数情况下,信号并不会及时响应?
总而言之,当前功能机制以及规则种类理论上可以满足绝大部分场景,合理使用之后,就可以自动截杀异常查询,维护数据库平安。
- 点赞
- 收藏
- 关注作者
评论(0)