运维实习生眼中的数据规划:点击快0.3秒
|
告警响的那一刻,我正把泡面叉子插进酱包里,没撕开,就杵在那儿听——不是听告警声,是听隔壁机房那台老空调的嗡嗡声,比告警低半个调,但更让人想砸键盘。三台机器CPU全飙到98%,监控图上绿线炸成锯齿,红框弹得满屏都是,我手还没碰到键盘,开发老张的电话就打进来了,嗓门比告警还尖:“快看看是不是你们清缓存清猛了?我这边接口超时直接打到前端白屏!” 我原以为又是Redis键没设过期时间,或是慢查询没加索引——结果查到一半,发现所有高负载节点全挤在同一个数据分片上。数据库路由配置里写着“按user_id取模”,但去年新上线的会员积分模块,悄悄把一部分uid映射逻辑挪到了应用层做哈希……没同步给DBA,也没告诉运维。那个哈希函数,偏偏把三万多个活跃用户的ID全塞进了模1024的第7个桶里。就这一个桶,占了整张用户表读请求的63%。 其实当时谁都没当回事。值班表上周刚换过,我接的是夜班+早班连轴转,同事小杨说他昨儿还看见开发在群里发“这次改完,首屏加载快了0.3秒”,配了个火箭emoji。我当时心里嗤笑:0.3秒?我们光是重启一次nginx都要等1.7秒,你那0.3秒是拿秒表掐着呼吸测的?
文章配图,仅供参考 可真等到故障复盘会上,开发掏出压测报告截图,我才发现:他们真测了。首页跳转从1.4秒压到1.1秒,RT P95掉下去半截。但没人测“当7号分片堵死时,其他993个分片能不能扛住溢出流量”。也没人问,如果1.1秒是靠把所有热数据都喂进一个桶里换来的,那桶破了,是不是所有人一起卡在loading图标上啃空气?我承认我没做备份。那天凌晨两点四十七分,我删掉了临时扩容脚本的log目录——因为看着烦,又觉得“反正只跑了一次”,删完顺手关了终端。现在想,要是那时候留着,至少能看清他们到底在哪一刻把hash算法改成了crc32(“uid”+“2025Q3”),而不是用原来的crc32(“uid”)。但我不敢说肯定能拦住,毕竟连主库只读切换命令我都敲错两次,第二次才想起来——中间那次回车按太快,把“SET GLOBAL read_only=ON;”输成“SET GLOBAL read_only=OF;”,MySQL还真吃了,然后默默执行失败,日志里连个warn都没有,就安静地躺在error.log第三千行底下。 窗外天快亮了,蓝灰色的光糊在玻璃上,像块浸水的抹布。我盯着屏幕右下角的时间,凌晨五点零八分,咖啡凉透了,手机还震着——我妈早上六点要搭地铁送我爸去医院复查膝盖,我忘了回她信息。算了,回不回都一样,她知道我又值大夜。 其实那晚最火大的不是故障本身。是迁移复盘完,CTO扫了眼PPT最后一页写的“数据规划目标:点击快0.3秒”,抬眼问:“这个0.3秒,有没有测过极端场景下的衰减率?”底下没人吭声。开发低头扒拉手机,DBA在改备份脚本,我偷偷切到浏览器,看昨晚没看完的《Linux内核调度器源码注释》,翻到CFS红黑树那一章,页面还停在“vruntime偏移计算可能放大短时抖动”的注释上。我点开另一窗口,搜“crc32 collision probability 10k strings”,网页打开一半,突然想到:我们那七号桶里塞进去的,根本不是10k字符串,是23876个带盐值的MD5前缀+随机数字拼接……谁算过这个碰撞概率?没人算。就像没人算过,当7号桶崩了,流量炸向其他桶时,那些桶背后挂的SSD磁盘IO队列长度会涨到多少。我们只记住了0.3秒,却忘了它后面跟着的是一整条链路上所有“可能慢下来”的时刻——缓存miss、连接池打满、TCP重传、证书校验超时、甚至NTP服务器飘移…… 反常识的是,这次故障根本不是宕机。服务一直在线,HTTP状态码全是200,监控也显示“可用率99.99%”。只是有三成用户点按钮后,要等4.7秒才看到loading结束,其中一成等了7秒以上,直接关网页。而我们告警系统压根没响——因为它的阈值设在“连续5分钟HTTP超时率>5%”,而真实情况是“每一分钟都有2%的请求超时,但分散在不同秒级窗口里”。这设计多贴心啊,贴心到把业务感知的卡顿,优雅地过滤掉了。 我认了。优胜劣汰站得住,真的站得住。不是说“谁做得好谁活下来”,是“谁先把性能指标刻进骨头缝里,谁就在下次数据爆炸前多踹一脚缓冲垫”。可问题是,我们这些实习生踹的到底是垫子,还是别人刚焊好的承重梁? 小杨今早交完日报,甩给我一个链接,是运维组内部新建的wiki页,标题叫《2025年数据路由变更强制对齐清单》。第一条就是:“所有应用层hash逻辑变更,须同步提交至db-router-config仓库,并附压测报告+failover推演文档”。第二条写着:“严禁在生产环境直接执行未经审核的crc/xxhash/md5类散列操作”。我点了进去,编辑栏空着。下面有条评论,是机房老李留的:“上次你们说的‘灰度放量’,我帮你们在配电柜旁多接了两路UPS,线缆标好了,自己来贴标签。” 算了,泡面汤底已经结膜了。我去补个备份脚本,加一行:每次执行hash相关变更前,自动dump当前分片映射快照。不一定有用,但至少下次被骂的时候,我能指着日志说:“看,这里早就爆过苗头了。” (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |





