首页 教程 分类 Skills下载 关于
ZH EN JA KO
高级用法

OpenClaw多实例部署与负载均衡

· 11 分钟

前言

当你的 OpenClaw 服务需要处理大量并发请求,或者需要实现零停机部署时,单实例部署就不再够用了。OpenClaw 支持多实例部署模式,通过运行多个 Gateway 实例配合负载均衡器,实现水平扩展和高可用。

本文将详细介绍多实例部署的架构设计、配置方法和运维实践。

多实例架构概览

                    ┌──────────────┐
                    │  Nginx / LB  │
                    └──────┬───────┘
                           │
            ┌──────────────┼──────────────┐
            ▼              ▼              ▼
     ┌──────────┐   ┌──────────┐   ┌──────────┐
     │ OpenClaw │   │ OpenClaw │   │ OpenClaw │
     │ 实例 #1  │   │ 实例 #2  │   │ 实例 #3  │
     └────┬─────┘   └────┬─────┘   └────┬─────┘
          │              │              │
          └──────────────┼──────────────┘
                         ▼
                  ┌──────────────┐
                  │ 共享存储层   │
                  │ (Redis/NFS)  │
                  └──────────────┘

多实例部署的核心挑战在于会话状态的共享。OpenClaw 提供了两种方案:共享文件系统和 Redis 会话存储。

共享存储配置

方案一:共享文件系统(NFS / 挂载卷)

最简单的方式是将会话目录挂载到共享文件系统上:

{
  storage: {
    // 所有实例指向同一个共享目录
    dataDir: "/mnt/shared/openclaw-data",
    sessions: {
      dir: "/mnt/shared/openclaw-data/sessions"
    }
  }
}

Docker Compose 示例:

version: "3.8"

services:
  openclaw-1:
    image: openclaw/gateway:latest
    ports:
      - "3001:3000"
    volumes:
      - shared-data:/data/openclaw
    environment:
      - OPENCLAW_DATA_DIR=/data/openclaw
      - OPENCLAW_INSTANCE_ID=node-1

  openclaw-2:
    image: openclaw/gateway:latest
    ports:
      - "3002:3000"
    volumes:
      - shared-data:/data/openclaw
    environment:
      - OPENCLAW_DATA_DIR=/data/openclaw
      - OPENCLAW_INSTANCE_ID=node-2

  openclaw-3:
    image: openclaw/gateway:latest
    ports:
      - "3003:3000"
    volumes:
      - shared-data:/data/openclaw
    environment:
      - OPENCLAW_DATA_DIR=/data/openclaw
      - OPENCLAW_INSTANCE_ID=node-3

  nginx:
    image: nginx:alpine
    ports:
      - "3000:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - openclaw-1
      - openclaw-2
      - openclaw-3

volumes:
  shared-data:
    driver: local

方案二:Redis 会话存储

对于更高并发的场景,推荐使用 Redis 作为会话存储后端:

{
  storage: {
    backend: "redis",
    redis: {
      url: "redis://redis-host:6379",
      password: "your-redis-password",
      db: 0,
      // 会话数据的Key前缀
      keyPrefix: "openclaw:",
      // 连接池大小
      poolSize: 10
    }
  }
}

Redis 方案的优势在于原子操作保证了并发写入的安全性,同时提供了更快的读写速度。

Nginx 负载均衡配置

基本轮询策略

upstream openclaw_backend {
    server openclaw-1:3000;
    server openclaw-2:3000;
    server openclaw-3:3000;
}

server {
    listen 80;
    server_name openclaw.example.com;

    location / {
        proxy_pass http://openclaw_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # SSE 流式响应需要特殊配置
    location /api/v1/chat/stream {
        proxy_pass http://openclaw_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 300s;
    }
}

IP Hash 策略(会话亲和)

如果你使用共享文件系统并希望减少文件锁竞争,可以配置 IP Hash 让同一用户的请求固定路由到同一实例:

upstream openclaw_backend {
    ip_hash;
    server openclaw-1:3000;
    server openclaw-2:3000;
    server openclaw-3:3000;
}

健康检查

upstream openclaw_backend {
    server openclaw-1:3000 max_fails=3 fail_timeout=30s;
    server openclaw-2:3000 max_fails=3 fail_timeout=30s;
    server openclaw-3:3000 max_fails=3 fail_timeout=30s;
}

消息频道的实例绑定

对于 Telegram、Discord 等需要维持 WebSocket 长连接的频道,需要注意:每个频道的 Bot 连接只能由一个实例持有。OpenClaw 通过实例锁机制解决这一问题:

{
  cluster: {
    enabled: true,
    // 当前实例ID,每个实例必须唯一
    instanceId: "node-1",
    // 频道分配策略
    channelBinding: {
      // 由哪个实例负责哪些频道
      "node-1": ["telegram", "discord"],
      "node-2": ["slack", "whatsapp"],
      "node-3": ["webchat"]
    }
  }
}

如果某个实例宕机,其负责的频道会自动故障转移到其他实例。

零停机滚动更新

结合负载均衡器和健康检查,你可以实现零停机的滚动更新:

#!/bin/bash
# rolling-update.sh

INSTANCES=("openclaw-1" "openclaw-2" "openclaw-3")

for instance in "${INSTANCES[@]}"; do
  echo "正在更新 $instance ..."

  # 1. 标记实例为维护模式(停止接收新请求)
  docker exec $instance openclaw maintenance on

  # 2. 等待当前请求处理完成
  sleep 10

  # 3. 拉取新镜像并重启
  docker compose pull $instance
  docker compose up -d $instance

  # 4. 等待健康检查通过
  until curl -sf http://localhost:3000/api/v1/health; do
    sleep 2
  done

  echo "$instance 更新完成"
done

监控与日志聚合

多实例环境下,集中化的日志和监控尤为重要。

统一日志格式

{
  logging: {
    format: "json",
    // 日志中包含实例ID
    includeInstanceId: true,
    // 输出到标准输出,方便日志收集
    output: "stdout"
  }
}

Prometheus 指标

每个实例都暴露 /api/v1/metrics 端点,可以被 Prometheus 统一采集:

# prometheus.yml
scrape_configs:
  - job_name: "openclaw"
    static_configs:
      - targets:
          - "openclaw-1:3000"
          - "openclaw-2:3000"
          - "openclaw-3:3000"

关键监控指标包括:每秒请求数、响应延迟分位数、Token 消耗速率、活跃会话数、MCP 工具调用频率等。

容量规划建议

并发用户数 建议实例数 Redis 配置 CPU/内存
< 50 1(单实例) 不需要 1C/1G
50-200 2-3 单节点 Redis 2C/2G 每实例
200-1000 3-5 Redis Sentinel 4C/4G 每实例
> 1000 5+ Redis Cluster 8C/8G 每实例

需要注意的是,OpenClaw 的主要瓶颈通常不在 Gateway 本身,而在下游的 AI 模型 API 的并发限制和响应速度。

小结

OpenClaw 的多实例部署能力让它可以从个人助手平滑扩展到企业级服务。通过共享存储层解决状态一致性问题,通过负载均衡器分发流量,通过频道绑定和实例锁解决长连接管理,再加上滚动更新和集中监控——这套方案能够为你的 AI Agent 网关提供生产级的可靠性和扩展性。

OpenClaw 是开源免费的个人AI助手,支持 WhatsApp、Telegram、Discord 等多平台接入