使用MongoDB作为页游的存储引擎

一两年前,随着NoSQL作为一种技术概念的流行,使得CouchDB,MongoDB这类非传统关系型数据库得到了快速发展。但后来这些新兴项目自身都出现了一些发展问题,包括影响比较大的Foursquare宕机事件。

就在最近,MongoDB似乎也遇到了一些麻烦。与之前众多Why we choose MongoDB一类的文章相对,更多的出现了一些Say Goodbye to MongoDB的评论。其实每种技术都有一定的特点和适用场景,不能太轻易下结论。老话所说的,善用之则为善。

在我们的经验中,使用MongoDB作为Web Game的存储引擎是有一定优势的。对于游戏来说,即便是MMORPG这样多人在线的游戏,核心的内容仍然是围绕单个玩家自身,也就是说,数据组织和使用的主要纬度对于用户来说几乎只有唯一的一个。玩家的唯一ID,将是在面向用户的功能中,最多被使用的针对存储引擎查询的条件。因此,使用MongoDB存储上使用的类似Document形式的Data Schema便非常适合。

关系型数据库在使用上技术门槛要更高一些,这些年来,对于没有互联网行业经验的技术人员来说,在使用上更容易犯一些低级的错误。而且,其实NoSQL的概念之所以会流行起来,一方面也是因为大家在对传统关系型数据库使用过程中,发现根据实际应用场景,需要做一些违反关系型设计的灵活变通,来满足实际的需求。对于游戏的数据设计来说,众多地方其实更不适合抱有关系型数据库表设计的理念。

之所以选择MongoDB,是因为MongoDB相比之下提供了最灵活的使用方式,MongoDB并不能与所谓Document Database混为一谈。它只是在存储数据的结构设计上借鉴了其理念而已。

MongoDB的数据查询是通过TCP协议以BJSON形式传输。在指定的场景下,其读写效率确实与MySQL一类的流行数据库引擎有一定差距。但对于Web Game来说,本身就不是一种对数据库负载要求很高的应用。MongoDB更多是作为一个数据持久化的引擎使用。当然,过去的一些社交类的游戏和一个大世界的游戏可能是不适合的,而现在国内市场里主流Web Game运营的形式是不断增开独立的新服务器,这对于数据量和集群的要求都不那么高。因此MongoDB作为一个可以简化开发和维护的优势就是值得考虑的选择了。

MongoDB提供了便利的集群配置机制。但是,MongoDB在使用过程中所占用的内存和磁盘空间都比较大,而且其实MongoDB目前在集群情况下,尤其是在Collection和Index数量比较多的时候,如果因为一些不可预料的原因发生数据库锁死或者进程异常停止,重启之后可能会有文件的损坏而造成无法正常使用。在StackOverflow上可以看到许多遇到这类情况的问题,是一个维护上的风险,使用时仍需要特别留意,注意做好备份。

谈及备份,使用mongodump产生的bson文件占用磁盘空间非常大,但压缩率非常可观。因此,在备份脚本上一定要注意对备份出来的文件进行足够的压缩,并且要定期清理掉已经可以放弃的备份。

将MongoDB运用于一个读写负载比较重的应用从一开始就不是一个太明智的选择,MongoDB被诟病最多的是整个进程只有一个全局的write lock,在最新的版本里,这个lock已经被优化到了database级别。在之前,通常我们是使用多个MongoDB进程来规避这一风险,但即便是到了database级别,仍然还是不要将MongoDB用于对数据库性能要求很高的应用场景。

在实际业务中,除了前台针对用户的功能之外,仍然会有许多后台运营,数据分析的实际业务需求。MongoDB在这方面并不具有太多的优势。MongoDB提供了很灵活的查询接口,大部分简单的统计查询需求还是很容易实现。但一些需要大量数据汇总,重新分组和组织的数据处理需求而言,还是需要一定的使用经验才能把握。MongoDB所提供的map-reduce查询写法,在比较多的使用场景里其实需要一点违背直觉的技巧才能达到目的,10gen应该在这方面再提供一些更便利的接口才好。

另一方面,由于存储性能和写数据性能的劣势,一些需要大量记录和分析的数据不一定适合直接使用MongoDB进行存储。这些数据,可以采用文本文件或者传统关系型数据库,比如MySQL来存储。而且,对于日志数据的抽取和分析,这两种形式还有不少成熟免费的工具可以使用,相对来说更便捷。

总体上来说,选择MongoDB作为一个页游的存储引擎有一些很适用的优势:

1. 用户数据存档,用户自身的关键数据存储在一起,使用和维护起来都很方便,开发过程便捷。功能和规则变动带来的数据增加和变更都可以灵活适应,大大减少维护Data Schma的成本。

2. 游戏内容数据的存储和管理。游戏是一个偏重Data-Driven的应用程序,游戏内容数据天生适合文档型的存储和自由灵活的Data Schema。结合MongoDB方便的数据导入,导出工具,以及灵活的查询修改接口,可以作为很好的数据设计,修改和维护的工具。可以让数据的修改和更新过程更加快速和稳定。但相对于文件来说,一个劣势是对版本的控制要在工作流程上要求更仔细一些。

许多页游团队其实都选择了MongoDB作为主要的游戏数据存储方案,但同时也要对MongoDB自身的短板和特性有一定研究,才能保证不使用错,这和使用其它关系型数据库是一样的。

MongoDB是否可用于一个大世界的MMORPG,这个问题也是我们接下来在考证和研究的。这也取决于未来一两年,10gen是否可以带来更多的改善和进步。