作为游戏内容开发商,我的本职工作是一名Java程序员,当然偶尔兼职产品经理的活。由于公司规模太小,我还得兼职服务器运维的工作,作为菜鸟运维人员,最近经历了几次令人崩溃的事故,和大家一起分享一下,以作警示或共勉。

对于Java服务端程序员来说,和客户端开发最大的区别是,后端程序员除了要背负日常的研发压力之外,还要背负更多的线上异常压力,因为通常来说,服务器出现的Bug和异常不可逆的居多,不可挽回的居多。而且出了问题就得停服更新,对于玩家来说,体验也十分糟糕。

客户端程序员就不存在这些压力,对于他们来说,所有的显示都是可见的,可见意味着只要认真负责,出现Bug的几率极小。不仅出现Bug的几率小,同时还有天然的热更新修复优势,也就说是即便你显示出了,可以随时修正,让玩家刷新一下就完事了,不可能会带来无法挽救的损失。

不过既然选择做一名Java程序员,就已经有了扛责任的觉悟。只能平时多下功夫,对常见的容易出问题的模块和代码不断优化,尽量减少出现Bug的几率。幸运的是,最近的一个新游戏项目刀剑神域网页版,刀剑神域H5版本,上线后十分稳定,基本没有遇到什么项目内的Bug,比如道具发错,系统崩溃等等。

正当我暗自庆幸,沾沾自喜的时候,意外突然降临。

当运营告诉我玩家不能进游戏的时候,我心头一紧,感觉不妙,不过我也没有太过担心,熟练地连上linux服务器查看情况。游戏没有报错,诡异。紧接着我输入一些命令想要看看其他,结果系统提示我Read-only file system. 这显然是linux的文件系统崩溃了,那就要找崩溃的原因,我以为是游戏写入太多,看起来像是磁盘异常。

对,你没有看错,就是磁盘异常,什么读写都不能进行操作,紧接着提示你Input / Output error,这就确定是IO问题无疑了,作为菜鸟运维,不敢随意重启,只能报修机房,期待他们能有解决方案。

令我崩溃和诧异的是,机房也无法重启,告知我其中一块磁盘挂了。逗我玩呢?我里面还有很重要的玩家数据!这是刚上线不久的项目,好不容易导了一批玩家进来玩,体验和反馈都还不错,就给我来这么一出?简直当头棒喝。

我问机房:不是说有RAID1吗,一块挂了,另一外总能读出数据吧?

机房回复:另一块在尝试读取的过程中也嗝屁了,整个RAID配置挂了,数据读不出来了。

真是一波令人崩溃的操作,其实我之前一直对RAID还抱有美好的幻想,认为它是拯救数据的最后一根救命稻草,结果,现实啪啪打脸,RAID不仅对保护数据没有任何帮助,而且能够在关键时候给你火上浇油——使用过RAID的磁盘无法通过其他方法读取数据,而原先配好的RAID嗝屁后,里面的数据就彻底读不出来了。

这是一个死结,让我一个Java程序员心力交瘁。你或许会问,你们难道没有备份吗?答案是有,但是做的是本地备份,本来只是用来防止数据异常后回档的。由于没有做异地容灾(菜鸟运维能力有限),所以磁盘嗝屁意味着彻底玩完。

太难受了,我只是一个Java程序员,为什么要懂这么多。

通过这次事件后,本地+异地双备份势在必行,同时,我对机房这个古老的行业表示极大地不信任,最后和运营商重新选择了云服务器作为新的方案。成熟的云服务器自身有容灾机制,而且还有定时快照功能,再加上我的双保险备份方案,这一次应该稳了吧?

写这么多,主要还是给后来的人一些警示,其实我做游戏开发这么多年,也是第一次碰到机房崩溃导致磁盘数据彻底丢失,在此之前没有什么心理准备,也没有那么强的安全意识。程序员其实不是万能的,只能说是不断发现问题解决问题,而在这个过程中踩得每一个坑,都是未来宝贵的财富。

出现问题不可怕,杜绝问题重新整理,从头再来!