游戏服务器水平扩展架构
概述
单机再强也有上限,游戏要支撑更多玩家,必须水平扩展:加机器提升容量。但游戏服务器有状态,不能像普通 Web 服务那样随意加节点。水平扩展的核心是分层:网关层无状态随便扩,逻辑层按玩家/房间分片,数据层按数据维度分片。本文设计三层水平扩展架构。
一、三层架构
1.1 分层模型
三层架构:
网关层(Gateway):连接接入、协议编解码、转发(无状态)
逻辑层(Logic):玩家/房间/玩法逻辑(有状态,分片)
数据层(Data):MySQL/Redis 存储(分片)
数据流:
客户端 → 网关 → 逻辑节点 → 数据层
网关不持有业务状态 → 可无限扩展各层职责:
网关:会话管理、限流、消息路由、灰度
逻辑:业务处理、状态管理(玩家/房间)
数据:持久化、缓存、排行榜等1.2 为什么分层
分层收益:
网关无状态 → 按连接数水平扩展(LVS/负载均衡)
逻辑有状态 → 按玩家/房间分片(容量 = 节点数)
数据有状态 → 按数据维度分片 + 读写分离
每层独立伸缩(不互相拖累)二、无状态网关设计
2.1 Sticky Session vs 无状态
| 方案 | 连接绑定 | 优点 | 缺点 |
|---|---|---|---|
| Sticky Session | 长连接固定节点 | 状态在节点内存 | 节点故障丢连接、迁移难 |
| 无状态网关 | 连接随时可换 | 任意扩展、故障转移 | 状态需下沉到逻辑层/共享 |
游戏场景选择:
长连接(对局中)天然要求连接稳定 → 连接级绑定
但网关本身不存业务状态 → 逻辑上无状态
结论:连接绑定 + 业务无状态(最佳组合)无状态网关要点:
网关只维护连接与玩家映射(Redis 全局会话)
业务状态在逻辑层(按玩家分片)
网关故障 → 连接重建 → 重连逻辑层节点2.2 全局会话
Redis Global Session:
玩家在线状态:online:{playerId} → 网关节点信息
连接与玩家映射可跨节点查询
用途:
私聊找接收方所在节点
好友在线状态查询
玩家登录时绑定会话登录流程:
1. 客户端连网关 → 网关分配连接
2. 鉴权通过 → 写 Redis 会话(playerId → node)
3. 后续消息 → 网关查会话 → 路由到逻辑节点三、逻辑层分片方案
3.1 分片维度
逻辑层分片:
玩家维度:playerId → 节点(该玩家所有状态在该节点)
房间维度:roomId → 节点(房间对局在该节点)
关系:
玩家分片决定"人在哪"
房间分片决定"房间在哪"
两者可能不同 → 玩家消息需路由到房间节点分片路由:
playerId % N → 节点(Hash 分片)
或一致性哈希(Ketama,节点增减影响小)
分片策略详见房间分片章节3.2 状态归属
状态归属原则:
玩家私有状态 → 玩家分片节点
房间对局状态 → 房间分片节点
全局状态(排行榜)→ 独立服务/Redis
跨节点交互:
玩家 A(节点 1)邀请玩家 B(节点 2)对局
→ 通过跨服通信(RPC)协作(见跨服通信章节)
→ 或把房间创建到统一房间服务3.3 容量规划
容量估算:
单节点支撑在线(如 1 万人)
目标在线 10 万 → 逻辑节点 ≥ 10 + 冗余
网关节点按连接数/带宽估算
数据层按玩家量分片
冗余与故障:
每层留 1 台冗余(滚动升级/故障切换)
逻辑节点故障 → 该节点玩家重连其他节点(状态重建)四、扩展实践
4.1 扩缩容
扩容:
逻辑层加节点 → 分片重分布(rebalance)
重分布期间新旧路由并存(双写/迁移)
网关层加节点 → 负载均衡自动分配连接
缩容:
先摘流量(从负载均衡移除)
等待存量连接处理完/迁移
再下线节点迁移注意事项:
玩家状态迁移需快照(从持久化恢复)
房间迁移尽量不打断对局
迁移期间消息缓冲/重定向4.2 高可用
各层 HA:
网关:多实例 + 负载均衡(故障自动摘除)
逻辑:分片 + 副本(故障节点分片迁移)
数据:主从 + 读写分离(故障切换)
故障切换:
节点心跳丢失 → 摘除 → 玩家重连
数据层主从切换 → 应用层连接池自动恢复五、实现要点
设计清单:
网关无状态(连接绑定 + 业务不存)
Redis 全局会话(跨节点定位)
逻辑按玩家/房间分片
数据按维度分片 + 读写分离
分层独立扩缩容 + 冗余工程注意:
分片路由一致性(所有节点同一路由表)
状态迁移流程(快照 + 双写)
连接重连与断线恢复
全局会话的一致性与清理常见坑:
网关存业务状态 → 无法水平扩展
分片不均 → Hash 倾斜
迁移丢状态 → 先快照后切换
跨节点状态不一致 → 路由表统一维护与其他系统衔接:
网关设计 → 网关层章节
分片策略 → 房间分片章节
跨节点协作 → 跨服通信章节
状态恢复 → Event Sourcing/持久化章节