阿里云MongoDB战略合作介绍
——陆封
内容概要
一、阿里云MongoDB发展历史
二、阿里云&MongoDB公司战略合作
三、阿里云MongoDB概览
四、阿里云MongoDB部署结构
五、阿里云MongoDB优势亮点
非常高兴有这个机会跟MongoDB公司一起合作来举办,阿里云游戏行业的MongoDB的一个私享会。我先做一个简单自我介绍,我是阿里云数据事业部陆封,这里我先跟大家分享一下阿里云过去这么多年来在MongoDB的一些投入跟发展情况,以及我们跟MongoDB公司的一些战略合作情况。
一、阿里云MongoDB发展历史
随着阿里云在2010年初的开服,我们在16年推出了MongoDB服务,当时只是社区版本,但已经支持副本集形态。
17-18年,随着MongoDB社区的发展,我们又继续推出新的版本,不断地完善不同的服务形态,包括管控、加密、CloudDBA的自动诊断、数据传输以及不同的分片布置形态。
2019年,我们跟MongoDB公司正式确立了官方战略合作伙伴关系,我们可以在全球首发MongoDB最新的版本。结合MongoDB自身内核能力,完备构建了多种形态、管控的支持能力。同时,我们还支持了TDE的加密落盘——以便在公共云上提供更好的数据安全性,也支持只读节点——可以水平扩展读的能力,还包括备份加密以及 VPC网络加密等等。
在20年和21年,阿里云都是最早推出MongoDB最新版本的发布。20年推出了基于云盘存储形式的MongoDB版本,结合MongoDB原厂的内核能力和阿里云的研发投入,构建了Serverless形态,能够极大地节省成本和简化应用性。我们也构建了DynamoDB的兼容形态,以及推出了提供更强管控能力的专属集群形态。
今年9月份,我们发布了MongoDB最新版本5.0。此外,还提供了通过DTS进行实例间数据双向同步功能、备份等能力。
从16年MongoDB在国内刚刚开始社区构建的时候,我们就进行了深度参与。并且在后期跟MongoDB公司战略合作,不断地加大投入,结合原厂的能力去推动MongoDB在国内的使用和生态发展。
二、阿里云&MongoDB公司战略合作
自19年跟MongoDB公司正式战略合作起,我们在19年和20年连续两年荣获MongoDB的全球最佳合作伙伴奖项。阿里云用户相较于其他云平台可以更优先使用到最新版本,同时既可以得到阿里云技术架构师的支持,也能直接获得MongoDB公司跟我们共建解决方案的架构师的支持。
阿里云也在不断地推动DB内核的发展,阿里云的工程师也开发了很多MongoDB内核的新特性。
三、阿里云MongoDB概览
简要介绍一下MongoDB在阿里云上的产品形态。
首先我们提供了全系列版本的支持,支持多种部署形态,包括最入门级的单节点、高吞吐读写的副本集的形态以及水平扩展集群,以及 Serverless形态等等。同时我们提供了 VPV网络、安全审计、全员加密等安全的保证。
同时我们构建了数据管理、备份、传输等对MongoDB的支持,还有监控报警,智能诊断的一整套能力,使得用户可以获得最高性价比和最好的云上一体化的服务能力,同时还可以享受MongoDB最新最强的内核特性。
四、阿里云MongoDB部署架构
阿里云MongoDB主要有4种形态,一种是最基本的三阶段形态、面向海量数据扩展的分片集群的形态、支持性能扩展的副本集形态,还有最新推出的Serverless形态——可以提供最佳性价比。
五、阿里云MongoDB优势亮点
总结来看,阿里云MongoDB的亮点颇多,包括提供了最佳性价比和运维效率以及提供一体化的生态工具等等。
以上就是阿里云和MongoDB过去几年的发展,期待未来能有更长足的合作。
X项目MongoDB实践
——王海波
内容概要:
一、为何选择MongoDB
二、MongoDB使用情况
三、遇到的挑战
近期我们工作室正在研发一款卡牌产品,在立项的时候决定把数据库从MySQL迁移到MangoDB,本文主要分享一下这个项目在MongoDB的一些实践情况。
一、为何选择MongoDB
首先聊一下为何选择MangoDB。
第一个原因来自于关系型数据库的痛点——SQL维护成本比较高,也会给开发效率带来一定的影响。
以游戏中的装备为例,每个装备的不同等级都会有不同的属性。使用关系型数据库来存储装备需要两张表,第一张是装备表,主键是装备ID,还有一列是装备的等级;第二张是装备的属性表,装备ID和属性ID组成联合主键,还需要一列装备的属性值。通过这个例子我们会发现,使用关系型数据库需要维护数据库的表结构,而且数据库的表结构往往跟业务层的数据结构是有差异的,它的维护是需要一定成本的。
其次,在玩家登录的时候,需要把数据从数据库里加载到游戏服务器内存。但随着游戏复杂度的增加,表的个数也逐渐增加,就会导致加载速度减慢。为了保证玩家的登录速度,我们引入了异步加载机制,但同时这也会提高编码的复杂度。
第二个原因是文档的结构更适合游戏数据的建模。
还是以装备为例子,如果使用文档结构,在设计的时候可以直接将装备的属性作为子文档嵌到装备文档中,这个数据模型跟业务模块中使用的数据模型是一致的。文档结构的优势有以下几点:
l 嵌套的文档模型天然适合描述游戏数据。
l 使用嵌套的文档模型对游戏数据进行建模之后,我们发现,只需要少量的文档就可以去描述整个游戏数据,可以提高加载效率,还可以去掉异步加载机制,进而简化业务代码,提高开发效率。
l 文档模型非常灵活,能够支撑游戏高速迭代的需求。
第三个原因是MongoDB提供的Sharding模式。
我们游戏架构是一个全区全服的分布式架构,玩家的数据在游戏集群中也是分片的。这种架构能够和Sharding模式非常完美地结合。Sharding模式主要有以下几个优点:
l 高可扩展。游戏公测初期会有大量玩家涌入到服务器,可以利用Sharding模式多部署一些分片实例,来保证公测的顺利。
l 高可用。MongoDB的副本集模式,可以保证服务的高可用。
l 方便合服。游戏往往都有合服的需求,我们需要保证玩家的ID是唯一的。采用Sharding模式合服的时候,只需要配置游戏区服之间的映射关系,不需要做任何物理层的数据迁移,使得够做到秒级的合服。
二、MongoDB使用情况
MongoDB的第一点应用就是关于数据建模。
我们将玩家的数据集中存储在有限的4个文档中,第一个存放角色数据,里面主要是玩家的头像、等级以及新手引导之等数据。第二个存放背包数据,比如玩家的道具、装备。第三个存放活动数据,比如各种运营活动,第四个存放社交数据,比如好友列表、聊天记录。
只需要几个有限的文档就可以描述整个游戏的数据,因此相比于关系件数据库,表结构的数量大大地减少了。
目前,数据落地主要采用了两种方式。
第一种是定时全量更新。它的实现逻辑是,按照固定的时间间隔去检测文档是否发生变化,如果有变化,则把整个文档入库。它的优势在于,实现起来很简单,并且它的数据很安全,不会丢失。它的劣势是QPS不稳定,且文档越大QPS就会越低。
第二种是定时增量更新。它的实现逻辑是在更新子文档的时候,对子文档做标脏,然后定时把周期内所有标脏的子文档收集起来,一次性落地。它的优势是QPS比较高且稳定,不会随着文档的大小发生变化。劣势在于数据不安全,因为子文档标脏是通过带有标脏功能的接口来实现的,如果业务代码中没有调用这些接口,就会调导致这部分数据没有被落地。
接下来分享一些压测数据。我们的压测主要在阿里云上面进行,部署了两个MongoDB和三个分片实例,主要进行了两方面的测试。
首先是测试单个文档的大小变化对QPS的影响。我们把文档分为了50KB、100KB和200KB三个档次,测试结果显示文档越大QPS越小,成反比关系。其次测试集群的QPS和配置提升的关系。我们把分片从2C4G升级到4C8G,再升级到8C16G,测试结果是集群的QPS呈现出线性增长。
在上线之前,我们根据这些压测数据提前规划好需要的实例个数,然后准备一些冗余,来保证公测的顺利稳定。
三、挑战
接下来分享一下我们在使用MongoDB过程中遇到的一些挑战。
第一点,使用定时全量更新方式的时候,文档越大QPS越低。除此之外,我们还担心会存在其他负面影响,比如文档越大会导致op_log越大,op_log过大会不会产生其他的负面影响?
第二点,Sharding模式没办法做到单个区服的回档。但是实际运营的时候可能由于Bug或者其他的原因,会有单个区服回档的需求。
第三点,如果使用MongoDB数组,实现增量更新会比较复杂。我们现在的方案都是使用map方式,以子文档的形式来做增量更新。 但 map方式的缺陷在于做统计查询的时候不方便。
MongoDB助力游戏客户
全球部署与快速开发
——唐峰
内容概要:
一、MongoDB与游戏行业
二、MongoDB使游戏开发更高效
三、MongoDB使玩家体验更极致
四、MongoDB使架构伸缩更弹性
一、MongoDB与游戏行业
首先谈一谈MangoDB与游戏行业的渊源。
过去的两年受疫情的影响,游戏行业是为数不多的发展比较好行业。从全球来看,有非常多的游戏比如海外的堡垒之夜,还有比较经典的索尼克系列,以及在国内的游戏场上很受欢迎的阴阳师、梦幻西游等,它们的后端数据库都是使用了MongoDB。同时越来越多的游戏公司在开发新的游戏和构建新的游戏服务平台的时候,都会重点考虑使用MongoDB。为什么MongoDB在游戏行业中会如此受欢迎?
从我们的视角以及得到的反馈来看,主要得益于MongoDB的三个特点:
第一,MangoDB可以让游戏开发变得更加高效。
第二,MangoDB的高可用性可以保证玩家体验。
第三,MangoDB的分片架构可以让数据库集群在做弹性伸缩的时候更加高效。
二、MongoDB使游戏开发更高效
首先来看游戏行业中的开发效率问题。游戏行业的竞争非常激烈,同一游戏题材同时多家游戏公司在进行开发,那么越早将游戏推向市场就有越大的几率来赢得更多的玩家。游戏发布之后,开发团队需要根据玩家的反馈不断地进行游戏玩法的调整。
这就要求数据模型要非常灵活,并且在做数据结构变更的时候尽量要低代价甚至无代价。
在游戏的场景里面,玩家属性是最重要的一类数据,并且属性间关系非常复杂。采用关系型数据库来存储这些属性,要把不同玩家的不同属性,按类别存放到不同数据库的表中。获取这些数据则是需要通过玩家ID来做关联查询,使用join查询把数据从多张表中查询出来。当数据发生更新的时候,也需要保证数据同时写到多个表里面,需要有事务的保障。
这种关系型的数据库模型带来的问题是显而易见的。首先,随着数据量和玩家属性的增长,数据库的表数量也会越来越多,这个时候做join操作是很低效的,会导致查询变得越来越慢。其次,表的数量过多不利于数据库的水平扩张的,需要采用第三方的分布式中间件,或者在应用代码里写数据路由规则来实现数据库的水平扩展。
以上因素都会制约我们的开发效率。接下来看看MongoDB是如何帮助开发团队更高效地构建游戏。
MongoDB中,玩家属性数据是存放在一个json文档中,可以通过嵌套数组或者嵌套子文档的方式,将玩家身上不同的属性以及属性与属性之间复杂关系,存放到单条文档中,避免了关系型数据库中一个玩家数据拆到多张表的过程,大大提高了存取效率。
同时,应对游戏不断迭代以及玩法不断更新的需求,MongoDB的文档模型在做数据模型的演进时也是非常方便的。
随着游戏迭代,需要加入社交属性,比如就近玩家推荐。最开始玩家数据里面是不带地理位置信息的,如果现在需要在关系型数据库里面添加地理位置属性的字段,不仅仅是游戏应用的代码需要更新,相应的还要在数据库中调整表结构。如果数量非常大,这个操作可能需要非常昂贵的代价,甚至需要申请停服来做这样的变更。
但是MongoDB不需要预先定义表结构,不同结构和数据类型的玩家数据可以直接插入数据库。也就意味着面对的游戏变更的需求,只需要对游戏应用代码进行相应的更新,MongoDB数据库侧没有任何变更操作。这就可以保证游戏玩法变更不会对数据库产生额外变更开销,也自然不需要停服维护。
MongoDB也支持多文档事务,实现方法和使用原则跟关系数据库保持一致,所以开发人员关系型数据库转到MongoDB就没有额外的学习成本。
过去游戏开发中,涉及到支付,玩家金钱等的场景是不会考虑用MongoDB的,因为早前的MongoDB版本中并没有提供多文档事务的支持。从MongoDB V4.0开始,新增了多文档事务特性,现在已经有很多游戏公司使用MongoDB用于这些游戏支付场景了。
Change Stream是MongoDB 3.6推出的一个新功能。
在需要根据数据的实时变更,触发复杂的业务逻辑场景中非常适用。比如排行榜场景,过去常用的方式是在玩家较少的时段批量将所有玩家的排行重新计算。有了changestream可以实时的捕获玩家的等级字段,并触发后续的排名更新。
三、MongoDB使玩家体验更极致
在游戏行业中玩家基本都要求7×24小时在线,这对游戏运营是一个比较大的挑战。比如日常数据库的升级,版本的变更,或者一些安全补丁的维护,要怎么样来进行?MongoDB的高可用复制集如何来帮助游戏的运维团队?
MongoDB在部署的时候,最小的部署单元是一主两从的复制集。主节点是提供了读写的能力,从节点跟主节点保持数据的同步并对外去提供读的能力。玩家登录游戏以后,所有的数据变更都是写在主节点上面,然后MongoDB通过内部的oplog来把数据同步到从节点上。
这样的架构在单个节点发生故障的时候起到非常好的保护作用。因为MongoDB的复制集在主节点发生故障的时候,能以秒级的速度重新选举出新的主节点来对外提供服务。
同时在游戏应用侧,MongoDB也提供了不同编程语言的驱动,包含可重试的读写功能。也就是说在主节点发生故障需要做主从切换,或者由于网络抖动造成失败的读写操作的时候,驱动会自动捕获到失败的读写,并且在集群选举出新的主节点之后自动进行重试。这就解决了高可用的需求,并且解决了保证7×24小时在线的运维难题。
MongoDB的复制集可以不断地添加从节点来对集群读的能力进行扩展。它最多能支持一个复制集下面有50个节点,这些从节点用来做什么呢?
比较典型的一种用法,就是用它来做分析型的业务。比如我们要对游戏数据做运营分析,过去是需要将这些数据统一导出到一个集中的数仓或者数据分析平台中,但在MongoDB里面可以直接在从节点上进行。
此外,MongoDB的charts可以构建可视化报表,迅速对游戏运营提供数据决策的支持。
四、MongoDB使架构伸缩更弹性
游戏行业的一个特点就是在游戏的不同阶段,数据库所需的规模需要动态调整。
在游戏发布的早期或者公测的时候,可以比较准确地预估数据库需要的配置,游戏正式发布后,流量是很难准确预估的。这就要求我们能够迅速对突发流量做出数据库集群规模的调整。
随着时间的推移,到了游戏生命后期可能需要对数据库集群的规模进行缩减,来达到成本上的平衡。这在关系型数据库里是比较难实现的,但MongoDB的分片集群可以轻松实现。
首先,MongoDB分片集群可以通过向已有集群里面添加分片的方式,对数据库的容量和读写能力进行水平扩展。并且添加分片和数据的均衡都是在MongoDB在后台自动完成,应用侧不需要编写任何路由规则,也不需要做任何代码的变更。对应用来讲,它是完全透明的。
其次,MongoDB可以在全球部署一个大的集群,根据玩家所处的地理位置来就近部署分片节点,这样可以保证不同地区的玩家都有离自己较近的分片节点,可以提供就近低延迟的读写。此外,还可以对从节点在不同的区域里做交叉部署,这样每个区域都有自己分片的主节点,可以就近进行数据更新。同时又有其他区域的从节点,能看到全量完整的数据,可以在本地完成游戏数据的运营的挖掘或者报表分析等。
最后,MongoDB分片可以帮助我们实现地区性法规的要求。比如欧洲的GDPR要求玩家数据的不能出欧洲,我们可以在MongoDB里面通过zone-sharding策略部署集群,指定欧洲玩家的数据就落在欧洲数据中心的分片上,以此来满足数据合规性的需求。
在游戏里面还有一个比较常见概念就是滚服与合服。
使用关系型数据库的时候,游戏服务器和数据库服务器大约是1:1。当一个游戏服的玩家数量达到上限,就需要开一个新服,同时还要等比例配置一套相同的游戏服务器和数据库服务器,这些都是比较复杂的维护操作。
另外对不活跃的游戏服的玩家进行合并,也就是合服。在关系型数据库里面做合服是比较耗费成本和资源的,需要做数据的导出导入,要找停服维护的时间。如果不同服里的玩家 ID存在冲突,还需要处理数据冲突的问题。
不过如果采用MongoDB的分片,可以把所有不同服的玩家数据放在一个大的集群里,只需增加一个字段来标识出玩家来属于哪个服。将来做合服操作的时候只要在MongoDB里面做字段更新,这是一个完全在线的、很轻量级的操作,并且不会发生玩家数据冲突的问题。根据游戏的火爆程度,也可以很方便的通过添加节点的方式去动态调MongoDB集群的规模。
最后总结一下,为什么MongoDB越来越受欢迎游戏公司的欢迎?因为它完美解决了三个挑战。
l MongoDB的敏捷性可以让开发更高效,更快将新游戏推向市场。
l MongoDB的高可靠可以确保在极端苛刻的情况下,玩家的体验不会受到影响。
l MongoDB的分片扩展,可以完成全球同服,灵活弹性地对集群进行扩展,在离玩家最近的地方部署节点,为玩家提供最好的游戏体验。
MongoDB希望降低数据库的维护成本,提高开发效率;让游戏开发者更专注于构建游戏应用,实现游戏创新。
阿里云数据库MongoDB
在游戏行业的应用
——子兵
内容概要:
一、阿里云MongoDB简介
二、游戏MongoDB最佳实践
三、游戏MongoDB行业案例
一、阿里云MongoDB简介
阿里云MongoDB的部署形态分为单节点,副本集和分片集群,能够支持Serverless和专属集群。Serverless主要是在一些测试环境下可以做到按需收费。还提供安全把控措施,包括vpc、安全审计和全链路加密。运维方面能提供自动的弹性伸缩、高可用的能力以及备份和恢复,支持任意时间点恢复。还有监控告警和监控信息查看功能。
上图下方是一些工具平台,包括数据传输服务和开源的MongoShake。它们主要是为上云迁移、异地多活或者说不同版本数据之间迁移的场景提供DTS。数据管理服务(DMS)主要负责变更审批, 数据备份服务(DBS)主要负责数据备份恢复,包括异地备份和异地恢复。数据库自制服务(DAS)负责性能分析、会话管理和索引推荐等,此外 ,阿里云MongoDB还提供7*24小时的专家服务。
接下来重点解析关于阿里云MongoDB的几个部署形态。
l Serverless:它是一个比较常见的场景,提供计算资源按需计费能力,具有资源源用量低、简单易用、弹性灵活、价格低廉等优点,完美解决了 MongoDB 使用门槛高的问题,帮助中小客户轻松上云
l 单节点:它拥有超高的性价比,适用于开发、测试、学习培训及其他非企业核心数据存储的场景,可以根据各类场景的差异适配对应的规格配置,为企业降低更多的成本支出。但是它的高可用能力和SLA会弱一些,所以不建议在生产环境中使用。
l 副本集:它可以根据业务需要,例如阅读类网站、订单查询系统等读多写少场景或有临时活动的突发业务,按需增删Secondary 节点和 ReadOnly 节点,更好地实现读取性能扩展。
l 分片集群:它提供 Mongos、Shard、ConfigServer 三种组件,可*地选择 Mongos 和 Shard 的配置和个数,无限扩展性能及存储空间,组建不同能力的分片集群实例,非常适合高并发读写的场景
阿里云MongoDB的核心价值特征有以下几个方面:
l 开箱即用,不需要运维、备份、恢复、监控告警等操作,免除运维烦恼。
l 根据业务请求量做弹性伸缩。
l 高可用多活以及业务持续和数据可靠。
l 定期做全量和增量的备份恢复,并且支持任意时间点。
l 安全加固,通过网络、IP白名单、SSL+Ted等全链路加密方式,来提升数据安全性,降低数据被泄露的风险。
l 提供审计日志,云上所有的操作变更、访问查询等都会存储到审计日志,遇到特殊情况需要审计或者回溯的时候,有据可查。
l 支持不同的监控维度,性能数据负载情况和风险情况一目了然。
l DAS自动诊断以及支持7×24小时的智能优化和护航。
阿里云MongoDB支持几种不同的备份方式。
l 自动备份和手动备份,可以在控制台设置对应的备份策略,包括保留时间等等。
l 物理备份、逻辑备份和快照备份,也可以设置备份周期、保留时间、备份的方式和异地备份等,
备份存储在 oss上,可以达到99999999999的高可靠能力,大大提升了数据的可靠性。
它的恢复是支持覆盖到原实例的,可以快速恢复到历史的任意时间点。还可以克隆新实例,然后在新实例上做一些变更操作。还支持全量恢复和任意时间点的恢复,以及单库恢复。
单库恢复可以显著降低恢复时间。比如有四五个数据库的情况下,整体需要的恢复时间就比较长。单库恢复只针对需要恢复的数据库进行操作,效率是可以达到一个成倍的提升。
同时它还可以定期做备份有效性的验证,防患于未然。定期把数据恢复出来,检查它的一致性、数据可用性等,来避免真正需要的时候备份不完整或者不可用的情况。
MangoDB的全量备份主要分为三个方式。
第一种是原生的Mangodump方式,也就是逻辑备份,是把所有数据通过dump这种方式导出来。
第二种是物理备份,通过rsync或者CP/tar的流的压缩的能力直接拷贝物理文件,来完成备份。但是物理备份的一个痛点在于,备份过程中需加锁禁写,这对在线业务是会有一定影响的。
第三种是快照备份,主要依赖一些云盘的能力,比如在云盘上做snapshot。快照备份的速度很快,但它的空间占用会相对大一些。
接下来对三种备份方式各自的优缺点进行分析。
首先备份/恢复的成功率。因为逻辑备份过程中需要把所有数据导出来,它的时间、可控性和有效性比较低,遇到异常容易失败,所以它备份/恢复的成功率是比较低的。物理备份和快照备份的成功率比较高的。
快照备份的备份效率是最高的,因为它不需要做数据拷贝,所以它的耗时最低,物理备份次之,逻辑备份最低。
逻辑备份的恢复效率会也比较低,物理和快照备份相对比较高。
从灵活性上来看,逻辑备份有一个有点在于它可以跨平台或跨版本去做备份恢复,包括不同的版本、副本集合分片集都可以做恢复,不需要依赖特定的版本。但是物理备份和快照备份就需要强依赖对应的版本和存储引擎。
传统的CP和Rsync的方式在物理备份过程中对在线业务有一个锁表的过程,这个时候业务是无法写入的。所以我们在原生的存储引擎上做了内核层面的改造来支持热备份,使得阿里MongoDB在做物理备份过程中不需要锁表,也可以支持单库恢复。
阿里云对于以上三种备份方式都是支持的,但快照备份只支持云盘场景,因为它本身是依赖一个磁盘的特性。
接下来是关于弹性伸缩,包括它的scale up和 scale out能力。
scale up是纵向扩容的能力,这个过程中不需要做数据迁移,可以很好地避免数据迁移耗时久的问题。也可以做到自动弹性重组,无需提前做扩容,并且在扩容过程中能够做到滚动升级,保证对业务的影响降到最低。
scale out主要是在集群模式或复制集场景下,新增delay延迟节点、readonly节点或者secondary节点做运营分析的场景。在集群场景下,可以做到多个分片的快速扩容,加入新的节点之后也可以做到自动负载均衡,能够尽量降低对在线业务的影响。
阿里云MangoDB端到端的安全解决方案,分为事前、事中和事后。
事前是防护,提前把管控措施做好,来降低外围对数据库的影响,包括一些角色、权限的访问,或者IP白名单、ssl加密等。
事中是加密,进行 TED加密即对数据整体完全加密,即使数据泄露,也能保证具体内容无法查看,并且过程中还可以对审计日志进行操作。
事后是审计,比如复盘的时候,需要了解谁在什么时间点操纵了什么事情,可以很快地通过审计日志获取到。
上图是MongoDB整体的监控情况。MongoDB依赖于云监控,它能够达到秒级监控,并且支持的监控指标有18个大项、40多个子项,包括一些MongoDB的基础指标、请求次数、磁盘负载、内存、CPU等。CloudDBA可以根据监控信息和会话信息情况做一些性能分析,包括慢日志分析和磁盘空间的分析等,来提前的预测并且说降低线上的安全风险。
接下来重点介绍MongoDB的DAS服务。
首先是自动索引推荐。如果存在一些线上运行时间比较长或者慢查询消耗CPU和内存的情况,service控制台会自动推荐相应的索引来降低运维人员分析问题的时间,然后添加相应的索引来降低比如SQL查询的时间,提升整体效率。阿里巴巴集团经过3年以上的内部生产环境验证,索引推荐的成功率高达98%。
另外还支持会话管理,它会关注执行时间特别长的操作以及没有索引的操作,针对这些特殊的会话进行一些定制化的操作,可以通过会话管理结合索引推荐,来很好地对线上的负载情况进行分析和排查。
阿里云的MongoDB支持DynamoDB版本。比如游戏用户从aws上迁移直接迁移到MongoDB的改造量是比较大的,对此,MangoDB提供了两种形态的支持。第一种是兼容MongoDB的协议,跟原生的MongoDB没什么大的区别,第二种是支持Mongo DynamoDB的协议,DynamoDB的接入层和查询层都不需要做太大的改造。数据迁移过程中依赖的NimoShake也已经开源,可以直接从 aws DynamoDB迁移到阿里云MongoDB的分片集群或者复制集,跨云迁移的便利性得到了大幅提升。
MongoDB在云端的部署是一些副本集和分片集群,阿里云的数据传输服务DTS或者MongoShake,可以保证数据在多云之间、上云或多活的场景下进行平滑的迁移,它同时支持全量迁移与增量迁移。全量迁移是从云上不断地查询对应的数据,写入目标端,增量迁移是依赖于op_log方式做实时的迁移。比如我们可以全量加增量迁移完之后再做一个快速切换,来保证数据的一致性以及降低切换过程对整体时间的影响。
二、游戏MongoDB最佳实践
游戏行业分为不同的区域服务,分区分服务和全区全服。分区分服大多使用副本集,全区全服使用分片集群,比如用户数比较多的情况下用分片集群会比较适合。
l 多变需求:MongoDB本身的文档模型能够很好地支撑玩家属性、背包、道具等非常复杂的属性信息的重组,能够轻松应对需求变更。
l 游戏回档:它可以做到任意时间点恢复和单库恢复。
l 游戏滚服:能够基于备份集或者时间点创建新的实例。
l 链路安全:通过vpc、SSL以及IP白名单等方式来数据安全。
l 运营分析:它是MongoDB原生的支持。Aggregation pipeline、spark connector以及只读节点,在运营分析场景下都是比较有用的。
MangoDB延时节点的主要能力,就是在需要快速回档的情况下比如服务器宕机,可以立即切换到延时节点。并且延时节点不需要承担线上业务,保证了回档的高效率、低成本。
在游戏里面经常会存在一些限时技能/道具,MangoDB的TTL索引非常适合于这种场景。它可以在创建技能属性的时候就指定一个TTL索引,比如多久以后自动失效,省去了开发层面的代码实现和应用层面的判断。
再比如,很多大型游戏是基于地图作战,在游戏过程中需要判断某个玩家与我的距离以及我附近有哪些玩家等,此外还有利用地理位置作为社交系统的需求比如附近的玩家功能。MangoDB原生支持了这些功能,可以通过near、geoWithin、geoNearnaer三中查询方式来实现,大大降低了开发难度和代码量。
游戏回档是游戏里非常常见的场景,它主要是做任意时间点的恢复,本质就是一个备份恢复的过程。原生的MongoDB在恢复过程中,增量阶段耗时会比较长,而且它是单线程复制的,效率也比较低。
我们在MangoDB内核层面做了改造,在增量恢复过程中可以做到并行复制,大大提升了增量恢复的效率,此外还可以做到暗库恢复,不需要对整个实例所有的数据库全部进行备份恢复,只恢复需要的一些数据就可以了。
只读节点的能力主要在一些大的分析场景下比较常见。比如某个分析场景需要消耗大量资源,但又不能影响在线业务,这时候可以单独新增一个只读节点用来做大的运营分析,来降低对在线业务的影响。
三、游戏MongoDB行业案例
MongoDB非常广泛地应用于国内外的游戏行业。它的分片集群和副本集能力,它在高可用、扩展性、弹性伸缩上的优势,易于部署的特性和文档模型都能很好地匹配游戏场景,大大提升开发效率,解决游戏行业需求变化快的问题。
MongoDB在游戏里面有几个比较常见的应用场景。
游戏开发,主要用于存储玩家的属性信息等;客户平台,即会员中心或用户中心,一款大的游戏可能有上千万用户,会需要进行一些大的存储和读写,MongoDB的分片集群能够很好地支撑这类需求;第三游戏社交,比如游戏内的地图;还有游戏商城和排行榜等。
最后介绍一个MangoDB的应用案例,阿里云的SLG游戏——三国志战略版。三国志战略版从19年推出至今,一直经久不衰。它的核心游戏服务全部都是基于阿里MongoDB实现的,它也在游戏内部的场景上应用了很多MangoDB原生的特性,而且达到了很好的的稳定性、安全性。