【实测】记一次线上个人官网的事故修复

部分粉丝知道,我弄了个线上的个人网站,用来陈列一些自研测试平台,还有几个其他功能,如面试题库,简历优化(开发中),学习课程等。

 woqurefan.cn

    但是今天突然有人通知我线上出了事故:(感谢及时提醒)

    吓得我赶紧拿出手机一看,首页的某个进度条子页面一片空白。我猜测和我上边朋友的说法一致,应该是后台接口500了。

    当然,在四十分钟后,这个事故就修复了。现在给大家叙述一下,遇到这种情况不要慌:

    (因为事发紧急,关系到上面很多学员和上万粉丝的光顾,所以没来得及一边修复一边写公众号记录,也就没有截图了)

    这四十分钟内,我有三十分钟在从超市跑回家,上楼,开机。

    然后第一步,打开主页,看着空白心里一沉。开始了我的紧急修复之旅:

    第一步:先确定事故情况:

    赶紧打开f12的network,刷新了下主页,看看接口:

    接口中有一个叫做/xuexi_jindu/的接口f返回了500状态码,也就是服务端报错。

第二步:看看测试环境能否复现

    测试环境如果能复现,那么对修复会有极大帮助。所以我赶紧打开本地代码,启动本地调试,也就是所谓的测试环境。发现并没有出现报错。

第三步:线上排查是否账号问题

    首先我要排查下是否是账号引起,虽然线上粉丝和我的账号都出现一个问题,但是我也要去确定一下,如果切换账号没事了,那说明我们账号自己是脏数据出了问题。如果切换账号仍然报错,那就说明是一个公共的模块的问题。于是我赶紧通知了几个反应快的朋友登录自己账号看看,结果是全都报错。那说明就是某个公共代码的问题,这个进度功能涉及的代码很多,一时半会确定不了。

    第四步:测试环境尝试复现。

    测试环境中我尝试静态走读一遍代码,没发现什么大问题,此时心里不太好受,但是好在范围也在缩小,我也没太慌,而是继续尝试了一些各种异常操作,但都没有复现这个bug。于是我放弃在测试环境复现。

第五步:线上查日志。

    线上查日志是比较麻烦的事,远不如测试环境复现方便,这也是为什么我们在公司里提交线上bug的时候,开发同学都是抢着让你测试环境复现一下的原因。

    回到线上,我本来不太想去打开云服务器的控制台,太卡了,而且又扫码又干啥的麻烦。而最重要的一个原因就是,我之前图省事,并没有设置单独的报错收集日志,在关闭了debug功能后,正常的django控制台输出中什么有用的信息都看不到。通过 tail -f nohup.log 命令,看到的实时日志中除了告诉你这个接口500了之外,啥都看不到。

    因为事发突然,我来不及去做这个功能,所以只能暂时打开debug配置,这样做是有很大风险的,在这短短的调试期间,别人访问平台也会看到平台很多保密的敏感信息的。

第六步:定位问题

    通过查日志,确定了出现问题的具体代码行。原来是去数据库查一条sql的时候,查出了空,导致后面代码的下标越界。

     而正常情况下,不可能查出空的。于是我联想到昨天,我因为调整资料,删掉了数据库的某些行数据,才导致的这个问题。

    第七步:修复问题

    那怎么修复呢?去进度表中修改每位粉丝同学的进度数据,删掉这几个空数据id是个办法,但是太麻烦了,不但需要写sql,还需要冒风险,而且以后再有这种情况还是报错。于是从代码层面着手是最好的。

    代码上我加了一个try except,当获取失败后,就跳过这个资料的进度即可,相当于打了个补丁。

    然后本地测试一下没问题,直接上线解决。        

    这应该是这个小网站第一个线上事故,后续出现问题我也会把修复过程记录下来分享,好让大家从中吸取教训,哪怕得到一丁点经验也没白写。

    感悟:很多时候的线上事故,都是很紧急很复杂的,虽然谁都可以是事后诸葛亮,但是在之前没有上帝视角的情况下,各种方案都不太合适,大多都是临时去想。各种线上用户数据,时间,风险,人力,脏数据处理,后续预防等等元素都要考虑进去。尤其是一定要小心谨慎,一个不小心,可能会酿成惨重后果。

猜你喜欢

转载自blog.csdn.net/qq_22795513/article/details/130296857