精通手游运维的架构体系

  手游客户端更新容量规划。评估方法是根据手游客户端的更新内容大小乘以预估的公测当日导入的手游玩家数量。手游客户端更新通过接入外部CDN可以适当分担流量压力。

  异常流量规划。这个主要是指在手游运维中,受到大规模DDOS攻击时的处理规划。在进行这种容量规划时,需要充分考虑到机房运营商接入的带宽,采用分级规划。在第一级小规模DDOS时(小于5G),启用自有的流量清洗设备。在更大规模的DDOS时,启用运营商级别的保护,以降级服务的方式,阻止来自某一方向的攻击流量(该方向的正常访问也会受到影响)。

  Web服务器承载能力规划

  在规划Web服务器承载能力前,需要分析目前的计算瓶颈。

  以PHP FPM类型的Web应用程序为例,有以下的两个参数务必需要设置:

  slowlog /var/log/php-fpm-slow.log。用于指定PHP执行时慢日志的记录位置。PHP慢日志,用于定位PHP程序执行慢的原因,是最重要的日志。

  request_slowlog_timeout 1s。用于指定对于执行时间超过1s的PHP脚本,记录程序执行调用情况(backtrace)到slowlog指定的位置。

  在Java程序中,可以使用Log4j在关键调用处记录相应的执行时间,如对外部API请求、对数据库调用、对缓存服务器调用、排名计算等等。通过这些数据,我们能够获取到可能影响系统性能的关键信息,在有针对性的解决后,再进行相应的容量规划。

  Web服务器负责对手游业务逻辑的处理,对CPU要求较高。因有负载均衡设备调度,单台服务器对可靠性要求不高。如果服务器宕机,由于调度系统的存在,系统会自动把请求切换到其他服务器上,给玩家造成的影响较小,这点就和端游不一样(端游上玩家会掉线)。对单服务器要求较低,服务器选型上可有更多的选择,比如说采用一些多节点服务器。在压力测试时,我们首先在负载均衡器上设置流量只分配给一台服务器,然后评估它的压力情况。以此数据作为支撑,可以计算出总计需要的Web服务器数量为预计最大同时在线玩家数除以单台承载能力。

  Memcached承载能力规划

  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的安装命令如下:

  wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz #下载autoconf

  tar zxvf autoconf-latest.tar.gz

  cd autoconf-2.69/

  ./configure

  make

  make install

  yum -y install gcc-c++ pcre-devel libpcap-devel #安装依赖库

  git clone https://github.com/tumblr/memkeys.git #下载memkeys源代码

  cd memkeys

  export CXX=g++44

  ./autogen.sh

  ./configure

  make

  make install

  memkeys的使用方法如下:

  /usr/local/bin/memkeys -i eth0 -r 10 #-i指定网络端口,-r指定输出的刷新频率

  由此,我们可以按照单位时间内请求次数、带宽使用率来排序分析出热点数据。如下图所示,memkeys的输出格式为:

物联网