游戏全区全服和分区分服 QQ斗地主的设计
游戏全区全服和分区分服 QQ斗地主的设计
https://cloud.tencent.com/community/article/164816001481011910?fromSource=gwzcw.59769.59769.59769
https://cloud.tencent.com/community/article/164816001481011911
QQGame防专线中断系统介绍
先说说背景
QQGame是一个全区全服的休闲类游戏平台和社区,主逻辑服务器部署在四大IDC,核心DB全部在深圳。对跨IDC的专线依赖度很高。
网平提供专线故障后切VPN的备份机制,当VPN也中断时QQGame在线会下降到0.
窄带IDC、孤岛IDC无法提供游戏服务。
再说说分析
专线断了进行容灾,无非是数据走外网。外网能抗住么?其实木有人能告诉你。
1.公网包量、流量测试
24小时包量测试:
压力:大约每分钟310w包,每个包为139Byte
结果:在24小时之内一共传输2202271493个包,
成功2202247061个包,失败24432个包。
失败率:0.0011%,
24小时之内失败一共只有5次,为网络抖动。
12小时流量测试:
压力:大约每分钟40w包,每个包大小为4k-10k
结果:深圳IDC入流量:100Mb/s,出流量: 150Mb/s,
收包数等于发包数,无丢包
2.网速测试
非高峰期(6月25日09点)测试结果如下表:
高峰期(6月26日21:30)测试结果如下表:
测试数据表明,
专线在闲时和忙时都很稳定。
外网在忙时ping值会有升高,跨运营商(红色)的ping值可高达200ms. 不夸运营商的情况ping值低于100ms. QQGame跨专线的流量用于玩家登录服务器时获取DB数据,游戏交互过程不受此延时影响,因此对于QQ游戏来说完全可以接受。
外网状况从包量、流量、网速三个方面都可以支撑QQGame跨地域服务器通信需求。
最后说说设计
正常状态下:MainSvr-àProxy---(专线)-àGameDB
专线中断了:MainSvr-àProxy--àOfProxy----(外网)-àObProoxy-àGameDB
惨绝人寰的事情发生了。。。。
专线中断并且外网中断,IDC处于孤岛状态。。
孤岛模式: MainSvr--àProxy--àOfProxy--àNewLCDSvr
偏远地区时可以使用的节省带宽模式:
MainSvr-àProxy--àNewLCDSvr(合并流水后发包给DB)---àOfproxy----(外网)-àObProxy--àGameDB
全貌图:
看看效果吧
QQGame在具备防专线中断容灾能力前,一旦出现专线中断故障,QQGame区域IDC的在线人数会迅速下降。。。趋近于0在线。。。。恐怖。。
7月19日的专线中断演习,系统进行内外网切换的决策的几十秒内有在线的轻微影响。切换完成后,在线完全无影响。
写在最后
QQGame的防专线中断系统的设计思路首先将其作为一个旁路系统,在standby状态时,尽量减少对系统核心架构的影响,没有带来任何额外的专线流量。(NewLCDSvr Cache填充是由正常的专线数据在IDC内ByPass完成。)
其次,作为容灾系统需要有自动化运营能力。否则,真正专线故障时,手动切换带来的时间损耗会大大降低系统的效能。
最后,QQGame这种多地域、多IDC部署的全区全服系统有其自身的特殊需求,在具备了足够大的用群体后才有防专线中断容灾的现实需求。在做系统设计的时候需要因地制宜为了产品、用户而去考虑系统设计,绝对不能为了容灾而容灾、为了设计而设计。共勉。
浅谈全区全服架构的SNS游戏后台
首先说下分区分服和全区全服的概念,查了一下资料,没有找到合适的定义。说下自己的理解:所有游戏服务器都有玩家数据库,如果以数据库为单位划分 Set ,单 Set 如果能承载超过10万的同时在线,可以认为是全区全服的游戏,10W以下可以认为是分区分服的(10W只是个人的标准)。早些年设计的 mmog 游戏游戏交互频率高,要求网络延迟低,需要就近接入,所以大多采用分区分服的方式。而 SNS 游戏,以好友关系链作为主要玩法,单服需要大量的注册用户,且对网络延迟要求不高,所以大多采用全区全服的方式。
全区全服并不是说一个游戏只有一个大区。比如逆战,分了电信区和网通区两个独立的大区,就近部署服务器,减少网络延迟给玩家的影响,类似的还有 QQ 飞车等。
全区全服的SNS游戏代表有 QQ 农场、摩登城市、夜店之王,分区分服的游戏代表有幻想、御龙在天等。
接下来以摩登城市( QQCity )为例,谈谈在全区全服的 SNS 游戏开发中遇到的问题。QQCity 是一款模拟经营性质的 SNS 休闲游戏,以城市建设为主线,融合偷菜的玩法,最高在线人数上十万,日活跃上百万。后台架构如下图所示,玩家进入游戏,首先通过 DIR 服务器获取 GameServer 的 IP ,建立长连接,所有的游戏逻辑都在 GameServer 上实现,玩家在游戏过程中数据发生变化时通过 DBServe r写入全内存数据库 TMem 。玩家拉取关系链、付费、防沉迷及日志服务器等辅助模块则通过 tbus 组件与 GameSvr 通信。
全服全服游戏在设计和部署中一些不同于分区分服的地方,从以下4个方面大概说一下:
一.可扩展性
对于SNS类型的游戏,PCU到达10w甚至100W都是有可能的,所以在服务器设计之初就要考虑所有的功能模块都要具有可平滑扩展的能力。通过上面的架构图我们可以看到,摩登城市的GameSvr、DBSvr、TMEM以及辅助模块都是以服务器组的形式出现的,对于某个功能都有几台服务器一起分担外部的请求。由于SNS游戏的特性,在做扩容的时候最好能做到不停机。
1.逻辑服务器扩容
由于 GameSvr 之间关系相对独立,在不停机增加 GameSvr 的时候我们只需要将新增加的服务器与各个内部的功能模块之间建立通信关系就可以了,摩登城市游戏服务器之间通信使用了 TBus 组件,tbus 支持动态的刷新通道,我们所需要做的工作只是让辅助模块以及 DBSvr 能够动态的发现新增加的 GameSvr,可以通过 reload 或者定时检查的的方式实现。
前面已经说到,登陆游戏首先向 Di r服务器请求 GameSvr 的 IP,所有 GameSvr 向 Dir 定时上报当前负载、提供服务的 IP 和端口,所以新加服务器的就会暴露给外面玩家。
2.功能模块的扩容
DBSvr 与各个辅助模块想要不停机动态扩容的话,相对来说复杂一些。难点在于,新增服务器要分担其他服务器上的负载,要保证服务的无状态性,举例来说:玩家A上次请求是通过 SocialSvr1 拉取好友关系,这次的请求能否通过新增的 Social2 来执行,取决于 SocialSvr1 上是否有保存影响到拉取好友关系的临时信息(如 SessionKey 等),如果没有,说明 SocialSvr2 可以相应A的请求,实现动态扩容。
3.TMem数据库模块
TMem已经实现了动态扩容的功能,并且在运营摩登城市的过程中,经过了实战检验。
二.负载均衡
谈到平滑扩容就必须聊聊负载均衡了,对于同一个功能模块的一组服务器如何实现压力分担,就是个人理解的负载均衡。
1.逻辑服务器(GameSvr)的负载均衡
逻辑服务器是直接与玩家进行网络通信的服务器,实现负载均衡有一些现成的解决方案,如LVS、TGW 等,都可以达到网络层的平均负载。摩登城市没有选用这些方案,而是增加了Dir服务器,可以应用到一些特殊的场景,更加灵活控制每台逻辑服务器是否开启和在线人数。从运营后的数据来看,电信玩家与联通玩家数量比大概为2:1,所以现在外网电信GameSvr的数量是网通的2倍。
2.功能模块的负载均衡
QQCity 采用按 QQ 取模的方式实现,这样做好处有两点:
实现简单,逻辑服务器向后端发送请求时只需要取模的方式确定发送到哪个 IP。
定位问题方便,可以确切的知道处理单个玩家逻辑是哪台服务器。
3.数据库 TMem 本身具有负载均衡的机制。
三.容灾策略
摩登城市的容灾方法基本是依靠心跳包,检测服务器状态实现的。
1.逻辑服务器
上面已经提到,逻辑服务器会定时发送心跳到 DirSvr ,如果某台 GameSvr 出现宕机
或者硬件问题,上报心跳包超时,Dir 就会把它设置为不可用状态,不会再把这台服务器推送给新进玩家。已经连接到这台服务器的玩家通过刷新页面的方式会重新连接到可用服务器。
当这台服务器恢复后,上报心跳包给 DirSvr,DirSvr 将其设置为可用状态。
2.功能模块
所有为其他 Server 提供服务的模块都会有心跳包发到其他 Server ,以便于其他 Server 知道当前模块是否可用。如架构图中所示 SocialServer 会发送心跳包给所有的 GameServer ,如果 SocialServer1 出现故障,心跳包超时,所有 GameSvr 发往 SocialServer1 的请求就会平均的发送到其他的 SocialServer 上,直到 ScocialServer1 恢复工作。
四.服务器部署
玩网游的人都知道一句话,世上最远的距离不是从美国到中国,而是从网通到电信。作为网络游戏的开发者,如果不考虑国内的网络环境,将会死的很惨。一些从国外引入的游戏,都或多或少的面临着网络的考验。
前面已经讲过,SNS 类的游戏对网络延迟的并不是很敏感。所以摩登城市的服务器没有就近部署,而是集中部署在上海市北 DC 和上海江场联通机房。
考虑到电信用户数量要远远大于联通用户,所以所有功能模块、数据库、电信 GameSvr 都部署在上海市北 DC,部分联通的 GameSvr 部署在上海江场机房,联通的 GameSvr 拉取玩家数据以及其他请求通过同城专线。
以上几点是在开发摩登城市过程中的自己的一些心得体会,难免会有偏颇,希望各位大神斧正,有说的不明白的地方欢迎骚扰。最后为现在所做的项目将魂做个广告,将魂是一款三国背景的战棋类回合制网页策略游戏,有风格各异的武将、刺激多样副本和精美的动漫画面风格。既可以游戏中体验经典的三国历史故事,又可以收集各种武将并带领他们去参加各种激烈的战斗哦!
游戏全区全服和分区分服 QQ斗地主的设计的更多相关文章
- 浅谈全区全服架构的SNS游戏后台
版权声明:本文由梁本志原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/198 来源:腾云阁 https://www.qclo ...
- 一文搞懂│mysql 中的备份恢复、分区分表、主从复制、读写分离
目录 mysql 的备份和恢复 mysql 的分区分表 mysql 的主从复制读写分离 mysql 的备份和恢复 创建备份管理员 创建备份管理员,并授予管理员相应的权限 备份所需权限:select,r ...
- Hive 实战(2)--hive分区分桶实战
前言: 互联网应用, 当Mysql单机遇到性能瓶颈时, 往往采用的优化策略是分库分表. 由于互联网应用普遍的弱事务性, 这种优化效果非常的显著.而Hive作为数据仓库, 当数据量达到一定数量时, 查询 ...
- win7系统玩游戏不能全屏的解决办法
1.修改注册表中的显示器的参数设置 Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置: HKEY_LOCAL_MACHINE\SYSTEM\ ...
- 国内开源html5游戏引擎全收录
本文引自<国内开源html5游戏引擎全收录> 游戏开发这潭水太深,英文水平太差,不敢看国外的, 而且这几年国内技术水平也挺高了不少,特别是JS方面.(我个人感觉) 最近看了几个国产的js游 ...
- 所有Windows7下游戏的全屏问题
Win键+R键,打开运行窗口,输入regedit 回车,这样就打开了注册表编辑器,然后,定位到以下位置:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ ...
- FreeSql (三十一)分区分表
分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中.把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,数据库不同实现方式有所不同. 与分表不同,一张大表进行 ...
- SqlServer数据库分区分表实例分享(有详细代码和解释)
数据库单表数据量太大可能会导致数据库的查询速度大大下降(感觉都是千万级以上的数据表了),可以采取分区分表将大表分为小表解决(当然这只是其中一种方法),比如数据按月.按年分表,最后可以使用视图将小表重新 ...
- Go游戏服务端框架从零搭建(一)— 架构设计
五邑隐侠,本名关健昌,10年游戏生涯,现隐居海边. 本教程以Go语言分区游戏服务端框架搭建为例. Go语言是Google开发的一种静态强类型.编译型.并发型.具有垃圾回收功能的编程语言.语法上近似C语 ...
随机推荐
- 【java】Java相关学习参考链接(持续更新)
How to do in java,https://howtodoinjava.com/,Java手册,分版本,并且有每个版本的新特性的详细解析. Java World,https://www.jav ...
- 字符串(2)KMP算法
给你两个字符串a(len[a]=n),b(len[b]=m),问b是否是a的子串,并且统计b在a中的出现次数,如果我们枚举a从什么位置与匹配,并且验证是否匹配,那么时间复杂度O(nm), 而n和m的范 ...
- 进入django
web应用,c/s,b/s架构 c/s: 客户端 服务端 b/s: 浏览器 服务器 HTTP协议: 超文本传输协议 四大特性: 1.基于TCP/IP作用在应用层之上的协议 2.基于请求响应 3.无状态 ...
- 《剑指offer》第一个只出现一次的字符
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 2018秋季C语言学习总结
2018秋季开始学习c语言 1.printf格式化输出函数 2.基本数据类型,int整型,float浮点型,double双精度浮点型,char字符型 3.算数运算符 +加法,-减法,*乘法,/除法,% ...
- ASP.NET 多环境下配置文件web.config的灵活配置
调试,发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常常有调试,发布的需求,就需要常常修改web.config文件,这往往 ...
- symfony-表单学习
---恢复内容开始--- 构成表单的几个元素 1.数据模型 M 一种比较抽象的概念,按我的理解来说,本质上就是数据的一种存在形式,可以看做一个类,一般对这些模型进行crud操作.一种是真实存在的数据模 ...
- 揭开JS闭包的面纱
今天看了关于js闭包方面的文章,还是有些云里雾里,对于一个菜鸟来说,学习闭包确实有一定的难度,不说别的,能够在网上找到一篇优秀的是那样的不易. 当然之所以闭包难理解,个人觉得是基础知识掌握的不牢,因为 ...
- [wordpress]WordPress地址(URL)错误,修改解决方案
本人在修改Wordpress地址(URL)时,误操作使URL指向错误,后台无法进入. 解决方案 1.先利用Putty登陆到自己的服务器上(这里登陆方法我不再赘述): 2.登陆MySqL,并输入密码: ...
- Google代码规范
文件名 文件名须全部小写,下划线(_)和短横线(-) 源文件采用 UTF-8 编码. 非空代码块:K&R 风格 左花括号不另起新行 左花括号后紧跟换行 右花括号前需要换行 如果右花括号结束了语 ...