튜토리얼 카테고리 Skills 소개
ZH EN JA KO
고급 활용

OpenClaw 다중 인스턴스 배포 및 로드 밸런싱

· 12 분 소요

서문

OpenClaw 서비스가 대량의 동시 요청을 처리해야 하거나, 무중단 배포가 필요한 경우 단일 인스턴스 배포만으로는 부족합니다. OpenClaw은 다중 인스턴스 배포 모드를 지원하며, 여러 Gateway 인스턴스를 로드 밸런서와 결합하여 수평 확장과 고가용성을 실현합니다.

이 글에서는 다중 인스턴스 배포의 아키텍처 설계, 설정 방법, 운영 실전에 대해 상세히 소개합니다.

다중 인스턴스 아키텍처 개요

                    ┌──────────────┐
                    │  Nginx / LB  │
                    └──────┬───────┘
                           │
            ┌──────────────┼──────────────┐
            ▼              ▼              ▼
     ┌──────────┐   ┌──────────┐   ┌──────────┐
     │ OpenClaw │   │ OpenClaw │   │ OpenClaw │
     │ 인스턴스 #1│   │ 인스턴스 #2│   │ 인스턴스 #3│
     └────┬─────┘   └────┬─────┘   └────┬─────┘
          │              │              │
          └──────────────┼──────────────┘
                         ▼
                  ┌──────────────┐
                  │  공유 스토리지  │
                  │ (Redis/NFS)  │
                  └──────────────┘

다중 인스턴스 배포의 핵심 과제는 세션 상태의 공유입니다. OpenClaw은 공유 파일 시스템과 Redis 세션 저장, 두 가지 방안을 제공합니다.

공유 스토리지 설정

방안 1: 공유 파일 시스템(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

방안 2: 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 등 다양한 플랫폼을 지원합니다