记一次线上事故

#前言

在一轮降雨过后,近几天的天气异常湿热,这是我自来到这个城市后很少碰到的。在这样的工作日的下午,伴随着密集的会议日程,加之不停有运维咨询事件轰炸,个人可支配工作时间被压缩,整个人也难免烦躁起来。

#时间流

15:47 用户在运维支持群反馈在某列表查询页面,存在部分记录时有实无的情况。

16:18 收到运维支持轮值同事求助,希望协助排查该问题。

因该列表涉及的功能在大约10天前有过上线,当时是我负责开发,所以会请求我进行协助。

16:47 从代码逻辑和网关配置两方面进行了梳理和排查未发现有错误,并把排查结果向同事进行了反馈。

该列表是在早期一个融合项目里迁移到现在的应用中的,期间也出现过类似的因代码bug导致的问题,同时在最近一次上线中对该列表所涉接口对应的网关进行了更换,因此首先想到的是从这两方面入手进行排查。🤔

16:55 上述排查无果后,尝试通过模拟用户登录身份信息并调用应用侧提供给网关的接口进行问题复现,在配置了生产环境的调用配置后进行了一次接口调用,发现接口返回结果正常,未能复现问题,同时也将结果向同事进行了反馈。

这里其实是距离定位到问题根因很近的一步了Orz

17:00 参加会议。

运维轮值同事和我都在会上 =_=

17:03 会议期间,运维轮值同事发现有一个接口的TP99飙高,一直在超时报警,并且定位到报警机器是一台预发环境机器,遂联系该预发机器的测试负责人进行排查。

17:09 会议期间,预发机器的测试负责人同事反馈当前机器正在进行另一功能模块的对外联调,并未操作报警的接口,同时反馈预发环境的列表页似乎出现了生产环境的数据。

这里其实问题根因已经明朗了,但是由于在会议期间,测试同事的反馈并未引起大家的重视……

18:00 会议结束, 参加另一个会议。

我继续参加另一个会议Orz

18:08 会议期间,运维轮值同事向我反馈预发环境中出现了很多生产环境的数据,需要协助看下是否是网关配置存在问题,导致生产环境的流量打到了预发环境。

这里已经紧张起来了,因为距离上一次上线已经快半个月,如果网关的配置配成了预发环境的,按照当前的访问流量,可能会影响上万条数据。😰

18:11 会议期间,我马上对网关进行了排查,发现网关配置的确实是生产环境的接口调用配置,并无问题。随即又进一步排查有哪些机器使用了当前接口的生产环境配置,最终定位到一台预发环境的机器。

排查到网关配置无误后,算是松了一口气。后续定位到预发环境机器后,一方面是庆幸问题已经定位到了,另一方面是在祈祷影响范围不要太大…… 😰

18:12 会议期间,运维轮值同事进行预发环境机器下线,切断问题源头,不再产生新的问题数据。

18:21 会议期间,运维轮值同事对该预发环境机器的配置进行了历史变更记录回溯,发现9天前有研发同事添加了该配置,并且该配置是生产环境的配置。

该研发与我同在会议中,没有及时响应消息……

18:56 会议期间,研发同事反馈当时需要在该预发机器上进行联调,但该预发机器上的配置信息不是最新,并将缺少的配置信息粘贴过来,并未发现粘贴的是生产环境的配置。

18:57 会议期间,运维轮值同事反馈共有626条记录受到影响。

配置虽在9天前就加上了,但期间一直未部署,实际上只对近2天的数据产生了影响。

19:00 会议结束。

19:06 研发leader召集研发、测试、产品和运营共同商讨修复方案。

19:55 研发同时开始编写数据修复脚本。

21:10 研发、测试及架构师对修复脚本进行了代码评审。

22:30 开始在预发环境进行数据修复脚本试跑和验证,同步进行数据整理和比对。

01:53+1 正式开始生产环境数据分批修复,并进行测试验证,同步进行数据整理和比对。

03:29+1 数据全部修复完毕并验证完毕。

03:50+1 下班。

street.jpg◎ 无人的大街

#问题根因

搭建预发环境时,研发和测试同事错将生产环境配置拷贝,导致预发机器暴露在线上,相关数据落到预发数据库,对列表页查询功能造成影响。

#影响范围

涉及数据626条,实际影响309条。

#解决方案

编写脚本,并识别实际受影响活动数据,将实际受影响记录迁移至生产库,修复数据。

#后记

最近项目并行多,上线也多,相关部署环境更多,加之系统涉及配置项繁多,很难不出点问题,所幸受影响数据不多。但就算受影响的只有300多条数据,也花费了近8小时进行修复,更不算前期的问题排查时间。

一方面,在前期定位问题根因的流程中,还是要多留意,其实后来发现用户的反馈截图里列表页记录的ID长度与生产环境的就不一致,此时若引起注意就有很大程度上能意识到是环境问题。

另一方面,在日常工作规范中,对于这种部署环境的配置,最好还是有 double check 机制,能在一定程度上防止类似事件的发生。同时也引申出了对『防呆系统』的思考,即运用防止错误发生的限制方法,让操作者不需要花费注意力、也不需要经验与专业知识,凭借直觉即可准确无误地完成的操作,防止损坏更换的成本。