April 19, 2021
恭喜自己,这是第一次生产事故,也是第一个 T0 事故
规范化自己服务器的事故级别:
04-17 下午,登陆生产服务器,执行 yum upgrade update
命令,缘由是服务器的Docker环境版本过于低,需要做一系列更新。 执行完命令后,服务器自动重启,并未给出对应的重启提示,初步判断是由于涉及到了内核的更新。更新后迟迟不能恢复服务,接入VNC查看后,虚拟机无法加载磁盘,至此事故发生。服务器内容全部损失。
事后及时联系服务商,企图拿到损坏的磁盘镜像进行恢复,结果是拿不到,得到的建议只有重装。
在重装后,找服务商要回了同样的磁盘系统模版,安装后重新执行 yum upgrade update
命令,也没有产生任何内核级别的更新,甚至一个更新都没有,所以这次事故的根因到底是啥我一直没太懂。
这件事情后,我思考了很久关于「正式运营一个产品」的事情,不幸中的万幸是 Miser 自始至终都只有我一个人在使用,即便是朋友多次说想一起使用参与整个产品的发展。我个人的数据其实并不是那么值钱,但是一旦有用户真正的把内容放在你这里,然后你还弄丢了,那么诚信和信任度会变得很低很低吧。
在此之前我只在服务上面搭了 sentry,用来实时监控服务里面未处理的异常情况,即 5XX 的错误的收集。而实际上在运营过程中还碰到过很多奇奇怪怪的问题,比如说突然间CPU彪得很高,内存突然吃紧了。
由于用的是传统的虚拟机,并没能上自由伸缩的云,因此 CPU、内存等系统级别的监控也是应该提上日程的,也就是说一套完善的 prometheus + Grafana 的基本配合是一定要部署到生产的。
说起来很奇怪,实际上我已经数个月,快半年的时间没有动过生产服务器,基本都是通过 GitHub Actions 来实现一套完成的 CI/CD 的。这次手动登陆服务器的缘由便是上去把备份服务部署上,而就是这么一次操作导致了事故的发生,也有可能是生疏了。
服务商跟我讲得很好,我的操作确实存在很大的问题。他说如果他来会这么操作:先拍一个硬盘snapshot,然后执行操作,没问题万事大吉,有问题用snapshot恢复整个磁盘。
确实,我这一次并没有很好地做一次dryrun,每次都是直接跑docker pod 级别操作,出问题了就直接rm,这次在宿主机的操作实在缺少了一丝敬畏。
为此