Skip to content

postmortem: postgres-prod 7-day outage — 6-fault chain RCA #279

Description

@KeiaiLab-PHIL

Summary

postgres-prod(prod PG18 HA, 3-shard)가 7일간 down. 근본은 6중 결함 체인으로, 각 fault가 다음을 가려 단일 fix로 안 풀렸음. 데이터는 전 과정 무손상("in production").

6-fault chain

  1. 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).
  2. fencing deadlock — 7일 혼돈 중 전 PVC fenced → operator가 primary 선택 불가. 수동 unfence + pg_promote.
  3. RBAC pods delete 누락 — reseed(reconcileStaleReplicas)가 pod 삭제 forbidden. fix: fix(rbac): operator ClusterRole pods delete (reseedStandby 작동) #277.
  4. Flux ChartVersion 캐시 — templates 변경했으나 chart version 불변 → Flux stale .tgz 유지. version bump.
  5. operator 이미지 reseed 코드 미포함0.4.0-beta.4-haboot 빌드가 reseed 코드 미포함 브랜치에서 빌드됨 (strings 0). 재빌드.
  6. 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 파일)이 "아직 미복구"를 증명 → 조기 종료 방지.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions