MySQL运维实战:从建站到高可用的全栈路径
|
跟老板拍桌子那天,MySQL 主从延迟炸到两小时,监控钉钉消息堆了四十七条没点开,我盯着那个红色告警弹窗,手悬在键盘上三分钟,最后把「切主」按钮点成了「刷新页面」——就这下,连着点了七次。不是不敢切,是切完得写三百字故障复盘,而PM刚在群里甩来一句「首页首屏白屏时间能不能压进十八毫秒」,我回了个「?」,他回了个「Lighthouse跑分截图发群里了」,截图现在还在我桌面文件夹叫「0423_lh_fail_未命名.png」,下午三点零七分截的,水印日期比实际晚四分钟,没人回,连前端都懒得骂它。 我原以为高可用就是配好MHA+VIP再敲几遍stop slave; start slave; show slave status\\G;结果第一次手动failover,后端蹲我工位边等三十五分钟,我敲完最后一条change master to语句,发现relay_log_purge=OFF根本没生效,binlog日志撑爆从库磁盘——就那会儿,对面工位老张换了根Type-C充电线,银灰壳,旧的那根折了插不进新笔记本接口,他掰了两下,咔一声,线芯露出来一截铜色,我还记得那颜色像上周我们改的my.cnf里max_allowed_packet参数值——一百零四万八千五百七十六,我抄错成一百零四万八千五百六十六,重启实例三次才意识到少了一个十,但没人问,我也没提。 优胜劣汰?对。真他妈对。不是靠PPT写的SLA,是靠谁凌晨三点敢进生产库drop临时表、谁敢在周会说「这个slave_io_running=No我查了三天,就因为master的server_id被docker-compose.yml里一个env引用覆盖了」——而那个人,是我。我敢打包票:去年七月九号,上午十点二十三分,我们线上库主键ID突然从bigint(20)变成bigint unsigned,但迁移脚本里没加--defaults-file=/etc/my.cnf.d/replica.cnf,所以slave跳过所有insert,只报warning,不报error,监控也安静得像死掉。这个我说不准是不是DBA故意留的坑,反正我没追到底,因为当天KPI要交「高可用建设进度」,我就在文档里写了「已实现半同步+GTID+MHA仲裁节点冗余」,其实仲裁节点那台机器昨晚就因内存泄漏OOM重启过两次,桌面那个录屏还在跑着,右下角显示01:22:47,没关,我忘关了。 建站那段最滑稽。前端扔过来三个SQL建表语句,带comment,带索引,带ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci——我原以为直接source就行,结果执行第二条时卡住五十七秒,show processlist一看,create table正在等一个MDL锁,源头是个没加where的update,执行了四百一十二秒,是运维同事早上十点零三分手动跑的补数脚本,他后来去倒水,水杯放在饮水机旁第三格,蓝色马克杯,杯底贴着一张小纸条,写着「别动!还在debug」,但没人信他,因为前天他说「这SQL肯定不锁表」,结果锁了八分钟,锁住了用户注册流程。CDN账单的事我提一嘴:上月我们CDN流量突增三百七十二 KB,监控没报,因为阈值设成了三兆,可那三百七十二 KB全是GET /api/v1/user?uid=123456789&token=…… 的重放请求,源头是我们建站时漏删的一段测试curl代码,混在shell脚本末尾,#DEBUG没注释干净,凌晨四点定时任务拉起来,每秒三次,持续十九分钟,我删完,顺手把那个脚本名从init_db.sh改成init_db_v2.sh,其实v2也没修啥,就多加了个echo 'start'。
文章配图,仅供参考 高可用路径?呵。它不是地图,是筛子。你得先被筛选掉三次:第一次是建站时配错tmp_table_size导致group by慢成狗没人理你;第二次是主库oom你用kill -9硬杀进程而不是systemctl stop mysql,被DBA当众念了三遍innodb_force_recovery=1;第三次是你写完failover checklist却发现checklist第一条「确认semi-sync状态」下面,手写补充了一行小字:「如果SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = ''Rpl_semi_sync_master_status''返回NULL——别慌,先看plugin目录有没有semisync_master.so,它可能被上周的rpm update删了,但yum list installed里还显示installed」。这个我敢打包票,因为我是亲手摸着服务器机箱外壳烫手,一边拔U盘一边写的。 我桌上还有瓶没开封的脉动,绿色瓶身,标签朝外,买来那天是去年十一月十一号,双十一大促凌晨,我们刚切完主库,系统稳定了四十分钟,然后redis缓存雪崩了。我没喝,现在也不打算喝。下礼拜我得去学怎么给pt-online-schema-change加–chunk-index,听说要选一个无重复、低cardinality、非主键、且恰好没被任何trigger引用的列……先试试user表的last_login_ip吧,虽然我猜它大概率有空值。算了,还是先问问DBA老刘借他那台笔记本用一下,他的录屏软件开着,桌面右下角还飘着个未关闭的Percona Toolkit手册PDF,缩略图看着挺全。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


MySQL慢查询到毫秒响应:20年缓存老兵实战优化
私域服务迈入模型预判时代:混合云运维的智能跃迁
内容创业者生死线:3个月重构高可用架构
站长必避的3个MySQL设计陷阱
网站上线流量归零?Ruby运维盲区在吃掉用户
建站新手必避的7个运维坑:第5个90%人忽略
网站合规运维的7大技术盲区,90%团队竟浑然不觉
