--- date: 2026-04-08 topic: Patroni failover 사고 — pgcat/nocodb/outline read-only 에러 areas: - infra/postgresql-ha.md - infra/outline.md tags: [history, incident, patroni, postgresql, pgcat, nocodb, outline] --- Patroni failover 발생 후 pgcat, NocoDB, Outline이 구 primary IP를 hardcoded 참조하여 read-only 에러 발생. ## 배경 pgcat의 각 pool `shards.0.servers`에 Patroni 노드 IP(10.100.2.5 등)가 직접 박혀 있었음. Outline의 `DATABASE_URL` Secret도 노드 IP 직결. ## 인시던트 Patroni failover 발생 → postgres-1(10.100.2.5)이 replica로 강등 → pgcat와 Outline이 옛 primary를 계속 가리킴: - NocoDB: 마이그레이션 시 `cannot execute UPDATE in a read-only transaction` → CrashLoopBackOff ~4시간 - n8n: 마이그레이션 없어 표면화되지 않았으나 동일 잠재 문제 - Outline: API 500 반환 (`apiKeys.lastActiveAt` UPDATE 실패 → 인증 자체 깨짐) ## 복구 ### pgcat `db/pgcat-config` ConfigMap의 모든 pool servers를 HAProxy 단일 백엔드(`192.168.9.1:5432`)로 변경. ### Outline `outline-secrets` Secret의 `DATABASE_URL`을 `postgresql://outline:outline@192.168.9.1:5432/outline`로 변경 + rollout restart. ## 교훈 - Patroni 사용 애플리케이션의 DB endpoint는 항상 OpenWrt HAProxy(`192.168.9.1:5432`) 또는 pgcat 경유. 노드 IP 직접 박지 말 것. - 변경 시 `kubectl get secret -A -o json | jq` 검수로 나머지 Patroni 사용자도 일괄 확인 ## 참조 - `infra/postgresql-ha.md` — pgcat 단일 백엔드 구조 - `infra/outline.md` — Outline 구성