文 - 篇  访客 -

20220811 - 大型网站架设负载均衡架构


  分类:03 产品与设计理念  / 
更新:2024-01-15 17:25:13  /  创建:2024-01-15 17:55:13
不要删除

大型网站架设负载均衡架构

2022年08月11日

保证同一个客户请求转发到同一个后端服务器

游戏服务器高负载

SAP 系统的架构大致分三层,分别为应用服务器层消息服务器层数据库层

在弹性负载均衡服务中创建一个负载均衡器。该负载均衡器会接收来自客户端的请求,并将请求转发到一个或多个可用区的后端服务器中进行处理。请求的流量分发与负载均衡器配置的分配策略类型相关。共享型和独享型负载均衡算法,支持以下几种调度算法:加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性

一般使用短连接的都是不需要分服的,因为这类游戏一般都是弱联网类型,玩家交互均为异步(即你的屏幕上看到的其他的玩家的数据如主城、阵容等均为“离线”数据,而不是实时的数据),再加上支持 HTTP 协议的 WEB 容器均提供了很成熟的 cluster 方案(如 nginx+tomcat),因此可以比较轻松的实现大量玩家同时在线。接下来如果是 cluster,那么各节点之间需要共享数据,考虑到性能和响应性的话关系型 DB 肯定是最次的选择,因此一般选择为可以跨进程访问的 CACHE,如 memcached、redis、芒果 DB 等。

作者:冯文
链接:https://www.zhihu.com/question/29779732/answer/54871885
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

负载均衡服务器选择

选择距离业务目标客户距离最近的区域,可以减少网络时延以及提高下载速度。选择与后端服务器相同的

弹性负载均衡有不同的负载均衡,分别是经典型负载均衡、共享型负载均衡和独享型负载均衡,

  1. 经典型负载均衡:适用于访问量较小,应用模型简单的 web 业务。
  2. 共享型负载均衡:适用于访问量较大的 web 业务,提供基于域名和 URL 的路由均衡能力,实现更加灵活的业务需求。共享型负载均衡实例资源共享,

可以按照玩家数量、游戏复杂度、游戏分区分服架构来选购服务器资源。

  1. 对于少于 1000 玩家的游戏,可以购买 2 核 4G、4 核 8G 的通用型 ECS,搭配 100G 超高 IO 云硬盘;
  2. 对于少于 5000 玩家的游戏,可以使用华为云弹性负载均衡、关系型数据库、分布式缓存服务构建服务器集群;
  3. 对于大于 5000 玩家的游戏,可以购买支持 SR-IOV 的密集存储型实例或者支持 I

游戏服务器常见问题的解决方法分享_PAINzw的博客-CSDN博客

从服务器发展史看现代游戏服务器架构 - 知乎 (zhihu.com)

  • 数据库代理进程 (DB)

将数据库拆分出来后,游戏逻辑与数据存储分离,减少了系统的耦合性。如果各个游戏逻辑服务器 (Game) 需要取数据的话,可以直接连接数据库获取数据,但是当有大量玩家同时操作时,多个游戏服务器同时存取数据库,出现大量数据重复访问和数据交换,使得数据库成为瓶颈。于是在游戏逻辑服务器 (Game) 和数据库之间增加一个数据代理进程 (DB),游戏服务器不在直接访问数据库而是访问数据代理进程,数据代理进程同时提供内存的数据缓存,缓存一些热点数据,减少数据库的 I/O。如下图。

DB

  • 内存数据库

互联网技术的开源化,极大的促进了各类专用软件的发展和完善,开源技术出现了一种专用的内存数据库,这类专用内存数据库提供易用方便的存储结构体,而且拥有很高读取性能,因此游戏服务器引进这类专用内存数据库,用于缓存服务器热点数据。目前内存数据库使用比较广泛的是Redis和Memcached。引入内存数据库之后,数据库代理进程(DB)不在缓存数据,而是变为玩家上线时将玩家数据从Mysql数据库中加载到内存数据库中和定时将内存数据库中的数据存储到Mysql数据库中。

人都是有惯性的,按照先前的经验,似乎把 MUDOS拆分的越开性能越好。于是大家继续想,网关可以拆分呀,基础服务如聊天交易,可以拆分呀,还可以提供web接口,数据库可以拆分呀,于是有了下面的模型:

这样的模型好用么?确实有成功游戏使用类似这样的架构,并且发挥了它的性能优势,比如一些大型 MMORPG。但是有两个挑战:每增加一级服务器,状态机复杂度可能会翻倍,导致研发和找bug的成本上升;并且对开发组挑战比较大,一旦项目时间吃紧,开发人员经验不足,很容易弄挂。

作者:韦易笑
链接:https://www.zhihu.com/question/29779732/answer/45791817
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Spring+Netty+RamCache+MySQL框架

作者:Z.avi
链接:https://www.zhihu.com/question/29779732/answer/45690487
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我厂是用Spring+Netty+RamCache+MySQL改造成自己的一套框架。

框架的总体设计是这样的:

Framework
├─console        总控制台
├─event          事件处理系统
├─protocol       对象传输协议
├─ramcache       数据库缓存
├─resource       静态资源管理
├─scheduler      定时任务
├─socket         通信支持
└─utils          工具类集合

我们用框架写业务模块的时候是这样子的:

application            项目
├─module               模块名
│ ├─event              事件
│ ├─exception          异常
│ ├─facade             外部接口(供前端调用)
│ ├─manager            数据库缓存操作
│ ├─model              对象模型
│ │ └─result           返回结果对象模型
│ ├─resource           游戏数值配置表映射类(供策划)
│ ├─service            业务逻辑层
│ └─ModuleConfig.java  模块全局配置类
│ ...
├─manager              管理后台接口
├─utils                工具集
└─Start.java           启服类

各个业务模块之间保持了非常低的耦合(公共模块除外,如背包系统、邮件系统等),各模块之间的调用由service层提供的接口。


不要删除

是日已过,命亦随减,如少水魚,斯有何乐?