物联网老兵亲授:MySQL高可用运维设计实战
|
去年12月份,深圳南山那间机房的空调坏了三天,冷凝水顺着桥架滴到UPS下面那台DELL R730的电源模块上——我听见滋啦一声,没关机,但监控面板黄了十七秒,第十八秒才重新刷出心跳。就这会儿,运维老周在钉钉群@我,头像还是他儿子去年奥数获奖时戴的那个鲨鱼帽子,发了个捂脸笑的表情包,配字:“主从切了,但binlog没传完。”
文章配图,仅供参考 我原以为是GTID模式自动兜底,结果登录进去一看,io_thread状态是Connecting,而connect_timeout=60刚过完一半,它还在重试。可MySQL自己不报错,只是卡在那儿,像等人递根烟。我手抖点开slow_log,前三条全是SELECT FROM device_status WHERE last_seen > NOW()-INTERVAL 1 HOUR,后面跟个FOR UPDATE——不是我们写的,是那个刚转正三个月的实习生,在OTA推送服务里套了个事务查在线设备列表,顺手没加索引。优胜劣汰?对。不是说你设计得漂亮它就活下来,是哪个备库扛住了三小时持续写入+八百台终端同时上报心跳+CDN节点批量回源拉取告警快照,哪个就成主库。去年12月23号凌晨两点零七分,B机房那台从库CPU跑满97%,但SQL线程一直没停,而A机房主库在触发fence后直接被VIP踢出了集群——不是故障转移,是物理下电。我盯着zabbix页面上那条断续跳动的InnoDB_rows_inserted曲线,突然觉得“高可用”这词太文雅,不如叫“谁先喘不上气谁滚蛋”。 工位左边第三格抽屉里还塞着半盒冷掉的虾饺,是前天晚饭点的,包装盒上印着“顺丰同城急送”,但骑手定位停在科技园北门十七分钟没动。我打开Kibana搜last_seen字段的写入延迟分布图,最大P99值是4.3秒——等等,不对,是4300毫秒,单位写错了。我改完索引,把ORDER BY updated_at DESC改成ORDER BY id DESC,顺便把WHERE语句里的UNIX_TIMESTAMP()全替成CURRENT_TIMESTAMP,再跑一次压测。结果呢?QPS升了不到两个点,但复制延迟从波动800ms降到稳在120ms上下。我说不准为什么,真说不准,可能跟relay_log_recovery参数有关,也可能无关。这个我敢打包票:换行符在my.cnf里多敲了一个空格,MySQL启动日志就不再打印innodb_buffer_pool_dump_status这一行——连带dump时间戳也丢了,我们查了一整天误以为buffer pool没加载。 上周三,北京机房那位王工打来电话,嗓音沙哑:“你们用的pt-heartbeat脚本,是不是默认每十五秒insert一次?”我没答,他接着说,“我们那边蜘蛛爬虫频次调高了之后,发现pt插件表被锁死了三分钟,刚好覆盖了所有告警静默窗口。”说完挂了。后来我在GitHub上翻了三天Percona Toolkit源码,commit记录里有行注释写着“# do not use in high-frequency monitoring env — legacy”,时间是2019年6月。我没提这事,因为群里另一个哥们儿正在吼“为什么监控平台又报‘主库只读’?!”——其实是他在备份脚本里硬编码了read_only=1,忘了切回去。 我手机震了一下,是杭州同事发来的截图:某IoT网关管理平台后台,一个接口返回502,Nginx error log里写着upstream timed out (110: Connection timed out) while connecting to upstream,后面跟着proxy_pass http://mysql_proxy_cluster/。我没点开看,因为知道那是我们半年前上线的ProxySQL集群,配置了自动权重调整,但有个bug:当某后端MySQL进程异常退出、端口仍被占用时,ProxySQL不会主动drop连接,而是等keepalive探测失败后才剔除——这个周期是120秒。期间所有新连接全打到那个已死节点,timeout堆积如山。我们修过两次,第三次改用haproxy+tcp-check,现在稳定多了,就是慢一点。慢就慢吧,至少不瞎跳。 刚才泡面的时候看见窗台落了只苍蝇,翅膀透明,右前翅有一道斜裂痕。它在那儿停了四十秒,然后飞走了,撞在玻璃上,弹了一下,又飞。没别的意思,就是记着。还有,昨天备案系统提示“网站负责人手机号核验失败”,我填的是我老婆的号——她去年十一月刚换的电信套餐,但管局数据库还没同步,所以校验通不过。我懒得再折腾,直接让法务同事用他们公司主体重新报了一次。这事跟MySQL高可用没关系,但它真实发生在我今天下午三点二十一分。 我现在线上还跑着一套双主环形复制拓扑,不是为了强一致性,是怕某个城市光缆被施工队挖断两次。第一次断,我们能切;第二次断,就得有人手动ssh进DB容器删掉auto.cnf重置server-uuid。我已经让实习生把操作步骤录屏存NAS,起名叫《深圳备份应急V2.7_20231223》,没写密码——反正他也不知道root密码在哪张贴纸背面。如果你明天问我怎么防脑裂,我会说:别搞三节点MGR,去查查自己机房的UPS电池健康度报告。报告第一页右下角,印着供应商签字和日期,墨有点晕,但我看得清。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


站长必避的3个MySQL设计陷阱
MySQL运维设计实战:36小时稳如磐石
后端架构师亲历:12个容器高可用真相
零基础也能懂!MySQL设计与运维实战手册
MySQL高可用架构:7年实战从单点到自动容灾
MySQL性能优化全链路实战:19年架构师的毫秒响应之道
MySQL事务控制无障碍设计指南