• 玩家回档原因分析


    在最近一次维护后,玩家发现有较大规模的数据回档,还有一小部分玩家无法登录。现在尝试还原一下现场。

    当天维护的时候,SA执行了一次数据库维护。维护是通过一个脚本完成的,而且执行过多次,理论上没有问题。而维护的过程中,开发组这边需要执行一个脚本,给一批玩家增加经验。这一切完成后,QC简单复测了一下,就开服了。开服后发现,服务器出现大量报错,而且都是玩家数据出现问题。定位这个问题的时候,发现玩家的数据丢掉了导致无法登录,顿时吓尿了=_=||| 论坛里也有玩家开始叫骂,定位了一下貌似是那批增加经验的玩家,于是马上复查增加经验的脚本。玩家数据存储是使用redis数据库的,脚本里就使用了一条hincrby指令,不应该会清掉数据啊

    接着,我们想到了一个可能,会不会是SA做迁移的过程中,我们跑脚本了,然后迁移数据的脚本看见有数据,就不再存入,导致玩家数据只剩下刷入的经验值呢?实践出真知,实验表明,redis自身是有实现保护的,正在恢复数据库的过程里,外部复写的数据会提示报错。虽然没追踪到主因,但是我们之前额外做了一套旁路备份,用golang+leveldb实现的一套redis存盘代码。里面的数据肯定是对的,只是由于redis对应uid里有数据,所以不再从leveldb里取数据而已。说时迟那时快,快刀斩乱麻将加经验那批玩家的redis数据干掉,玩家就可以登录了。

    慢着,报错还是没有停,还有一大票玩家遇到同样的情况。我们终于开始怀疑SA同学的脚本了。后来才发现,由于之前没有规范操作,导致备份的目录错了,SA同学启用的数据库位置是正确的,但是之前错误操作,把一个老的数据库放进正确的位置了,导致实际上跑起来的,是一个147天前的数据库。于是,加经验的那批玩家中,是这三个多月里创号的,就会只剩下一个刷入的经验值,建筑数据等等都会丢掉了。而没有刷入经验值的玩家,是通过leveldb,取到最新的档案,所以反而能够正常游戏。

    最终,在2130这个高峰时间,我们停服维护了。把下午维护前备份的数据库恢复回去,少部分玩家丢失了3个小时左右的游戏数据,so sad。事实证明,我们的旁路备份是坚实有效的,前提是修复故障前,先要理清头绪,不要盲目修复,才能最大限度的减少损失。另外,不要设定不可能区域,SA同学也是人,也有犯错的可能。

  • 相关阅读:
    深拷贝浅拷贝的探索以及实现
    Vue之动态class写法总结
    hh
    90%的新媒体人都在用的标题套路!
    研究999篇100W+爆款文,标题之总结
    想突破10w+?先过了这一关……
    易撰数据分析,做精准爆文分析!
    清除.bat
    截图.bat
    Git 学习笔记(二)分支管理
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/accident_user_data_rollback.html
Copyright © 2020-2023  润新知