加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_常德站长网 (https://www.0736zz.com/)- 媒体处理、CDN、边缘计算、网络安全、物联网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL网关运维实战:36小时稳如磐石

发布时间:2026-10-21 14:18:47 所属栏目:MySql教程 来源:DaWei
导读:  去年一月份那场MySQL网关宕机,现在想起来手心还冒汗。凌晨三点监控报警,主库读写延迟飙到3秒,应用层开始堆连接池——这场景我熟,八成又是网关的连接池泄漏。但这次不一样,重启网关进程后延迟没降,主库CPU反而直接打满,

  去年一月份那场MySQL网关宕机,现在想起来手心还冒汗。凌晨三点监控报警,主库读写延迟飙到3秒,应用层开始堆连接池——这场景我熟,八成又是网关的连接池泄漏。但这次不一样,重启网关进程后延迟没降,主库CPU反而直接打满,连慢查询日志都刷不出来。我原以为只是普通的连接泄漏,结果用pt-mysql-summary一看,好家伙,线程池里卡着200多个未释放的连接,全堵在`auth_plugin_check`这个破函数上。

  车间那台风扇一直在响,我蹲在机柜前拆网关的日志组件。旁边老张抖着腿说:“这破型号的日志驱动,去年就出过类似问题。”我没接话,手套上那块硬掉的胶硌得手指疼——那是上周修K8s节点时沾的环氧树脂。手机在铁台上震了一下,是媳妇发的消息,我扫了眼又塞回兜里。拆到第三层日志过滤模块时,发现`log_slow_admin_statements`参数被设成了ON,这参数平时根本没人动,除非…除非有人手欠在配置中心改了全局变量。

文章配图,仅供参考

  其实我也没拆到底。主库的CPU占用像坐了火箭,我让运维先切备库,结果备库的半同步复制卡在`COMMIT`阶段——备库的binlog线程早挂了,但主库还在傻等ACK。这时候我想起上个月看的《MySQL网关运维实战:36小时稳如磐石》,书里专门提过“半同步复制超时参数要设成异步的2倍”。我翻出配置,果然,`rpl_semi_sync_master_timeout`还是默认的10秒,而`rpl_semi_sync_master_wait_for_slave_count`设成了2——备库就1台,这参数设得比脑子还硬。

  中午盒饭里有块姜,我挑出来扔在桌上。老张凑过来看我改参数:“这书你真信?去年他们说‘36小时稳如磐石’,结果我们用了三个月,网关的连接池泄漏率比之前高了40%。”我咬着筷子没说话。书里确实提过“连接池泄漏的排查优先级低于慢查询”,但没提怎么防——我们后来自己加了段Lua脚本,在连接释放前检查`SHOW PROCESSLIST`里有没有僵尸线程,这才把泄漏率压到0.1%以下。这个型号我只在别人那儿见过,他们用ProxySQL,说比我们自研的网关稳,但ProxySQL的规则引擎太黑盒,出了问题连日志都抓不全。

  改完参数,主库CPU降到了20%,但连接池还是卡着50多个连接。我让运维执行`FLUSH LOGS`,结果备库的binlog线程突然活了,复制延迟从3小时直接清零。这时候谁把扳手掉地上了一声闷响,我吓了一跳,手套上的胶蹭到了键盘上。老张在旁边笑:“你手抖得跟新手似的。”我白了他一眼,继续查连接泄漏的源头——原来是应用层有个定时任务,每10分钟执行一次`SHOW FULL PROCESSLIST`,但没加`WHERE COMMAND != 'Sleep'`,结果把所有空闲连接都抓进了结果集,网关的连接池监控线程误以为这些连接在活跃使用,死活不释放。

  这个我敢打包票,90%的连接泄漏都是这种“假活跃”导致的。但书里没提怎么防,只说“要监控连接池状态”。我们后来在网关里加了段代码,对`SHOW PROCESSLIST`的结果做二次过滤,只统计`COMMAND in ('Query', 'Execute')`的连接,这才把泄漏率压到零。修完我自己都没底,让运维模拟了1000个并发连接,观察了2小时,连接池确实没再涨。但老张说:“这书里说的‘36小时稳如磐石’,我看是运气好——要是遇到主从切换+连接泄漏+半同步复制卡死,你看它稳不稳。”

  下午开会时,运维总监说:“这次故障影响面不大,但暴露了三个问题:一是配置管理太松散,二是监控粒度不够细,三是应急预案没覆盖半同步复制卡死的场景。”我低头看手机,媳妇又发了条消息,我没回。其实我知道,这三个问题书里都提过,但没人当回事——大家都觉得“我们用了书里的方案,肯定稳”。可现实是,书里的方案是“通用解”,我们的环境是“定制题”,照搬只会死得更惨。

  现在回头看,《MySQL网关运维实战:36小时稳如磐石》站得住的地方,是它提了“优胜劣汰”——不是所有方案都适合所有场景,得根据自己的环境调。比如书里说“连接池最大连接数设成CPU核心数的2倍”,但我们测试后发现,设成1.5倍更稳,因为我们的应用层有大量短连接,设高了反而容易触发连接泄漏。这个我说不准,要看运气——有的团队设成2倍也没事,有的团队设成1.2倍就炸了。运维这行,没有“绝对稳”,只有“相对稳”。

  明天我打算把书里的“半同步复制超时参数”那章再读一遍,顺便把我们的Lua脚本优化下——现在它每5秒检查一次连接状态,我想改成动态调整检查间隔,根据连接池的使用率自动缩放。老张说:“别折腾了,现在这样已经够稳了。”我笑了笑,没说话。稳不稳,不是靠嘴说的,是靠故障堆出来的。下次再遇到类似问题,我希望自己能比这次反应更快——至少,别再让媳妇等消息等到凌晨四点。

(编辑:应用网_常德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!