2015年第一季度,中国网络游戏市场规模达到320.8亿,环比增长8.0%,同比增长24.7%。其中移动游戏占比31.0%。相对于传统的端游,手游的兴起给运维工程师的技术能力和运维理念都带来了巨大的挑战。这是因为手游在技术架构、运维体系方面存在众多特殊的要求。本文首先分析手游运维的特点,然后再从手游的架构、容量规划两大方面给出很好实践的推荐。
在手游运维领域,我们经常会听到一些专用名词,在这里我们首先对这些专用名词进行简单说明以期读者能对手游运维有个概念的认识:
上述几个指标中,下载数、激活数、注册数是预估手游公测首日可能带来的用户导入量的最重要评估依据。
日活跃登陆数,特别是公测首日的活跃登陆数,是评估手游发行效果的重要数据。
日最高在线数的承载能力是进行容量规划时需要满足的服务能力。
在推荐手游架构之前,我们需要深入了解手游运维和端游运维的异同点,以此分析为基础,再推导出合理的手游架构。
手游运维和端游运维的共同点和区别主要体现在下述四个方面:
目前的大部分手游在设计客户端和服务器端通信模型时,采用了HTTP协议。
使用HTTP协议的通信方式,有以下的优点:
基于上述分析,并结合盛大游戏在运维大型手游过程中的实践经验,我们推荐实施这样的网络手游架构:
图1 推荐的手游架构图
在设计这样的手游架构时,我们重点考虑的几个方面如下:
配置高频CPU。作为手游逻辑的主要处理单元,Web服务器往往执行大量的CPU运算,比如玩家攻击能力计算、攻击效果计算等。
这个服务组的作用一般包括预加载配置项以及缓存数据库查询结果等。使用Memcached提供的高效内存缓存,可以提高响应速度。
在这样的架构设计中,体现手游运维对于高可用性、安全性、高性能的要求。在运维人员设计相关规划时,可以参考该架构进行实施。
如上文所说,手游相对于端游的生命周期更短,因而留给运维人员的准备时间也就更少。这就要求我们在短时间内对手游运营需要的各种资源规划到位,手游容量规划是一个必不可少的环节。
容量规划(Capacity Planning),是指在系统上线前或系统运营过程中,通过分析业务走向,对系统需要的各种网络、计算、存储资源进行提前规划和准备。目的是在这种业务变化时,系统承载能力可以随着要求变化进行灵活的应对。
为了用户在3G、4G、WIFI(中国电信接入、中国联通接入、中国移动固网接入)等终端网络切换时得到良好的游戏体验,手游服务器需要部署在多线机房,由此可以很好的满足用户多种方式上网的需求。
如下图所示是我们某个手游玩家按照ISP来源的分布情况:
图2 手游玩家ISP分布
由上图,也验证了我们必须把服务器部署在多线机房,以满足不同接入的手游玩家。
多线机房的实现原理和特点如下:
高速Internet接入、冗余的网络和带宽管理系统保证接入带宽可根据用户流量的需求随时扩充,充分满足用户日益增长的网络应用需求。
在选择和对比多个多线机房时,机房的冗余带宽、对抗DDOS攻击的能力,是评估的2个最重要方面。高冗余带宽(10G以上)、高抗DDOS能力(20G以上),是我们倾向的选择。
网络带宽规划的数据来源主要有两个:一个是在小规模测试时收集到的玩家平均带宽使用量,以kbps/每玩家计算;另一个是使用机器人(指能够模拟玩家进行游戏内容测试的自动化程序)测试时收集到的类似数据。
在进行网络带宽规划时,需要对以下三个方面的内容分别进行评估:
在规划Web服务器承载能力前,需要分析目前的计算瓶颈。
以PHP FPM类型的Web应用程序为例,有以下的两个参数务必需要设置:
在Java程序中,可以使用Log4j在关键调用处记录相应的执行时间,如对外部API请求、对数据库调用、对缓存服务器调用、排名计算等等。通过这些数据,我们能够获取到可能影响系统性能的关键信息,在有针对性的解决后,再进行相应的容量规划。
Web服务器负责对手游业务逻辑的处理,对CPU要求较高。因有负载均衡设备调度,单台服务器对可靠性要求不高。如果服务器宕机,由于调度系统的存在,系统会自动把请求切换到其他服务器上,给玩家造成的影响较小,这点就和端游不一样(端游上玩家会掉线)。对单服务器要求较低,服务器选型上可有更多的选择,比如说采用一些多节点服务器。在压力测试时,我们首先在负载均衡器上设置流量只分配给一台服务器,然后评估它的压力情况。以此数据作为支撑,可以计算出总计需要的Web服务器数量为预计最大同时在线玩家数除以单台承载能力。
Memcached服务器组为Web服务器组提供缓存服务,同时减轻了数据库的查询压力。
Memcached是基于内存的key-value型缓存,无磁盘IO读写,效率非常高。在对Memcached进行容量规划时,我们需要关注的是热点缓存数据的分布情况。
热点缓存数据,是指Web服务器程序请求次数最多、产生最大网络流量的缓存数据。如果热点数据比较分散,我们可以部署多台Memcached同时使用客户端对key哈希的方法(如一致性哈希算法)进行压力分担。盛大游戏遇到过一个极端情况是,热点缓存数据集中在某个key上。此时,使用客户端哈希是没有效果的(因为一个key只能分布在一台服务器上),达不到压力分担的效果。
如下图所示,其中一台在线Memcached的带宽使用已达到瓶颈:
图3 单台Memached带宽使用量
单一热点数据产生大量带宽需求的情况下,可以使用的方案是对缓存服务器进行网络端口Bonding。关于使用Bonding方法提高带宽吞吐量的方法,请参阅《Linux运维很好实践》一书“第3章 概述负载均衡和高可用技术”的内容。
对Memcached热点数据的分析,推荐使用memkeys工具(https://github.com/bmatheny/memkeys)。memkeys是tumblr开源的类似top的工具,可用于实时查看memcached的key使用情况。
memkeys的安装命令如下:
memkeys的使用方法如下:
由此,我们可以按照单位时间内请求次数、带宽使用率来排序分析出热点数据。如下图所示,memkeys的输出格式为:
通过对当前Memcached的请求情况分析,可以有效的判断是热点数据的分别是否均衡。
另外一个需要注意的事项是Memcached的启动参数,默认情况下,它支持的并发连接数是1024,如下所示:
在上线前,务必要提高该值。在我们的实践中,曾经发生过因为前端服务器过于繁忙导致连接数用光的情况。Memcached当前的连接数情况,使用如下命令获取:
数据库存储了手游中的持久化数据,提高数据库的响应效率对提高手游体验起到关键作用。进行数据库容量规划时,需要严格按照以下的规则进行:
1、数据库配置参数、表结构和SQL语句评估。
进行数据库评估的目的是分析数据库软件配置参数与硬件能力是否匹配、分析表设计与SQL语句的效率关系。
以MySQL为例,在数据库配置参数方面,主要考虑增加innodb_buffer_pool_size为系统可用内存的60%。分析数据库表结构设计时,对主键、索引是否完整、有冗余、表引擎的一致性、字段类型的高效性进行分析。SQL语句评估时,考虑对多表联合查询、limit、复杂查询语句进行优化。在无法直接进行SQL语句优化的条件下,可以考虑通过业务逻辑的调整来减小数据库压力(这一步可能涉及到游戏策划、产品经理的沟通,一般比较难)。
2、数据库分库分表设计。对于访问频繁的数据量巨大的表,如用户注册表,必须采用拆分的方法,使其分布在不同的数据库服务器上。对于log库,由于其对于游戏来说,是非核心数据,也需要单独拆分,以缓解核心数据库的压力。
3、使用数据库读写分离技术。数据库读写分离技术,在数据库分库分表的基础上,又进行了一层压力分解。在MySQL中,通过配置主从复制(Replication)可以获得以下的好处:
4、使用SSD提高随机读写iops。手游的大区制,使得数据库的压力被集中起来,同时不同等级的玩家所具有的不同的游戏行为也加剧了对数据库的压力。使用SSD可以最大限度的提高服务器的iops,以应对这种读写压力。
5、存储容量规划。在数据库中,一般会记录较长时间的玩家游戏日志,这一部分数据随着运营时间的增加,对存储容量要求越来越多。评估方法是根据内测期间玩家数量和日志数据量计算出,每日每玩家大概产生的数据量。所需要的存储容量为每日每玩家大概产生的数据量乘以保留天数再乘以每日预估玩家数量。
在手游运维时,除了考虑到手游系统之外,还应该考虑官网、论坛等的访问能力。
在游戏维护期间,玩家往往会转向到官网和论坛,此时会产生大量的并发请求。官网和论坛基本都是基于Web的服务,考虑容量规划时,可以参照本文Web服务器承载能力规划的内容。
人数曲线实时地反映了在线玩家的情况,也同时能够反映游戏系统运行状态。
在设计人数曲线接入时,我们使用了基于Web请求日志分析的方式。人数曲线的接入步骤如下:
手游是近年来网络游戏领域中异军突起的一个重要分支,得到越来越多游戏公司的重视。掌握手游运维的关键技术,是提高运维人员自身价值的必要手段。本文从架构角度切入,给出了盛大游戏推荐的设计思路。希望能够帮助读者从宏观上把握手游运维体系的特点。手游上线前的容量规划,是保障手游系统不被过载、保障业务稳定性的关键环节。文章从机房、网络到各种角色服务器组的容量规划进行了深入探讨,如果读者在进行容量规划时能够遵循这些建议,那么我们可以对系统承载能力做到胸有成竹、从容不迫。
关于:中科研拓
深圳市中科研拓科技有限公司专注提供软件外包、app开发、智能硬件开发、O2O电商平台、手机应用程序、大数据系统、物联网项目等开发外包服务,十年研发经验,上百成功案例,中科院软件外包合作企业。通过IT技术实现创造客户和社会的价值,致力于为用户提供很好的软件解决方案。联系电话400-0316-532,邮箱sales@zhongkerd.com,网址www.zhongkerd.com