18年老兵实战:MySQL高可用架构从单点到自动容灾
|
去年七月,杭州连续下了四天的雨,机房二楼空调冷凝水滴在UPS机柜顶盖上,嗒、嗒、嗒,跟心跳一样慢半拍。我蹲在A3区机柜前,右手拧着主从切换脚本里一个死循环的sleep参数,左手捏着半根凉透的葱油饼——是老何早上九点四十塞给我的,说“你先垫垫,等会儿数据看板崩了得靠你拉回来”。他站旁边没走,衬衫领子翻了一边,手里那台iPad Air锁屏界面还停在昨天的AB漏斗图上。 我原以为切完主从,下游Flink CDC链路最多抖三十秒。结果脚本跑完,kafka lag瞬间飙到八百一十四万条。我盯着监控屏右下角时间:十一点零七分。这时候运维小马接了个电话,没说话,只嗯了两声,把听筒贴在耳朵上侧着头,后颈有一小片晒脱皮的痕迹。他挂掉电话转身就往消防通道跑,背影比平时矮两公分——估计是蹲太久了。 去年双十一前夜,我们那套“双主+中间件路由”的高可用方案被砍了。砍的人是我自己。不是因为成本,是上周三下午两点十七分,增长团队用“实时转化率”做灰度分流,SQL里那个LEFT JOIN的on条件少写了个IS NOT NULL判断,查出来三千二百万行全空值记录。BI组的老何当时正趴在茶水间微波炉前热第三份冬瓜薏米汤,端出来的时候汤面浮着一层油花,他喝了一口,突然说:“这数,连分母都虚。”没人接话。空调外机在窗外哐当响了一下,像谁踢了铁皮箱一脚。 容灾这事,真不靠PPT里画的“故障自动漂移箭头”。靠的是有人半夜三点还在看binlog event timestamp和应用层写入时间戳的偏移值——偏移值超十八秒,你就该手动杀应用进程,别等心跳探活。但人不是机器,我上个月亲眼看见一个刚转正的后端,为保SLA把MySQL配置里innodb_flush_log_at_trx_commit硬改成0,改完还截图发群里:“大家快看,TPS涨了!”我没拦。他改完五十七分钟,订单库主键冲突报错堆满钉钉消息,而他正在楼下便利店买关东煮,塑料袋拎得很高,生怕汤漏出来。 对,我说的就是“优胜劣汰”——不是技术淘汰人,是场景淘汰方案。去年七月那场切流事故,暴露的根本不是GTID同步延迟问题,是业务方调用链里埋的那个“重试逻辑”:HTTP超时设成两秒,重试三次,结果第一次写主库成功,后两次因网络抖动打到从库,从库拒绝写入又触发降级返回null,前端兜底代码把null当0算,GMV直接抹掉百分之三十七……等等,这个数字我不敢打包票,是DBA小周用Prometheus exporter抓的原始样本,我没核验。但我敢打包票的是——那天凌晨四点零三分,我在公司沙发上睡着前,看见老何坐在工位上,左手食指一直在iPad边缘反复摩挲,磨出浅浅一道白痕,而他眼睛闭着,呼吸很匀。 有次我跟架构组老张在楼梯口吵过。他说“MHA太老”,我说“老?它比你家孩子大两岁”。他掏出手机翻Git提交记录,我伸手把他屏幕往上推了一截,他睫毛颤了一下。他女儿高考填志愿那年,我们俩一起修过一套基于ZooKeeper的选举模块,最后删库重装了三次,第三次他老婆打电话来问“你到底回不回家吃饭”,他站在走廊尽头答:“马上”,然后挂了电话,顺手把手机塞进裤兜,裤兜立马鼓起一个不规则的包。
文章配图,仅供参考 说回容灾。真要能“自动”,就得接受一件事:自动≠无感。它一定伴随某个不可逆动作——比如强制切断某台应用节点连接、丢弃一批未ACK的redo日志、或把一个正在执行的存储过程直接KILL。但所有文档都跳过这一句。他们写“毫秒级切换”,却不说这毫秒之后,Flink状态后端要重建窗口;他们标“RPO=0”,可只要binlog cache刷盘策略没锁死,那个“0”就是个心理安慰。我见过最狠的一次,是个金融客户——他们在事务里嵌了Java线程sleep(250),就为了等上游系统通知,结果主库切走那一刻,那250毫秒里的sleep直接变成阻塞队列雪崩。这事没进周报,只有DBA值班日志里记了句:“7月12日02:18:44,Kill线程ID 93071,原因:事务中非中断等待,持续3.7秒。” 对了,桌角那杯咖啡,冷透了,表面结了层薄膜,像小时候家里铝锅烧干后的水垢。我不喝,就搁那儿。老何昨天路过顺手摸了下杯壁,皱眉说“怎么还是凉的”,我说“热过,也烫过,现在它就这样”。他点点头,没再说别的。他左耳戴的AirPods掉了一只,那只就静静躺在键盘右上角,朝上,像一只收翅的蜻蜓。 所以你看,所谓高可用,从来不是让数据库不宕机,而是让人知道什么时候该让它宕。我现在写的每个自动切换脚本,最后一行都是echo “MANUAL_CHECK_REQUIRED”。不删。留着。下回谁想改,得先找我签字,签字笔我放在抽屉第二格,跟一包没拆封的创可贴放一起——创可贴是去年五月配的,防水款,一直没用上。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


MySQL运维设计五大经典陷阱避坑指南
MySQL运维设计实战:36小时崩溃到稳如磐石
MySQL事务控制无障碍设计实战指南