第一次线上事故
2016-03-28

每天下班我都带电脑回去,可上周四下班时一念之间,就把电脑留在了公司。

到家后瞄了一眼微信,有@我的消息,说 app 的 iOS 版本报网络错误。我当时不相信是服务端的问题,再加电脑不在手上,就在群里说谁有 Android 版本试一下吧。

很快有人报,Android 版本也有问题。我觉得不妙,用浏览器访问了一下,返回 Nginx 502 错误,看来是服务端的问题无疑了。

产品一直有人在用,所以每耽误一分钟都会影响很多用户,我立即穿上衣服往公司赶。路上还给运维的哥们打电话,问他服务器有没有问题。

十分钟后赶到了公司(住得近的优势啊),公司里就还剩一两个人了。顾不上太多直接开电脑连上终端,还好生产服务器能连上,可以排查问题。

一看原来是磁盘空间占满了,应该是日志没有及时清理所致。我进入日志目录,想用一条命令把两天前的日志都删掉,但是 bash 报错删除不成功,还是空间不足闹的。一时间不知该如何是好。

冷静下来后,我用 rm 带通配符的方法一天一天地删日志,果然好使。之前无法成功执行的命令可能是用到了管道需要分配磁盘空间,而通配符不需要。清出一部分磁盘空间后,bash 终于不报错了,总算有了件可靠的武器。

接下来就启动服务吧,谁想又踩到坑。

我们的部署用了 ThoughtWorks 出品的 Go,一个强大的工具。但是它也经常出点小毛病。隔三差五就执行不了 Job,重启 Go 服务就好了。

之前做这块的同事曾在 ThoughtWorks 工作,他对 Go 比较熟,有他在的话应该可以应付。但他已经离职,和我做交接的时间也有限,所以我对 Go 的了解不可能达到他那样的程度。这次我照原来的样子念完祈祷文后重启 Go 服务,然而,这次没有奏效。

果然,GO 在我最不希望它出问题的时候,很不给面子地撂挑子了。无奈只好手动操作 PM2 重启进程,可万没想到,竟有一台机器上的 PM2 也出了问题,死活都起不来。万般无奈之下,用 forever 先凑合着跑起来了。万幸 forever 没出岔子,救了我一命,果然还是最简单的东西最可靠。

程序完全恢复之后,看着日志哗哗刷屏,心里还是有些成就感的。回想自己的职业生涯,虽然也做过用户量超大的服务端,但当时只负责写算法实现功能,没接触运维。后来自己做运维,还没遇到过服务挂掉的情况,而且用户量小就算挂掉也不会紧张。所以这是我头一次解决紧急的线上问题。

这次事故对我是一个提醒,以前自己做的多是开发,运维经验不足。而现在我独立负责后端,运维的重要性不言而喻,该在运维技术上多投入些时间了。

END