游戏服务器宕机应对措施
原文地址:服务器又宕机了,怎么办?
理想情况
对于一般的MMOG来说,玩家在进入游戏时会从数据库中将该玩家的所有相关数据读到内存,以便快速的进行游戏逻辑的处理,而在玩家下线时再将数据的改动存回数据库。如果程序开发完全基于这种理想情况,不考虑程序、服务器宕机的现实风险,那么一旦发生故障将导致用户数据大量丢失的灾难性后果。
现实困难
要将游戏内的所有场景、人物等数据恢复到宕机那个时刻的状态在技术层面基本无法实现,即使想尽办法实现代价也非常巨大。
应对措施
1. 为玩家数据实现定时存盘的机制,就像现在大多数的单机游戏一样,AutoSave。比如,每5分钟自动为玩家存一次盘,这样就可以使得回档的最大损失控制在5分钟以内。
2. 对于一些重要数据的变动,比如玩家花大量游戏货币购买了一件贵重的武器装备,这时可将玩家数据立即做一次存盘操作,这也将有效的减少玩家的重大损失。
性能优化
上述应对措施虽然可以有效解决宕机的问题,但却会让数据库吃不消,需要进一步优化方案:在中间加一层代理做缓冲,姑且称这一层代理为数据库代理服务器,它所要完成的工作是从场景进程收集玩家的定时存盘请求数据,再以一个低一点的频率写入到数据库。
听起来这又像是一个换汤不换药的做法,写入数据库的时间间隔还是变长了。但实际上在前面我们就曾经描述过,如果服务器进程不会出现意外的宕机,玩家数据只需要在他上线时读取,在他下线时写入即可,中间添加的这些定时存盘过程完全只是为了防范宕机回档所造成的巨大损失。
PS: 不用将所有定时存盘数据都更新到游戏数据库中,只需要处理5分钟内的增量数据即可,而且定时存盘数据可以以增量的方式追加到队列文件中,这样基本不会影响游戏程序的性能。