天天看点

天生一对,当游戏遇上MongoDB

天生一对,当游戏遇上MongoDB

前端时间魔兽这个电影我相信大家都看过了哈,作为一个资深魔兽世界玩家(从公测时候就开始玩,当然现在是已经afk多年),我对这个电影还是可以给好评的,毕竟里面的一些场景还原度还是蛮高的,特效也做得不错。不过肯定也会有人觉得不满意,毕竟魔兽的游戏做得太成功了(我这里主要指魔兽世界),恢弘的史诗剧情,创新的团队副本设计,丰富的游戏体验,各种令人赞叹的细节。作为一个码农,有时候我也会去思考魔兽世界这个游戏背后他的一些设计和实现,比如他用什么数据库。当然真正用什么数据库这个我是不确定的,我们今天的主题是当游戏遇上mongodb,所以我们只聊游戏如果采用mongodb作为数据库有哪些好处。

以前玩魔兽世界的时候,每个礼拜二都要来一次停服维护。当时大家也习惯了,毕竟魔兽世界还是玩点卡的,游戏时间都是自己花钱买的。但对于现在的免费游戏来说,经常停服,可能玩家都会接受不了。对那些日流水好几位数字的游戏公司来说,时间就是金钱,停服维护可能就有种自己在不停烧钱的感觉。所以现在都要追求服务高可用,尽可能减少停服时间。数据库服务通常也是整个游戏服务中的一个重要环节。mongodb的副本集是一个相当成熟的高可用架构,它通过一主多备结构保证服务的可用性,当主宕机后还存活的备会自动选举出新的主。

天生一对,当游戏遇上MongoDB

![replica_set_trigger_election]

说完高可用,我们来说说高可扩展方面。同样还是魔兽世界,想必很多早期玩家都体验过排队,之所以要排队,主要是因为服务能力不够导致。当然,这通常和数据库无关,不过,一个好的架构师是不会允许有某个环节出现明显的瓶颈的。mongodb由于其数据相对独立的特性,相比于关系型数据库,较容易进行水平扩展。其sharding架构已在很多生产环境中久经验证,业内有些公司对其进一步优化后已在管理上百pb的数据。对于运维人员来说也是相当友好,动态扩容和负载均衡都是自动进行的,用户只需要选一个好的shard key即可。

天生一对,当游戏遇上MongoDB
天生一对,当游戏遇上MongoDB

运营游戏有时候会面临不得不对游戏进行回档这样的痛苦选择。因为程序不可避免会有bug的存在,如果有某个bug被恶意利用,亦或者是人皆会犯错误,某个gm不小心手抖发了大量rmb道具,都可能导致较大的经济损失出现。如果游戏不是很完善,没有一个更好的解决方案的情况下,这时候可能就要考虑对游戏进行回档了。对于数据库数据的回档来说,mongodb提供了一个延迟副本集节点的设定来解决这个问题。即,将某个节点配置成落后于最新数据一定的时间量。

天生一对,当游戏遇上MongoDB

当然,这还是很粗粒度的,如果要精确回档到延迟时间内或者更早的时间点,甚至是任意时间点,就还要在备份恢复这块上做更多的工作。阿里云mongodb近期会推出任意时间点恢复的功能,以满足包括这个场景在内的备份恢复需求,敬请关注。

现在有很多游戏都采用滚服作为快速增加营收的一个运营手段。如果使用mongodb作为数据库,可以利用其数据独立带来的好滚优势。此外,阿里云数据库mongodb的一个功能——从备份点创建实例,简直就是专门为滚服打造的。只需事先为一个新服初始化好实例,然后创建一个备份集,就可以根据这个初始备份集快速创建多个实例,从而达到快速开新服的目的。

天生一对,当游戏遇上MongoDB