始于2019年年底的这场新冠疫情改变了我们的生活方式,让大家居家的时间明显多了起来。居家隔离期间,游戏成为了很多人排遣寂寞的一种方式,由此带来了游戏市场的异常火爆。有媒体报道,今年春节期间某款游戏单日营收超过20亿元。实际上,即使没有疫情,游戏行业也是一个利润丰厚、潜力巨大的市场。此前有研究机构预测2020年游戏市场营收将达到1600亿美元,现在加上疫情的因素,这个数字肯定只增不减。
游戏市场虽然潜力巨大,前景看好,但是竞争也非常激烈。游戏市场比拼的是谁能更快速地开发出游戏,谁的游戏让玩家体验更佳,谁的更新速度快,这就对游戏的开发、运营提出非常大的挑战。显然,要做好这一切涉及诸多方面,而一个好用的数据库产品无疑将为游戏的开发和后期的运营奠定良好的基础,MongoDB正是这样一款数据库产品。
很多知名游戏采用了MongoDB数据库
难以满足的游戏数据处理需求
数据库是游戏软件的核心组件,游戏玩家的各种信息(个人属性、装备、社交信息等)、运营数据、游戏场景数据等都需要借助数据库来保存。过去游戏软件主要采用传统的关系数据库,但传统关系型数据库并不总能很好地满足这个行业的需求。
游戏市场竞争激烈、变化快,有机构调查手机游戏平均寿命为6个月,网络游戏也不超过一年。这就要求游戏的开发要尽可能快,同时,为了保持游戏玩家的新鲜感,游戏上线后还需要不断增加新的功能、新的玩法。这些需求落实到数据库层面就要求数据库对开发人员友好,方便修改和调用,以尽可能节省开发时间。
其次,游戏上线后到底有多少玩家有很大不确定性,要准确预测非常困难。一般规律是,游戏新上线后会迎来一轮高峰,随后会逐渐下降,但也有可能因为某个事件或者某个原因重新热起来,甚至成为“爆款”。这带来的问题是:资源如果准备多了却没有足够玩家上线,造成浪费;准备少了,游戏会卡顿或者要排队,影响玩家体验。这个需求落实到数据库层面,就需要数据库具有高可扩展性,在上线人数太多资源不够时能快速扩容,人数少时能快速缩容,而且要是无缝的,以节省成本。
传统数据库在满足上述两大需求时存在不足。传统数据库具有严格表结构,表结构一旦定义后如果更改非常困难,还可能涉及应用程序的修改,这会带来很多隐患。传统数据库一种常见的表结构是给游戏的每一种武器、每个物品、每一类元素建一个表,表之间通过ID关联,比较清晰。但是,遇到游戏变更要加表、变更表时就比较麻烦。而且,随着表数量越来越多,数据库的整体性能也会降低。
另外,传统数据库大多数是集中式架构,如果数据量太大需要扩容,往往需要分库分表,这通常要修改程序,或者采用Oracle RAC这样的高端数据库软件,虽然能部分解决大数据量的问题,但成本高,同时可扩展的数据容量也受限。
除了传统数据库之外,也有些游戏直接抛弃了数据库,采用数据序列化技术,把数据变成一个二级制的数据块保存在数据库中,所有数据的处理都在内存完成,好处是性能非常高,但所有操作都依赖程序逻辑来完成,开发和维护成本都非常高。
传统数据库在游戏市场的这些不足给了MongoDB以机会,MongoDB也抓住这一机会,迅速在游戏市场站稳脚跟,并持续开疆拓土。
MongoDB:游戏行业的福音
MongoDB能进入游戏市场是因为其有很多特质非常适合游戏软件,比如自由的表结构、高扩展性等,能实现海量数据的存储、高效地读写以及大数据量的分析。
MongoDB被称为是最像关系型数据库的非关系型数据库,其具有强大的查询功能以及较完善的索引机制,方便对数据进行类似关系型数据库的各种操作。而且,作为文档型数据库的代表,MongoDB采用的是BSON文件格式,非常接近对象模型,对开发人员十分友好。
更为重要的是,MongoDB不像关系型数据库对表结构有着严格的行和列的规定,MongoDB的schema-free的特性允许随时新增字段,允许数据库中的表(集合)内包含不同结构的文档,从而减少了不同表(集合)之间的关联。MongoDB这一特性对于游戏软件非常重要。因为游戏需求变化快,需要快速迭代,不断加入新功能,常常导致需要修改数据模型。
MongoDB另一个被游戏行业非常看重的特性是其动态扩展能力和高可用性。作为大数据时代诞生的新一代数据库,MongoDB从诞生之初就是面向大数据应用场景,其分布式架构天生地具有快速的水平扩展能力,非常适合海量数据的各种应用场景。同时,MongoDB的分片技术已在很多生产环境中得到验证,用户只需要选一个合适的片健(shard key)即可。顺便一提的是,从MongoDB 4.2开始,管理人员可以直接修改片键的值,MongoDB会自动根据新的片键值将文档移动新的片上。这既保证了原子性又大大简化了操作。
而在高可用性方面,MongoDB也为游戏软件的可靠运行提供了充分的支持。MongoDB的复制集是一个相当成熟的高可用架构,它通过一主多备来保证服务的可用性:当主宕机后还存活的备用节点会自动选举出新的主节点,在某个节点宕机时自动进行切换,保证游戏服务不中断。
除了上面所说的这些特点,MongoDB还有一些功能给游戏开发人员带来了很大方便。比如,今天的游戏一般都有“寻找附件玩家”这种社交功能,用MongoDB就很容易实现。MongoDB支持二维空间索引,利用空间索引可以方便地实现在地图上查找距离最近的玩家这类功能。还有,游戏中经常会要实现一些装备定时免费或者道具自动过期,这些通过MongoDB的TTL索引(TTL索引支持文档在一定时间之后自动过期删除)可以轻而易举的实现。
此外,运营也是游戏软件成功的关键。运营数据主要以日志为主,通常数据量非常大,MongoDB提供的MapReduce功能可以完成一些比较复杂的统计和聚合操作,为大数据的分析提供了强有力的保证。不仅如此,MongoDB官方还提供了Hadoop、Spark等连接件,通过该连接件,Spark等可以直接将MongoDB当成HDFS使用,避免了资源的浪费,提高了整个系统的使用率。
综上所述,这些功能大大简化了游戏开发人员和运维人员的工作,加快游戏软件上市脚步,提高运营效率。
云服务Atlas加持,助力全球化部署
除了MongoDB数据库本身的这些特性之外,游戏服务商还可以进一步从MongoDB的Atlas云服务来获取对游戏部署和运营最大程度的支持。Atlas是MongoDB 2016年发布的托管云服务,由MongoDB负责运营,在AWS、谷歌云(GCP)、微软的Azure上都有提供。今天,Atlas是MongoDB发展最快的一个业务,也是MongoDB现在的主要收入来源之一。云服务天生的优势是方便全球化部署,再加上Atlas本身的诸多特性,使得Atlas很受那些需要全球化部署的游戏服务商的认可。
通常,需要全球化部署的游戏有两种部署方式:全球同服和分区分服。前者是全球游戏玩家连到同一个游戏服务集群,后面接同一个数据库集群;后者是全球玩家接到不同游戏服务器集群,各自连到不同数据库。对于前一种方式,数据库的水平扩展和保证全球不同地游戏玩家低延迟是不小的挑战,对于后者开新服(部署新的服务器)、关服(关停服务器)和数据库更新(需要分别更新)都是挑战。
借助MongoDB Atlas云服务可以很好地支持上述两种部署方式。Atlas Global Clusters是在全球分布式部署的集群,可以很好地满足全球同服的部署需求。Atlas Global Clusters将一套数据库集自动部署到多个地理区域,通过本地读提供毫秒级延迟来保证更好的游戏体验,还能确保特点地区数据写入预定区域内,方便满足GDPR此类合规需求,以及对游戏玩家而言可以实现数据库的就近读写。而对于分区分服,Atlas可以通过增加一个分片或者减少一个分片来完成开服和关服,此后数据可以自动重新均衡分布到不同分片上,而在更新方面,MongoDB数据库几乎不需要做数据库表的修改。
Atlas对全球化部署的支持不仅体现在通过Atlas云服务实现在全球各地的部署,还体现在通过Atlas实现跨云部署。因为不同公有云在不同地区的服务能力是不同的,而Atlas可以通过Azure、AWS和GCP等多种公有云提供,这样游戏服务商可以在各地选择最适合的公有云平台。
除了全球化部署之外,Atlas的自动扩展功能也颇为亮眼,Altas在磁盘容量达到90%时, 将自动扩展磁盘容量。这一个功能对游戏服务商非常有意义,可以帮助节省成本。
另外,Atlas提供丰富的细粒度的监控服务和告警信息也值得一提。Atlas能提供有关群集数据库和服务器使用情况的完整指标,当数据库操作或服务器使用率达到影响群集性能的预定义阈值时自动发送告警。此外,Atlas还提供实时性能监控面板、查询分析器、性能建议器以及Atlas安全和审计方面的功能,这些都能为游戏的运维提供最大程度的保证。
得益于MongoDB数据库本身以及云服务Atlas的诸多特性,那些先期部署MongoDB的用户已经得到了丰厚的回报。以著名游戏公司SEGA为例,其旗下游戏的数据库从MySQL迁移到MongoDB的Atlas,用来保存游戏玩家所有数据、运营数据、排行榜等核心数据。经过测算,此举将数据库运营费用降低了63%,DBA的工作量降低75%,新游戏的开服变成了非常简单的事情。
实际上,除了SEGA之外,今天还有不少游戏已经采用了MongoDB数据库,包括享有很高知名度“古墓丽影”、红极一时的吃鸡类游戏“堡垒之夜”等,还有网易、腾讯等推出的多款游戏也都采用了MongoDB。随着MongoDB功能不断完善和Atlas服务的不断优化,我们有理由相信未来还会有越来越多的游戏玩家加入到MongoDB大家庭中,为游戏爱好者奉献更多体验更加的游戏。