首页 > 代码库 > 游戏怎么做到服务器不停机维护?

游戏怎么做到服务器不停机维护?

很多游戏维护时需要服务器停机,而有一些不需要。或者某一款游戏有时候服务器停机维护,有时候不停机维护,是因为什么? 是不是不停机维护需要更高的技术呢?

游戏的定期更新版本已经再寻常不过了,但频繁的更新会造成流失率非常严重,哪个玩家也不希望再BOSS将要躺下那一刻,服务器停机维护了。在小版本更新过程中,采用不停机维护成为现在游戏的主流方式,那究竟是如何做到不停机维护的呢?

网络游戏如果数据放在服务器的话,要分很多种情况来看。我就大概就我的所致简单说一下吧。游戏服务器分逻辑程序服务器和数据库服务器,如果是线上运营的服务器,基本上是在两台主机上(至少是两台虚拟主机上),当然也有多台逻辑主机+多台分布式数据库的情况,我先不讨论多对多的。有时候,发现几个逻辑服务器bug,或者加了某些功能,比如少加了三个金币,多算了一点经验啊,只需要在测试服测试完毕,上传覆盖执行文件(jar或php),重启逻辑服务器进程,客户端基本感觉不到,http是短链接,即便是长链接,只要客户端有自动重连策略,也没啥问题。对外叫做不停机维护,可以公告告诉玩家,也可以不公告。
而Erlang的热升级技术,就带了更好的体验。Erlang原本脱胎于电信行业,Jow Armstrong 在描述Erlang的设计要求时期中就提到了“软件维护应该能在不停止系统的情况下进行。”在实践中,我们也因为这种不停服务的热更新获益良多,终于不用再等到半夜没人的时候再做更新了,对于一些紧急的bug修复,热更新实在是一把利器。Erlang热更新的秘密其实都集中在code模块,code模块是Erlang Code Server暴露出来的对外接口其职责就是把已经编译好的模块加载到Erlang的运行时环境。代码版本有两个概念 当前版本代码‘current‘和老版本代码‘old‘,一旦模块被加载就变成‘current‘,再有一个版本过来被加载,之前的版本就变成‘old‘,新加载的变成‘current‘。这时候,两个版本还是同时存在,新的请求执行的时候会使用新的版本,而老版本的代码还会被使用因为还有其他模块的调用‘old‘版本中。如果再进行一次热更新,这时就有第三个实例被加载,code server就会终止掉还在驻留在‘old‘版本代码依赖的进程。然后第三个实例成为‘current‘,之前版本的‘current‘被标记成‘old‘。这种方法有效降低了因版本升级而导致的用户流失。


还有一种服务器维护,是物理(虚拟)主机linux(windows)系统维护,包括升级(降级)配置,移动机房,机房故障等等,需要新搞一台主机,将运行环境搭建起来,如果有缓存数据,需要把缓存数据拷贝过去,如果没有跳板(网关),这需要更改DNS,等待生效(1-24小时)这个时候的时间差,客户绝对连接不上的。

再有就是在数据库的搭建的时候,建表的时候,没有考虑到兼容的情况,在做版本迭代的时候,新的功能需要的表结构需要重新升级或者建立新的索引,于是需要把数据库进程停止,导入数据到新的结构里面去,这段时间逻辑服务器服务器是停摆的,客户端也肯定不然连的。

最后还有很多游戏服务器群构架,包括缓存服务器,聊天服务器等等,他们也会出现各种各样的问题,也可能会停机维护或者不停机维护,原理差不多,我就不一一举例子了。


天下数据专业提供海外游戏解决方案,我们会根据您的需求情况,为您量身定做一套独一无二的海外服务器平台解决方案!

游戏怎么做到服务器不停机维护?