加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.haoxinwen.cn/)- 应用程序、AI行业应用、CDN、低代码、区块链!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL高可用架构实战:5年工程师的自动容灾设计

发布时间:2026-10-24 11:08:26 所属栏目:MySql教程 来源:DaWei
导读:  凌晨三点零七分,告警钉钉弹窗在手机上炸开第三波的时候,我正蹲在机房门口啃半凉的韭菜鸡蛋馅儿饺子——DBA老张刚把最后一口咽下去,筷子头还沾着油星,说“主库心跳断了”,然后转身去拧空调面板旋钮,嗡的一声,冷风突然压

  凌晨三点零七分,告警钉钉弹窗在手机上炸开第三波的时候,我正蹲在机房门口啃半凉的韭菜鸡蛋馅儿饺子——DBA老张刚把最后一口咽下去,筷子头还沾着油星,说“主库心跳断了”,然后转身去拧空调面板旋钮,嗡的一声,冷风突然压过他后颈上那圈汗毛。


  我原以为得手动切VIP、改DNS、敲三遍pt-heartbeat确认延迟,结果脚本自己跑了。不是那种“运行中”的虚报,是真的跑完了:MGR节点状态刷成PRIMARY,proxySQL路由表重载成功,连应用侧的MySQLConnectionPool都清掉了旧连接。我盯着监控看十七秒,它没抖,没回滚,没卡在half-sync里——就是干干净净切过去了。对面工位后端小李换了一双灰拖鞋,左脚带个破洞,右脚完好,他没抬头,但键盘敲得比平时快两档。


  优胜劣汰。不是喊口号,是物理层面真把弱节点踹出去了。上周三下午那个从不报错的从库,IO线程卡在repl_semi_sync_master_status=OFF整整四十二分钟,没人动它,也没人加白名单,就让它自己挂在那里等超时。我们配置的是120秒自动驱逐,它撑到一百一十九秒半,才被MGR投票踢出集群。我敢打包票:它被踢前那一秒,show slave status里Seconds_Behind_Master还显示为0——假健康,比真宕机更恶心。但系统认的是逻辑一致性,不是数字漂绿。


  咖啡洒在工牌上了,褐色圆渍正好盖住“高级开发工程师”那行字。保洁阿姨推着桶过来擦地时顺手问了一句“又通宵?”,我没答,她手机响了一声,没接,直接塞回围裙兜里。那会儿我在查binlog_pos跳变点,SSH连的是jump-box,输密码——按两次回车键,中间卡顿了一下,因为keychain弹了个授权框;再ssh -p 2222进中控,cd /opt/mysql-failover/scripts/;执行./check_cluster_state.sh之前,先ps aux | grep 'failover_guard',看它是不是还在活着吃CPU。它活着。于是我才点回车。就这三步,写了三行命令,拆开了讲——但后面那个跨机房DNS预热动作,我其实只写了半句注释:“// 若异地机房未同步则fallback至LVS权重降权”。这事我真说不准,文档里写的和实际跑出来的不是一回事。


  去年十一月那场雪夜故障,核心问题根本不是主库崩了——是备份机房的relay-log应用线程,在雪融水渗进空调排水管之后,默默卡在Read_event_from_binlog环节不动弹,卡了六小时四十分钟。没人发现,因为监控里它还在report heartbeat。直到那天早上九点,订单号开始重复生成,财务部打电话来骂人。老板把我叫进小会议室,我摊开笔记本,第一句话是:“我们停掉自动容灾三个月,行不行?”他没说话,掏出烟盒但没点,只是用指甲刮烟盒侧面的锡纸,刮得哗啦响。我后来说错了——不该停三个月,该停两周,用这两周人工拉一次failover流水账,把每条日志、每个超时阈值、每次network partition下的表决过程全打成表格贴墙上。现在墙上什么都没有,只有我上次值班写的临时便签:“调休申请驳回理由:‘连续三个工作日无补班安排’——可我哪来的三个工作日?我上周四还在杭州机场改PPT,落地是凌晨一点。”


  最邪门的是那个never-ack的slave。它从来不发ack,也不主动报dead,就坐在那里假装活着。我们最后把它删了,用mysqldump导出再reload,导入中途它自己连上来了,show processlist里出现一个User字段是'replication'、Host是空、db是NULL的状态。DBA老张截图发群里问:“这是ghost还是bug?”没人回。十分钟后它又消失了。到现在也没查明白。


文章配图,仅供参考

  别信什么“全链路可观测”,我见过的告警里,三百七十二条,真正有用的是二十三条——其余全是噪音,或者更糟,是伪阳性的镇定剂。你信监控,它就教你怀疑自己;你信日志,它就给你塞一堆DEBUG级的无效上下文;你信代码,它就把sleep(3)写在prepare阶段里,还注释“防并发冲突”。所以现在我改策略了:每周五下午,我把所有自动容灾相关脚本的logrotate周期调短到12小时,然后自己盯一整轮failover模拟。不是为了测试功能,是为了看它在什么时候、因为什么、对谁撒谎。


  下周该我排oncall,排班表已经打出来了,纸质版贴在茶水间冰箱门上,边缘卷起来了。我准备把proxySQL的admin interface密码换掉,换成一个只有我自己知道、但写在纸上夹在《高性能MySQL》第318页的人名拼音缩写。不是防人,是防我自己哪天凌晨四点脑子发飘,手抖敲错一条sql,把集群切到一台刚装完OS、还没启MySQL进程的空壳服务器上去。

(编辑:站长网)

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