使用 etcd 和 redis 实现全国同服游戏的负载均衡,服务器弹性伸缩, 灰度发布

概述:

每个玩家在游戏中都有唯一编号, 称为 roleID

参与开发的全国同服游戏,每个游戏逻辑服务器( 以下简称 game ) 都是一个平行世界,每个 game 都有唯一编号: gameID, 玩家同一时刻只能登录到一个 game 中;可以使用 redis setnx 保存 roleID - gameID, 来确保某段时间内玩家登录到同一个指定的game, 以杜绝多终端登录同一帐号的风险; 在此基础上实现安全的弹性伸缩。
如果两个玩家位于不同的 game, 要进行私聊时,就需要知道对方的 gameID
把所有玩家的 roleID 和 gameID 作为键值对保存在 redis 中, 只要知道对方的 roleID, 就能从 redis 中查询到对方的 gameID

game 之间通过 redis 的发布订阅模式的交互数据


================== 分割线 ==================


服务器架构:

1. 服务器大厅主要由 login, gate, game 三个角色构成, 其他游戏服务器角色跟本文档内容无关, 为避免思维噪音不引入讨论

2. gate 的功能是接受客户端的 TCP 连接,并把数据转发到 game; gate 定时把 TCP 连接数( 可以直接反应出这台 gate 的负载 )写入 etcd

3. game 的功能是处理客户端数据, 定时把在线客户端数量( 可以直接反应出这台 game 的负载 )写入 etcd

4. gate 和每个 game 都有 TCP 连接, 两者是 m * n 的关系, 但 gate 和 gate 之间没有 TCP 连接, game 和 game 之间也没有 TCP 连接

5. login 的功能是验证完客户端登录后, 从 etcd 中选出 TCP 连接数最少的 gate ip 分配给客户端, 玩家随即和 login 断开连接, 并连接到 gate 上
gate 从 etcd 中选出客户端数量最少的 game 关联给客户端, 随后把客户端发来的数据转发给这个 game

6. 客户端 和 login 是 TCP 短连接, 客户端 和 gate 是 TCP 长连接


================== 分割线 ==================

负载均衡和弹性伸展服务器数量:

1. game 和 gate 每隔几秒把在线人数写入 ETCD

2. 玩家登录时, 登录服务器 login 根据 ETCD 的内容, 分配一个负荷最少的 gate 的 IP 地址给玩家

3. 玩家连接到 gate 时, gate 根据 etcd 的内容, 获得一个负荷最少的 game 唯一编号: gameID

 

4. gate 使用 redis 命令 setnx , 把玩家的 roleID - gameID 保存到 redis

4.1
若 setnx ( 返回 1 表示 ) 设置成功, 则把玩家的数据发送到 gameID 对应的 game
4.2
若 setnx 设置失败, 说明之前有个玩家登录了同一个账号 ( 或者此玩家是在 15 分钟内登录, 参见 5, 6 步  )
使用 redis 命令 get 获取到 roleID 的 oldGameID
为本次登录的玩家分配 oldGameID, 把数据发送到 oldGameID 对应的 game ( 如果是多终端重复登录同一账号,这样就可以前一个玩家挤下线 )

5. 玩家下线后, game 保存玩家信息 15 分钟, 同时使用 redis 命令 expire 设置 roleID - gameID 的数据生存周期是 15 分钟

6. 若玩家 15 分钟内登录, 此时从第 4 步开始执行. 此时 game 就不需要从 mysql 中读取玩家数据, 减少了 mysql 数据库负载

7. 若 gate 或者 game 负载过大,直接增加 gate 和 game 即可,不需要其他人工干预


================== 分割线 ==================

灰度发布的实现
由于 gate 上没有逻辑, 所以灰度发布只针对 game
在 etcd 中为每个 game 写上一个配置, key 是 gameID 的数字字符串格式, value 是一个数字字符串( 表示 game 能处理的客户端数量上限 )
假如 key - value 的值是 "201" - "2000",  表示 gameID 为 201 的 game, 最高容纳 2000 个玩家
在玩家连接到 gate 时, 如果 gameID 为 201 的 game 的在线人数超过 2000, gate 不能为玩家分配 201 所对应的 game

================== 分割线 ==================

弹性缩减服务器数量
在 etcd 中为每个服务器设置一个开关配置
如果某个 gate 开关是关闭状态, 那么 login 就不能为玩家分配这个 gate
如果某个 game 开关是关闭状态, 那么 gate 就不能为玩家分配这个 game



 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值