새벽 3시에 OpenClaw 게이트웨이가 다운되었습니다. 제가 깨어나기 전에 스스로 복구되었습니다.
요약
OpenClaw 에이전트 운영 중 발생하는 예기치 못한 다운타임과 무지성 재시작 루프 문제를 해결하기 위한 자가 치유(self-healing) 와치독 구축 경험을 공유합니다. 단순 재시작을 넘어 지수 백오프와 설정 자동 수정 기능을 포함한 4계층 아키텍처를 제안합니다.
핵심 포인트
- 단순 재시작 루프는 설정 오류 시 시스템 상태를 악화시킴
- 지수 백오프와 충돌 카운터 감쇠를 통한 안정적 복구 필요
- PID 확인과 HTTP 상태 확인을 병행하는 이중 헬스 체크 권장
- 설정 스키마 불일치 등 특정 오류 패턴에 대한 자동 수정 계층 구축
프로덕션 환경에서 OpenClaw 에이전트를 유지 관리하며 배운 점이 있습니다. 에이전트는 당신이 전혀 예상하지 못한 순간에 다운됩니다. 자정. 새벽 3시. 백업 도중. 혹은 중요한 작업 직전에 말이죠.
저는 단순한 systemd 유닛(unit)이나 launchd plist 같은 순진한(naive) 접근 방식을 시도해 보았습니다. 작동은 하지만, 작동하지 않는 순간이 옵니다. 게이트웨이가 반복적으로 충돌(crash)하면 서버를 계속 때리는 재시작 루프(restart loop)가 발생합니다. 설정 오류(config error)로 인해 충돌이 발생하면, 무지성 재시작은 다시 충돌을 일으킬 뿐입니다. 그리고 당신이 지켜보고 있지 않다면, 그 상황을 완전히 놓치게 됩니다.
그래서 저는 이 모든 것을 자동으로 처리하는 와치독(watchdog)을 구축했습니다. 이를 만들며 배운 내용을 공유합니다.
문제점: 무지성 재시작은 상황을 악화시킨다
이론적으로 기본적인 와치독은 다음과 같습니다: "프로세스가 죽었다 → 재시작한다." 하지만 실제로는 그것만으로는 부족합니다.
업데이트 이후 설정 스키마 불일치(config schema mismatch)로 게이트웨이가 충돌하기 시작했을 때, 재시작 루프는 즉각적으로 발생했습니다:
충돌(Crash) → 재시작 → 2초 후 충돌 → 재시작 → 2초 후 충돌 → ...
충돌 카운터(crash counter)는 결코 초기화되지 않았습니다. 게이트웨이는 결코 복구되지 않았습니다. 그리고 저는 6시간 동안 스스로를 두들겨 패고 있었던 시스템을 마주하며 잠에서 깨어났습니다.
진짜 문제는 다음과 같습니다:
- 백오프(Backoff) 없음 — 재시작 루프가 몇 초 만에 발생하여 아무런 성과도 내지 못함
- 충돌 감쇠(Crash decay) 없음 — 일시적인 결함이 영구적인 실패 상태로 고착됨
- 오류 인지(Error awareness) 없음 — 설정 오류는 재시작이 아니라 설정 수정이 필요함
- 에스컬레이션(Escalation) 없음 — 어떤 실패는 단순한 재시작 이상의 조치가 필요함
와치독 아키텍처 (Watchdog Architecture)
제가 구축한 와치독은 bash 스크립트로 실행되며, launchd를 통해 몇 분마다 실행되도록 예약되어 있습니다. 네 가지 계층(layer)을 가지고 있습니다:
계층 1: PID + HTTP 상태 확인 (Health Check)
계층 2: 지수 백오프 (Exponential Backoff) + 충돌 카운터 감쇠 (Crash Counter Decay)
계층 3: 설정 자동 수정 (Config Auto-Fix) (exit_1 + 설정 오류 패턴)
...
계층 1: 실제 실패 감지
와치독은 두 가지를 확인합니다: launchd 프로세스가 실행 중인지, 그리고 게이트웨이가 HTTP에 응답하는지입니다.
check_pid_status() {
local status=$(launchctl list | grep "$LAUNCHD_SERVICE" || echo "")
# ...
...
왜 두 가지 모두를 확인해야 할까요? 프로세스가 실행 중일 수는 있지만 (launchd가 이를 보여줌), 그 내부의 게이트웨이는 멈춰(hung) 있을 수 있기 때문입니다. 반대로, launchd의 PID는 사라졌지만 게이트웨이 자식 프로세스는 여전히 응답하고 있을 수도 있습니다. 두 가지를 모두 확인해야 정확한 상황을 파악할 수 있습니다.
레이어 2: 충돌 감쇠를 동반한 지수 백오프 (Exponential Backoff with Crash Decay)
이 단계가 실제로 "자가 치유 (self-healing)\
- 업데이트 후 발생한 설정 스키마 불일치 (config schema mismatch) (Layer 3 자동 복구)
- 잘못된 모델 로드로 인한 재시작 루프 (restart loop) (Layer 2 백오프가 연쇄 장애 방지)
- 다른 서비스가 포트 18789를 사용하면서 발생한 포트 충돌 (port conflict) (Layer 4 비상 복구)
- 내가 휴대폰을 확인하기 전에 해결된 여러 건의 야간 다운
이 모든 시스템 구축 계기를 제공한 새벽 3시 장애는 Layer 2에 의해 해결되었습니다. 크래시 카운터가 밤사이에 감쇠했고, 게이트웨이가 다시 시도했을 때 일시적인 상태가 해소되었기 때문입니다.
제가 배운 것들
1. 자가 치유(self-healing)는 하나의 스크립트가 아니라 상태 기계(state machine)입니다.
워치독은 단순히
그것이 목표입니다. 진정으로 당신의 도움이 필요한 상황에서만 당신을 필요로 하는 시스템을 구축하는 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기