Summary
postgres-prod(prod PG18 HA, 3-shard)가 7일간 down. 근본은 6중 결함 체인 으로, 각 fault가 다음을 가려 단일 fix로 안 풀렸음. 데이터는 전 과정 무손상("in production").
6-fault chain
postmaster.pid race (CrashLoop 시작) — instance manager cleanStaleSocket이 socket lock만 정리, container PID 재활용으로 stale postmaster.pid → FATAL 무한. fix: fix(supervise): cleanStaleLocks removes stale postmaster.pid (container PID-recycling CrashLoop) #276 (cleanStaleLocks).
fencing deadlock — 7일 혼돈 중 전 PVC fenced → operator가 primary 선택 불가. 수동 unfence + pg_promote.
RBAC pods delete 누락 — reseed(reconcileStaleReplicas)가 pod 삭제 forbidden. fix: fix(rbac): operator ClusterRole pods delete (reseedStandby 작동) #277 .
Flux ChartVersion 캐시 — templates 변경했으나 chart version 불변 → Flux stale .tgz 유지. version bump.
operator 이미지 reseed 코드 미포함 — 0.4.0-beta.4-haboot 빌드가 reseed 코드 미포함 브랜치에서 빌드됨 (strings 0). 재빌드.
instance manager self-standby crashloop (라이브 차단점) — operator status가 죽은 옛 primary(0-1)를 primary로 stale 인식 → PRIMARY_ENDPOINT=죽은노드 → 전 노드가 죽은 노드로 pg_rewind 시도 → DNS/connection 실패 무한 crashloop. 실 primary(0-0)조차 marker로 self-standby화 시도. fix: fix(instance): skip standby-prep when PRIMARY_ENDPOINT is self (crashloop fix) #278 (self-primary guard).
Live recovery
0-0 PGDATA의 .keiailab-restart-primary-as-standby marker + standby.signal 수동 제거 → 0-0 primary 부팅 → operator 0-0 재인식 → standby 자동 reseed → 3/3 streaming HA.
Prevention
Lessons
"머지 ≠ 배포": Flux ChartVersion + 이미지 빌드 브랜치 + RBAC 3중으로 코드 fix가 라이브에 안 닿음.
단계마다 실측(in_recovery, lease holder, role annotation, marker 파일)이 "아직 미복구"를 증명 → 조기 종료 방지.
Summary
postgres-prod(prod PG18 HA, 3-shard)가 7일간 down. 근본은 6중 결함 체인으로, 각 fault가 다음을 가려 단일 fix로 안 풀렸음. 데이터는 전 과정 무손상("in production").
6-fault chain
cleanStaleSocket이 socket lock만 정리, container PID 재활용으로 stalepostmaster.pid→ FATAL 무한. fix: fix(supervise): cleanStaleLocks removes stale postmaster.pid (container PID-recycling CrashLoop) #276 (cleanStaleLocks).reconcileStaleReplicas)가 pod 삭제 forbidden. fix: fix(rbac): operator ClusterRole pods delete (reseedStandby 작동) #277.0.4.0-beta.4-haboot빌드가 reseed 코드 미포함 브랜치에서 빌드됨 (strings 0). 재빌드.Live recovery
0-0 PGDATA의
.keiailab-restart-primary-as-standbymarker +standby.signal수동 제거 → 0-0 primary 부팅 → operator 0-0 재인식 → standby 자동 reseed → 3/3 streaming HA.Prevention
Lessons