感谢各大公有云不断的技术创新,使得人(zhi)丁(you)稀(1)少(ge)的我们,能够在三个月内完成支持在线2万人的服务器组,以支撑即将到来的江湖X资料片“世界服”。
本文主要写给程序猿看,所以会有大量的晦(zhuang)涩(bi)语句,不感兴趣的还是跳过吧。。吐槽在最后
正文
本文主要是短句子的罗列。
组成:
我们一个标准的服务器组,由以下部分组成:
1.两个负载均衡,一个挂目录服,一个挂游戏服;负载均衡由阿里保证双可用区高可用;
2.至少两个目录服ECS,分别在两个可用区;
3.至少两个游戏服ECS,分别在两个可用区;
4.至少一个管理服ECS;
5.至少有一个实例充当所有ECS的备用;
6.三个Mysql数据库,账号mysql,数据mysql,统计mysql,阿里保证双可用区高可用;
7.两个Redis,数据redis和公共redis,阿里保证双可用区高可用;
要点 :
· 为了与客户端代码语言的一致性(U3D),我们后台都是用.Net实现的,所以所有实例都是windows实例,逼格比linux少了90%,易用性提升90%(PS:VS是世界上最好的IDE);
· 将所有在线玩家的存档数据(约500kB/人),放在一个高性能的支持事物的数据redis里面,由这个redis来充当“公共内存”,给多个游戏服ECS使用;
· 玩家离线一定时间之后,将存档数据序列化存入Mysql;玩家再上线的时候,从mysql取出数据反序列化放入redis;
· 所有的统计数据和不需要多次查询的数据,放入一个专用的“统计Mysql”;
· 所有的玩法级别的东西,例如PVP,世界boss,好友系统等,都放入一个redis里面,我们称为“公共redis”,这个redis其实是当数据库使用,redis本身就支持持久化(用阿里默认的备份功能就行);
· 所有服务器配置放在mysql里,目录服和游戏服初始化的时候会去数据库加载配置;
· 目录服处理玩家注册、登录,以及游戏版本、服务器状态和热更包的下发;
· 游戏服主要是保持与玩家的socket长连接,并与mysql/redis交互数据,自身内存不保存任何状态信息;
· 管理服主要是用来管理所有的mysql和redis,并计算一些玩法级别的东西,例如PVP结算,世界boss结算,客服后台,邮件公告等;
优缺点:
· 游戏服ECS不保存任何状态,不需要考虑同步、加锁等问题,随点随用,一秒重启不是梦(手游里,秒级的数据丢失是可以接受的);
· 通过redis和mysql的原生事务来保证原子性,不需要coding来实现,省时省事效率高,虽然性能低下,不过性能,够用就行;
· 充分利用公有云的高可用性和一切便利性,能不自己做的坚决不自己做,能花(xiao)钱解决的坚决不花时间;(这一点大家算算程序猿工资就知道哪个划算了,现在一个实例才多少钱);
· 参考上点,这么做的一个缺点就是花费稍微大了点(多了redis的花费,很贵;多了一些实例,因为CPU没用满,可以用性能换空间),从一千块一个月变成了两三千一个月,一年多出了一个程序员的月薪(手动滑稽);
Redis相关:
· 江湖X每个在线玩家,对“公共redis”,会产生大概每秒2-3的QPS(最早的设计,好蠢,还不能改);
· 阿里云和Ucloud目前的主备版redis,能支持6万的QPS;
· 单台实例连接redis,能达到2万的QPS,四台实例的时候,每台1万5的QPS;
· 一个玩家在redis中的数据,平均为500k(好蠢,同上);
· 所以,一个16G的redis,能支持1.5-2万在线,3万左右的数据保有量;
· 以20万日活来计算,玩家离线3小时,就需要把数据从redis移到mysql;
· 单台实例能支持5000-7000的在线用户;
· 如果单台16G实例扛不住,考虑加多个redis,只需要维护一个用户所在redis的表就行,一个用户只能在一个redis里;
· redis尽量用hash,能比key-value快一半;
· servicestack.redis,推荐4.0版本以上,事务回调很完善;
· 阿里不支持sync命令,无法自建slave实例;Ucloud支持sync命令,所以slave可以走起;
· Ucloud的redis没有密码。。没有密码。。。所以不小心一个flushall,就哭吧,适合小公司;
· 阿里最近上了集群版的redis, 最小16G,QPS令人发指(几十万),不过不支持事务。。。。如果自己在程序端实现了redis事务而不用原生事务(米哈游就自己写的),那么用集群版redis,几十万在线不是梦啊,以后会不会是一个集群redis,挂着几十台1核1G的实例,最便宜的1核1G只要33/月,10台330,能跑几万个TCP长连接;
网络相关:
· 由于主要的计算都发生在客户端,因此江湖X的网络负载很小;
· 历史遗留原因,我们采用Scut来做多用户管理和网络分发(socket),并且到目前为止,表现不错;
· 采用负载均衡,并且按量付费,是目前最适合我们的解决方案;(负载均衡一般都能支持几十万的TCP连接)
· 热更包地址由目录服下发给客户端,客户端去CDN上下载;
· 阿里的cdn越来越好用,秒级回源,不过有时候也会挂掉(今年挂过一次);
· 阿里出过一个事情,就是某台实例的IP被中国移动给ban了,导致所有移动玩家上不去服务器;
· 一般玩家说掉线频繁,第一反应都是问对方,“你是不是中国移动4G“,95%都是;
Mysql相关:
· Mysql还挺贵的;
· 一个用户一秒才0.3次QPS,所以2核4G的mysql应该够我们用了;
· mysql和redis可用区切换,程序要自动重连(感谢servicestack);半年内,有一个mysql切换过一次;
· 定期看一下慢日志,说不定就找到一些漏网之鱼没有建索引;
· Ucloud的Mysql,回档会损坏blob数据,原因未明,需要问一下;
计算相关:
· 除了rank系统,计算量都几乎没有;
· 数据从redis移动到mysql计算量比较大,交给管理服;
· rank系统的战斗计算,需要在服务端进行,准备引入MQ,通过MQ来进行计算任务的下发和结果的采集;
· 一些定点结算(遍历所有玩家)的任务,都在管理服做,例如排行榜结算、世界boss结算,活动结算;
· CPU比较过一次,各家相同价位都差不多;
磁盘相关:
· 对磁盘I/O没有任何要求,所以阿里云用起来没有问题(阿里云的磁盘I/O就是辣鸡,ssd盘都比不过ucloud的普通盘)
各家吐槽:
· 阿里,对磁盘没有要求的话,阿里是最佳选择了,稳定性,易用性很好,价格不贵,就是服务差,店大欺客,买了就不能退(包月),退还要手续费(包年),以前吃不完的还不能打包(不能降配),就是一黑店啊;另外,高可用和高并发,阿里说第二,没人敢说第一;
· Ucloud,阿里降价之后,价格大概是阿里的80%。优点很明显,服务好,还有,包月包年机器随时可以退,并且只计算发生费用,这简直逆天啊;缺点也很明显,可用区少啊。。全国只有北京有多可用区,还资源紧张;我们需要的华南只有一个可用区,只好挥泪斩马谡;还有就是太灵活,以致不敢用,特别公司大了,风险比较大,例如mysql给root权限,redis无法设置密码等;
· Azure,听说用它的人才能准确发音,反正我发不准。这是世界上唯一的一个公有云,产品文档是由程序猿完成的,并且,还是机翻成的中文。这都还好,增加的是学习成本,但是,价格是阿里云的两倍是几个意思?
· AWS,如果要有海外服,我们首选就是AWS,没什么好说的;额,同理,国内的AWS,也没什么好说的,”不敢“用;并且,机房在北京和银川,离广东太远了,电信南北光纤,最近每个月要故障两次,丢包15%,电信威武;
· 华为云,功能少,贵;
· 比格云,宣传得很有逼格,不敢用,有待时间验证其稳定性;
· 京东云,联系过,没叼我们;
· 腾讯云,持续关注,有可能会要用(应用宝上游戏必须架在腾讯云上);