本文共 1453 字,大约阅读时间需要 4 分钟。
高水位限流实现:
监控系统status变量threads_running,当满足拒绝条件,拒绝执行sql,返回用户:MySQL Server is too busy,判断逻辑在dispatch_command中,sql解析之后。 增加的系统variables:threads_running_ctl_mode: 限流的sql类型,有两个取值:[ALL | SELECTS],默认SELECTS,设置为ALL需谨慎。
threads_running_high_watermark: 限流水位值,只有threads_running超过此值才会触发,默认值为max_connections,当set global threads_running_high_watermark=0时自动设置为max_connections。
拒绝必要条件:
threads_running超过threads_running_high_watermark。
threads_running_ctl_mode与sql类型相符。
以下情况不拒绝:
用户具有super权限。
sql所在事务已经开启。
sql为commit/rollback。
阿里云的RDS已经集成了阿里秒杀场景下的参数优化,所以如果你的应用场景中具有大量并发更新同一行记录的场景,你可以打开数据库的限流参数:threads_running_ctl_mode和threads_running_high_watermark来保护数据库,让你的数据库平稳过渡。下面我们来看一则生产案例。
从上图中看到该数据库的活跃连接数最高的时候到达了1W,通过show processlist可以看到大量的并发更新。
我们来看一下数据库并发更新的TPS有多大:
可以看到数据库中的活跃连接数非常高,每秒的update非常不稳定。
我们在把限流开关打开后看一下性能表现:
从上图可以明显观察到,通过打开数据库的限流开关,数据库的活跃连接数在300左右,同时数据库的TPS也没有再出现很大的波动,这样很好地保护住了DB。
作者介绍 罗龙九
玄惭,阿里云资深DBA专家;
有着丰厚的DBA经验,经历阿里历年双11考验,保持着“无一丢单”的优异纪录。同时积累了6年对阿里云数据库用户的运维、调优、诊断等丰富的经验。
转载地址:http://daebm.baihongyu.com/