Files
obsidian/history/2026-04-08-patroni-failover-incident.md
kappa 2356b86d36 obsidian: 정본 문서에서 히스토리/인시던트 분리 완료
15개 정본 문서에서 날짜별 변경이력, 인시던트 기록, 폐기된 구현 상세를
history/ 디렉토리로 분리. 정본은 현재 상태만 기술하는 백서 형태로 정리.
각 정본에 history 위키링크 추가.

분리된 history 파일 12건:
- apisix git push 500, k3s postgresql migration, apisix→traefik 전환
- netbis DDoS 공격, gitea 이전/분리, usb 2.5g hang + NFS hard mount
- supabase→patroni, apisix etcd 통합/분리, anomaly-detect 재설계
- patroni failover incident, zlambda nixos migration, ops-agents setup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 12:09:21 +09:00

1.6 KiB

date, topic, areas, tags
date topic areas tags
2026-04-08 Patroni failover 사고 — pgcat/nocodb/outline read-only 에러
infra/postgresql-ha.md
infra/outline.md
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_URLpostgresql://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 구성