归零

2022-02-24 #写点代码

前几天一次因为自己粗心导致的开发故障,从业以来发生最严重的事故,非常不应该而且痛彻心扉的那种。因为弄丢了一些非常非常非常重要的存储数据,包括图片和视频,努力尝试了几天也仅仅恢复了不到1%的数据,还是不完整的。

四年前开始做一个小型CMS,用来记录小孩的成长,可以存放云端记录,其中就包括leancloud和七牛云存储,而且一直都是付费用户。

直到上个月新开发这个blog,所有基础功能都实现,最后到了走自动化部署阶段,简单思路就是提交代码到gitlab,触发webhooks到服务器,然后shell脚本执行更新、编译、并且上传静态资源到七牛云空间,最后重启服务。

也就是在上传七牛云空间的这一步操作,发生了严重的错误,配置环境变量的时候忘记配置新的cdn bucket名,脚本在执行上传之前会全部清空一遍!而忘记配置的那个旧环境变量就是为了七牛上传静态文件的bucket😭

我什么时候下意识到有问题呢?

就是写完shell脚本以后刚好晚饭时间,没有多细想就提交了代码push后就离开电脑了,吃饭时候还在想等一下就能切换资源引入。但好像哪里遗漏了?一时没想起来。

吃完饭晚上继续看看构建配置和log,不得了。居然没有配服务器环境变量,赶紧去七牛bucket看,晴天霹雳:

细看了下,整整删除了15G左右起码20万个文件。为什么会这么多文件呢,因为当初选七牛主要有2个功能很方便:图片可以加参数做样式和视频异步转码。譬如在cdn域名后面加压缩、自动旋转、获取exif信息等,视频的异步队列转m3u8分割成n个ts文件加速和防盗链等。这些功能都极大的节省了后端服务开发时间,而且费用很低。

在当时对比了国内多个厂商最终选的七牛也是因为他们文档(相对)比较容易读懂,虽然也陆陆续续吐槽有一些写得很不友好,总而言之就是技术栈选型越往后就越是难跳脱更换

在意识到做了可能不可逆的操作后,第一时间想到提工单给七牛客服,试图说明情况是否可以恢复数据:

那只能等待。

一整晚都很不舒服,虽然并不是商业项目的数据,全是个人数年以来自己上传维护的图片视频,本身意义已经超过了所有。而且删除用的是命令行,都在云端服务器上,就算有异地容灾、多低备份,也不见得七牛会大方的操作,只能自求多福了。

果不其然,早上10点左右就收到了七牛工作人员电话,给我的回复也简单:

恢复数据是收费的,基础操作费是5000和单个文件2毛,如果有需要我们给你下单

这比预期的要高出很多很多,还以为我那点数据量,撑死也就一千几百块。但我算了下如果按照他们的数量*2,起码要三四万。挂断电话以后又像是被狠刺了一刀

其实有想过,如果价格一千以内我可以接受买个教训,毕竟确实是自己人为失误导致的误删。但他们的报价我很快就意识到:

他们只是出于商业目的给所有云端数据兜底处理,就是付费误删恢复

所以会发现在Google、百度上会一点都搜索不到「xx云数据误删恢复怎么办?」这种话题。那就只能吃哑巴亏了🤦‍♂️(让你这么粗心大意)

接下来就是接连几天的反省和尝试救助。

  • 本地备份恢复
  • cdn分发回源

想起来前年有用官方工具备份过一次,但当时没有在国内网速太慢并没有完成全部,去找了下发现只有500个不到的相片而且还是很多没有分类好。从缓存的CDN找,但所有公开的图片url都是带着参数,而且没有被打开过,看了下header全部都是浏览器设置的缓存时间,试了很多张都404,这方法也行不通。

痛定思痛,唯一庆幸的是个人项目并非公司商业项目,损失的只是几年以来的相片视频。但也足以痛心,在提交了事故以后第一次代码后,接下来的两天都毫无心思coding…

作为一个有多年开发经验的开发工程师,发生这样的事以后对自己深感到耻辱和失望。两晚过后也逐渐平复心情,自己做错的事情也唯有自己承担,认栽、深刻且警醒。事已至此,反复思考如何避免下一次类似的事故,并且绝对的杜绝发生在工作的商业项目中。也给自己上了一课:

  • 写代码要更严谨,做产品要有敬畏之心;
  • 项目无分大小,都要区分环境和分支;
  • 代码、资源、数据库需要物理分开;
  • 服务端群组和权限要区分;
  • 要备份!要备份!要备份!

正如一位推友所说:

储存不备份,吃饭没下顿。
FIN