分片部署

August 12, 2026 · View on GitHub

把单进程扩成 hub + worker。适合已验证单进程事件循环/连接压力仍不够、或需要强隔离炸点的场景。依赖明确的角色分工、共享 data/,以及 Redis 协调。

默认建议:先用 单进程部署unified)+ 辅进程(如本机 Embedding 的 bot_embed)。热路径不阻塞时,多账号也可先留在单 ingress;分片是可选进阶,不是人人必会的主路径。

尚未验证单进程瓶颈时,请先用 单进程部署

适用条件

适合不适合 / 可先不上
单进程已卡顿、连接或调度压力明确仅 1–2 只 Bot,或尚未验证瓶颈
需要账号级炸点隔离可用 unified + aux 消化重活时
多协议实例必须按端口切开无法提供共享 data/ 与 Redis
需拆开 WebUI / 协议端 / AI 回调与消息处理

单进程热群常见表现:命令尚可、闲聊/接话变慢或偶发不回。入站会优先保命令并节流闲聊(见 热闹群与入站设计)。先把重活(如 local Embedding)放到辅进程后再评估是否仍需分片。

结构图

flowchart LR
    WebUI[WebUI]
    Hub[Hub]
    Redis[(Redis)]
    W1[Worker 1]
    W2[Worker 2]
    Proto[Protocol / QQ]
    AI[AI Runtime]

    WebUI --> Hub
    Hub <--> Redis
    Hub --> W1
    Hub --> W2
    W1 <--> Redis
    W2 <--> Redis
    Proto --> W1
    Proto --> W2
    W1 --> AI
    W2 --> AI

角色分工

角色职责
hubWebUI、协议端管理、注册表、部分协调、媒体 / RWKV callback 入口
worker消息处理、群聊玩法、绝大多数业务插件
Redis跨 worker claim、活动协调、部分广播与状态同步
ProtocolQQ 协议接入;反向连接到对应 worker(不是 hub)

前置条件

1. 共享 data/

hub 与所有 worker 必须共用同一份 data/,否则会错乱:

  • registry.json
  • 协调状态
  • 协议端账号映射
  • worker presence
  • WebUI 聚合状态

2. Redis

4.0 分片关键协调依赖 Redis(单进程不强制)。

config/pallas.toml[env]

[env]
REDIS_URL = "redis://127.0.0.1:6379/0"

3. 端口规划

  • hub:8088
  • worker:从 8090 起分配

协议端 ws_url 必须与实际 worker 端口一致。

启动

::: tip 优先用仓库脚本,勿手动拼环境变量起多个进程。 :::

./scripts/run_sharded_bot.sh start
./scripts/run_sharded_bot.sh status
./scripts/run_sharded_bot.sh stop

常见补充:

./scripts/run_sharded_bot.sh start --workers 5
./scripts/run_sharded_bot.sh restart
./scripts/run_sharded_bot.sh test init
./scripts/run_sharded_bot.sh test start

脚本处理:hub / worker 拉起、注册表端口对齐、协议端 ws_url 同步、日志目录与 PID。

也可用部署模板:uv run python tools/apply_deploy_profile.py shard,再配置 REDIS_URL 后启动。

入口与运行

对外对内
WebUI 主要访问 hubworker 跑大多数插件
媒体 / RWKV callback 先打到 hubhub 聚合 worker 状态给控制台
协议端账号连到 worker无 Redis 时跨 worker 能力失效

三项检查

1. 分片是否启动完整

  • ./scripts/run_sharded_bot.sh status
  • data/pallas_shard/logs/hub.log
  • data/pallas_shard/logs/worker-*.log

分片问题查分片日志,不是单进程日志。

2. 协议端是否连到正确 worker

  • data/pallas_shard/registry.json
  • 协议端实例 ws_url
  • 监听端口与注册表是否一致

3. WebUI 数据是否为 hub 聚合

控制台多数页面展示 hub 聚合后的 worker 状态,不是 hub 本地状态。「插件没加载」「cooldown 不全」「Bot 在线态不对」时,核对 worker 侧是否上报。

日志与状态文件

  • data/pallas_shard/logs/hub.log
  • data/pallas_shard/logs/worker-0.log
  • data/pallas_shard/logs/worker-1.log
  • data/pallas_shard/registry.json
  • data/pallas_shard/stats/worker-*.json

::: tip 问题只在某个 Bot / 群 / 玩法时,先收窄到对应 worker。 :::

常见故障

Bot 在线,消息不处理

  • 协议端是否连到正确 worker
  • worker 日志是否持续异常
  • Redis 是否可达

WebUI 能开,插件状态不对

  • hub 是否拿到 worker 元数据
  • 插件是否实际跑在 worker
  • stats/worker-*.json 与注册表

AI 回调到了,结果未回群

  • callback 是否先打到 hub
  • hub 是否转发到目标 worker
  • worker 是否仍在线

运维要点

  • 分片下 Redis 为必需依赖
  • 生产用脚本或编排统一管理 hub 与 worker;勿只监控 hub
  • 新增 Bot、迁移协议端、调整 worker 数量后,重新核对注册表与 ws_url

相关阅读