从零搭建完整集群
本教程搭建并验收以下最小生产拓扑:一个 Beacon 控制面、一个 BC、两个全局登录 服、一个小区大厅和一个小区游戏服。它采用 v2 的 namespace token、Agent 身份审批 和控制面权威分配模型。
业务插件负责全局大厅内的选区、排队与后续转服;Beacon 只负责身份、目录、健康 候选与 BC 的首次落脚。相关行为以全局大厅与 BC 接入操作手册 为准。
1. 目标与边界
玩家
└─ BC 的任一 listener
└─ 全局 LobbyCluster:login-a、login-b
└─ 业务插件:选区、排队、转服
└─ Region / Zone
├─ zone-lobby
└─ game-a
这个拓扑有以下不可破坏的约束:
- 一个 namespace 只有一个 LobbyCluster;
login-a和login-b只能属于 LobbyCluster,不能同时属于 Region/Zone;zone-lobby与game-a必须属于同一个业务 Zone,不能加入 LobbyCluster;- 每个服务使用自己的游戏监听端口;BC 可以有多个 listener;
- namespace、
serverId、地址、区服归属与调度权重都由控制面权威维护,Agent 只做 endpoint 与 token 引导。
下文中的服务名仅用于区分角色。请替换为你的命名方案,但不要在 Wiki、仓库、截图 或日志中写入真实公网地址、端口、令牌、密码、证书或 SSH 信息。
2. 准备控制面
2.1 选择数据库与运行方式
首次验证可按快速开始使用单二进制 + SQLite;SQLite 数据目录必须 位于持久化磁盘。
生产环境使用外置 MySQL:先由数据库管理员创建应用数据库和受限账户,再通过控制
面的 config.yml 或受控环境变量配置 database.driver 与 database.dsn。数据库
凭据只应存在于秘密管理或部署环境中,不要写进文档、命令历史或仓库。
如果启用热冷归档,还要预建独立归档数据库,或提供独立归档 DSN。控制面只建表, 不负责创建数据库实例或数据库本身。
SQLite 部署的两个必守参数
SQLite 形态下有两项与会话锁相关的默认值,不要按旧文档手工调回:
database.max-open-conns默认已是 4(旧样例曾是 1)。单连接下一旦出现锁序互等(一条路径持连接等锁、另一条持锁等连接),池内没有第三条连接可破环,会永久挂起且只能重启恢复——这是 2026-10-10 生产事故的成因。不要回退到 1。store层会为 SQLite DSN 自动注入_txlock=immediate(把写锁冲突从「立即失败」转成「短暂等待」)。自己写死_txlock=deferred会退回频繁写失败。
两项都是启动项,改后须重启生效。
DB 等待预算
控制面对「等连接」与「事务寿命」各有上限,超时返回 503 + DB_WAIT_TIMEOUT 而不是无限挂起:
| 配置项 | 默认 | 管什么 |
|---|---|---|
database.call-timeout-ms | 5000 | 取连接 + 单条语句 |
database.tx-timeout-ms | 60000 | 事务寿命 |
必须满足 call-timeout-ms < tx-timeout-ms,错序会被启动校验拒绝。排障读法见排障手册 §3.2。
仓库当前的 docker-compose.yml 只提供 Beacon + SQLite 持久卷,不提供 MySQL。
不要假定存在名为 beacon-mysql 的容器,也不要把旧的容器备份命令直接用于这套
部署。