【DB吐槽大会】第74期 - PG 不支持SQL维度资源限流

简介: 大家好,这里是DB吐槽大会,第74期 - PG 不支持SQL维度资源限流

背景


1、产品的问题点

  • PG 不支持SQL维度按资源限流的功能

2、问题点背后涉及的技术原理

  • 用户发起SQL, SQL按执行计划execute过程中消耗CPU、IOPS、存储带宽、网络带宽等.

3、这个问题将影响哪些行业以及业务场景

  • 通用

4、会导致什么问题?

  • SQL执行计划异常(使得SQL更加耗费资源)、请求数暴增等发生时:
  • 当资源够用时, 不会对业务有什么影响.
  • 当资源不够用时, 将影响业务, 严重时雪崩.

5、业务上应该如何避免这个坑

  • 可以设置用户、db、全局的 statement timeout.
  • 不友好, 因为不能针对sql设置, 而不同的sql有的本身执行就很快(例如KV类查询), 有的本身就慢(例如复杂JOIN), 如果设置统一的语句超时值, 不能适应所有的sql.
  • 效果较差, 甚至不可行. 除非在事务中针对每条SQL执行前设置statement timeout, 这样可以控制每条SQL的超时.

6、业务上避免这个坑牺牲了什么, 会引入什么新的问题

  • 在事务中针对每条SQL执行前设置statement timeout, 控制每条SQL的超时.
  • 使得开发复杂度增加, 同时需要预估SQL的执行耗时,
  • 一旦系统或业务变更导致SQL无法按原有预期执行完就会导致超时报错, 带入了人为故障的大概率.

7、数据库未来产品迭代如何修复这个坑

  • 目的: 防止雪崩、防止某些业务或个人提交某些sql把资源耗尽.
  • 期望: 内核支持:
  • 比较理想的状态是和SQL执行计划评估出的代价挂钩, 可以用系数来进行设置, 如增加statement_timeout_cost参数, 例如代价和耗时为1000:1ms的关系, 那么代价是2500的SQL, 超时设置为2.5毫秒.
  • 还有一种设置方法是白名单、黑名单方式: 在白名单中的SQL, 一对一的设置SQL的超时时间. 不在白名单中的SQL设置统一的超时、或者使用以上系数法.
  • 除了超时, 实际上还可以通过资源消耗阈值来进行控制, 对于同样的query id的SQL, 在一个周期内, 限定其CPU timing 、IOPS 、存储带宽、网络, 这种方法与cgroup挂钩或者内部有rsq的功能来进行支持.
  • 最后, 还可以按query id来限定QPS(例如sql1: qps上限10000, sql2: qps上线1000). 超出qps的请求进入队列, 队列超过一定长度后报错丢弃.



相关文章
|
7月前
|
SQL 关系型数据库 分布式数据库
使用DAS实现数据库自动SQL限流
本场景主要介绍如何使用DAS提供SQL限流功能,通过自动SQL限流来控制数据库请求访问量和SQL并发量,保障服务的可用性。
133 0
|
7月前
|
SQL 关系型数据库 MySQL
|
8月前
|
SQL 前端开发 关系型数据库
pg库实现sql行转列
这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况。列转行问题同样也很常见。
225 0
pg库实现sql行转列
|
SQL JSON 前端开发
|
SQL 缓存 大数据
以小博大外小内大,Db数据库SQL优化之小数据驱动大数据
SQL优化中,有一条放之四海而皆准的既定方针,那就是:永远以小数据驱动大数据。其本质其实就是以小的数据样本作为驱动查询能够优化查询效率,在SQL中,涉及到不同表数据的连接、转移、或者合并,这些操作必须得有个数据集作为“带头”大哥,即驱动数据,而这个驱动数据最好是数据量最小的那一个。
以小博大外小内大,Db数据库SQL优化之小数据驱动大数据
|
SQL 存储 关系型数据库
Navicat for MySQL资源分享和下载以及SQL文件的导入导出
Navicat for MySQL资源分享和下载以及SQL文件的导入导出
448 0
Navicat for MySQL资源分享和下载以及SQL文件的导入导出
查看MS SQL最耗时间资源的SQL
查看MS SQL最耗时间资源的SQL
|
SQL Java 数据库连接
不受支持的SQL类型1111
不受支持的SQL类型1111
283 0
|
SQL 运维 监控
集群运维2:监控、SQL限流与索引优化 | 学习笔记(2)
快速学习集群运维2:监控、SQL限流与索引优化
268 0
集群运维2:监控、SQL限流与索引优化 | 学习笔记(2)