背景
在数据库相关的问题中,经常会遇到并发过高的现象,引发这个现象的原因很多,比如慢查询堆积,业务流量突增等等。通常在面对这一类问题的时候,DBA 会比较被动,常规的手段只有定期批量的 kill 低效查询,直到开发的同学临时调整业务查询或者前端业务限流。
定期批量的 kill 存在较多的问题,例如 kill 的操作不一定能及时杀掉低效查询;定期批量的查询实际上不可能跟得上程序发起查询的速度,本质上数据库仍旧处于 hang 死的状态,业务在持续受损。
针对这一类场景,腾讯云数据库 MySQL 在内核层面实现了一个新的功能:SQL 限流,并封装在 DBbrain中,灵活使用这个功能可以快速有效的应对这一类问题。
功能入口
进入数据库智能管家DBbrain的主控制台,页面如下所示:
进入实时会话页面之后,可以看到有 SQL 限流的这个功能 tab:
SQL 限流任务的详细配置界面如下图:
主要几个选项的作用如下:
- SQL 类型:可以进行限流的 SQL 类型,包括 select,delete,update,insert,replace。
- 最大并发数:可以正常执行受限 SQL 的连接数。
- 执行方式:一定时长之后自动关闭;或者是一直持续,直到手动关闭。
- 限流时间:自动关闭前持续的时间,最大为 1440 分钟。
- SQL 关键字:被限流的 SQL 语句关键字,可以使用表名,或者是 SQL 文本的一部分。
需要注意的是,最大并发数指的是连接数,而不是 QPS,因此这个限制并不能非常有效的控制住整体的 QPS,如果本身 SQL 的执行效率很高,那么即使并发数限制到 1,整体的 QPS 可能也不会降到非常低。
实际效果
为了验证一下实际的效果,本次测试使用腾讯云数据库 MySQL 5.7 的最新版,并使用腾讯云的云服务器部署 sysbench 客户端,使用 read_only 的测试模型来模拟业务访问压力。持续一段时间之后,sysbench 的输出数据如下:
代码语言:txt复制[ 100s ] thds: 24 tps: 616.50 qps: 8633.22 (r/w/o: 8633.22/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
[ 110s ] thds: 24 tps: 620.00 qps: 8678.82 (r/w/o: 8678.82/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 120s ] thds: 24 tps: 620.38 qps: 8689.77 (r/w/o: 8689.77/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 130s ] thds: 24 tps: 620.81 qps: 8686.73 (r/w/o: 8686.73/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 140s ] thds: 24 tps: 617.70 qps: 8652.90 (r/w/o: 8652.90/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
[ 150s ] thds: 24 tps: 611.00 qps: 8549.66 (r/w/o: 8549.66/0.00/0.00) lat (ms,95%): 41.85 err/s: 0.00 reconn/s: 0.00
[ 160s ] thds: 24 tps: 614.50 qps: 8604.52 (r/w/o: 8604.52/0.00/0.00) lat (ms,95%): 41.10 err/s: 0.00 reconn/s: 0.00
[ 170s ] thds: 24 tps: 619.29 qps: 8670.92 (r/w/o: 8670.92/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 180s ] thds: 24 tps: 619.71 qps: 8672.68 (r/w/o: 8672.68/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
这里针对所有 sbtest 表的查询,设置 1 分钟的限流,且并发数为 1:
设置完之后看一下实际的效果:
代码语言:txt复制[ 240s ] thds: 24 tps: 620.71 qps: 8690.32 (r/w/o: 8690.32/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 250s ] thds: 24 tps: 619.50 qps: 8669.86 (r/w/o: 8669.86/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 260s ] thds: 24 tps: 620.20 qps: 8683.36 (r/w/o: 8683.36/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 270s ] thds: 24 tps: 612.60 qps: 8582.43 (r/w/o: 8582.43/0.00/0.00) lat (ms,95%): 41.85 err/s: 0.00 reconn/s: 0.00
[ 280s ] thds: 24 tps: 618.31 qps: 8650.48 (r/w/o: 8650.48/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
[ 290s ] thds: 24 tps: 619.40 qps: 8671.66 (r/w/o: 8671.66/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
[ 300s ] thds: 24 tps: 618.59 qps: 8664.02 (r/w/o: 8664.02/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
[ 310s ] thds: 24 tps: 619.61 qps: 8671.11 (r/w/o: 8671.11/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 320s ] thds: 24 tps: 264.90 qps: 6586.44 (r/w/o: 6586.44/0.00/0.00) lat (ms,95%): 376.49 err/s: 2246.51 reconn/s: 0.00
[ 330s ] thds: 24 tps: 52.30 qps: 5346.70 (r/w/o: 5346.70/0.00/0.00) lat (ms,95%): 1648.20 err/s: 3503.80 reconn/s: 0.00
[ 340s ] thds: 24 tps: 54.10 qps: 5452.58 (r/w/o: 5452.58/0.00/0.00) lat (ms,95%): 1352.03 err/s: 3456.59 reconn/s: 0.00
[ 350s ] thds: 24 tps: 54.60 qps: 5416.30 (r/w/o: 5416.30/0.00/0.00) lat (ms,95%): 1427.08 err/s: 3521.60 reconn/s: 0.00
[ 360s ] thds: 24 tps: 53.20 qps: 5383.31 (r/w/o: 5383.31/0.00/0.00) lat (ms,95%): 1648.20 err/s: 3565.41 reconn/s: 0.00
[ 370s ] thds: 24 tps: 56.60 qps: 5580.50 (r/w/o: 5580.50/0.00/0.00) lat (ms,95%): 1327.91 err/s: 3376.50 reconn/s: 0.00
[ 380s ] thds: 24 tps: 434.60 qps: 7581.38 (r/w/o: 7581.38/0.00/0.00) lat (ms,95%): 42.61 err/s: 1178.20 reconn/s: 0.00
[ 390s ] thds: 24 tps: 612.80 qps: 8581.10 (r/w/o: 8581.10/0.00/0.00) lat (ms,95%): 41.10 err/s: 0.00 reconn/s: 0.00
[ 400s ] thds: 24 tps: 616.19 qps: 8631.43 (r/w/o: 8631.43/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
[ 410s ] thds: 24 tps: 620.09 qps: 8680.52 (r/w/o: 8680.52/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 420s ] thds: 24 tps: 620.40 qps: 8685.16 (r/w/o: 8685.16/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
[ 430s ] thds: 24 tps: 619.01 qps: 8662.79 (r/w/o: 8662.79/0.00/0.00) lat (ms,95%): 40.37 err/s: 0.00 reconn/s: 0.00
[ 440s ] thds: 24 tps: 619.10 qps: 8667.34 (r/w/o: 8667.34/0.00/0.00) lat (ms,95%): 39.65 err/s: 0.00 reconn/s: 0.00
可以看到在 sysbench 侧,出现大量的 err,QPS 下降了约 35%,且平均延迟的 95 分位出现了巨幅的增长,持续 1 分钟之后就马上恢复正常了。限流结束之后,DBbrain 可以看到实际限制的详情:
拓展一下
实际上,稍微研究一下就会发现,这个 SQL 限流的设置页面,可以把并发数设置到 0,例如:
那么在实际生效的前后,对比一下差异:
代码语言:txt复制mysql> delete from sbtest.sbtest1 where id = 1;
Query OK, 1 row affected (0.01 sec)
mysql> delete from sbtest.sbtest1 where id = 1;
ERROR 5001 (HY000): SQL rejected by CDB_SQL_FILTER
mysql>
可以看到生效之后,delete 的行为直接被拒绝了,这时候看一下 DBbrain 的限制详情:
因此这个功能,在需要限制某些表的某些操作的时候,可以作为 SQL 防火墙来使用,比如像这个例子中一样,限制 sbtest 表上的所有 delete 操作。
总结一下
DBbrain 作为默认免费提供的服务,能极大的提升用户排查腾讯云数据库 MySQL 问题的效率,并及时发现和解决大量的隐患,可以多去了解一下其中的功能。
DBbrain 是什么?
数据库智能管家(TencentDB for DBbrain,DBbrain)是腾讯云推出的一款为用户提供数据库性能优化、安全、管理等功能的数据库自治云服务。
DBbrain 利用机器学习、大数据手段、专家经验引擎快速复制资深数据库管理员的成熟经验,将大量传统人工的数据库运维工作智能化,服务于云上和云下企业,有效保障数据库服务的安全、稳定及高效运行。