周三上午十点,会议室。
项目紧急会议。线上支付系统凌晨发生故障,导致三千万交易延迟,用户投诉激增。王总、技术总监李总、产品、测试、运维、开发,二十多人挤在会议室,空气紧绷。
“谁先说?”王总脸色铁青。
监控组先汇报:“故障时间凌晨两点十七分,持续四十六分钟。直接原因:数据库主从同步延迟,导致读写不一致。”
数据库负责人老赵立刻说:“我们检查了,主从同步配置没问题。是应用层有大量非索引查询,拖慢了主库,导致从库延迟。”
开发组长小陈反驳:“我们上周才优化过查询,加了三组索引。而且凌晨两点,哪来的大量查询?”
运维插话:“监控显示那个时间点有异常爬虫流量,可能是被攻击了。”
安全组摇头:“不是攻击,是正常的搜索引擎爬虫,流量在正常范围。”
会议开了半小时,各部门互相推诿,没有结论。贝西克坐在角落,没说话。他打开笔记本,在纸上画了一张图。
时间轴:
02:00-02:15正常
02:15-02:17爬虫访问量轻微上升(+15%)
02:17-02:20数据库主库cpu从30%升至80%
02:20-02:30从库延迟从0秒升至120秒
02:30-02:45应用报错率从0.1%升至5%
02:45-02:50运维重启从库
02:50-03:03服务逐渐恢复
他观察每个人的发言。老赵说话时眼睛向右上方看(回忆),小陈说话时手不自觉地摸后颈(紧张),安全组发言简洁但语气犹豫,运维在玩笔。
“安静!”王总拍桌子,“我要的是解决方案,不是谁的责任!现在告诉我,怎么避免下次再发生?”
李总提议:“加硬件,扩容数据库。”
老赵反对:“硬件成本高,而且不治本。要先找到根本原因。”
小陈说:“我建议加强防爬虫策略,减少无效查询。”
安全组:“那可能影响seo。”
又陷入争吵。
贝西克举手。所有人都看过来。
“你说。”王总皱眉。
“我有个推测。”贝西克翻开笔记本,“故障的直接原因确实是主从延迟,但根本原因不是爬虫,也不是查询,是配置变更流程漏洞。”
会议室安静了。
“什么配置变更?”老赵问。
“上周五晚上,数据库组做了一次参数优化,调整了‘binlog_format’从‘row’改为‘mixed’,目的是提升同步效率。但这次变更只在主库执行,从库漏了。导致主从的复制格式不一致,在特定查询模式(比如全表扫描)下,同步会变慢。平时负载低,不明显。昨晚爬虫触发了几次全表扫描,放大了这个问题。”
老赵脸色变了:“你…你怎么知道?”
“我看了变更记录。”贝西克说,“上周五晚上十一点二十三分,有数据库变更工单,执行人是你。变更理由是‘提升同步性能’。但工单状态是‘部分完成’,备注写着‘从库明天补’。但第二天没人跟进。”
“你怎么能看到变更记录?”李总问,“那是dba权限。”
“我有只读权限,上周申请的,为了排查另一个问题。”贝西克说,“刚才会议期间,我查了日志,确认了这一点。”
老赵额头冒汗:“那个…从库我后来补了,周一上午补的。”
“但从周五晚上到周一上午,有六十个小时窗口期,主从不一致。”贝西克说,“故障发生在这个窗口期内。”
小陈看向老赵:“老赵,真有这事?”
老赵低头,不说话。
王总盯着他:“是不是?”
“是…”老赵声音很小,“但我以为不影响…平时都正常…”
“你以为?”王总提高声音,“三千万交易延迟,用户投诉,公司形象受损,就因为你‘以为’?”
“王总,我…”老赵想辩解,但说不出话。
贝西克继续说:“另外,我观察到另一个问题。运维在02:45重启从库,但>> --