이 지도를 통해 아래 질문들에 답할 수 있게 됩니다.
- 장애가 났을 때 어디부터 확인해야 하는가?
- 사용자 영향, 최근 변경, 의존성 문제는 어떤 순서로 보는가?
- 로그, 메트릭, 트레이스는 장애 조사에서 어떻게 연결되는가?
- 임시 조치와 근본 수정은 어떻게 구분하는가?
flowchart TB subgraph START["Incident Start"] direction TB ALERT{"[Alert/UserReport]<br/>알림 또는 사용자 제보<br/>예: pager, CS ticket"} IMPACT["[ImpactCheck]<br/>사용자 영향·범위 확인<br/>예: all users, KR only"] CHANGE["[RecentChange]<br/>배포·설정·트래픽 변화<br/>예: deploy, config"] end subgraph TRIAGE["First Triage"] direction TB EDGE["[EdgeCheck]<br/>외부 진입 경로 확인<br/>예: DNS, CDN, LB"] APP["[AppCheck]<br/>애플리케이션 실행 확인<br/>예: WAS, endpoint"] DATA["[DataCheck]<br/>저장소·큐 의존성 확인<br/>예: DB, Redis"] EXTERNAL["[ExternalCheck]<br/>외부 연동 상태 확인<br/>예: payment, mail"] end subgraph OBSERVE["Evidence"] direction TB LOGS[["[Logs]<br/>에러·이벤트 기록<br/>예: 5xx, stack trace"]] METRICS[["[Metrics]<br/>지연·오류·포화 지표<br/>예: p95, queue depth"]] TRACES[["[Traces]<br/>요청 경로와 병목<br/>예: trace id, span"]] end subgraph RESPONSE["Response"] direction TB MITIGATE["[Mitigation]<br/>사용자 영향 임시 완화<br/>예: rollback, scale"] FIX["[RootCauseFix]<br/>코드·설정·쿼리 수정<br/>예: patch, index"] POST["[Postmortem]<br/>재발 방지 기록<br/>예: action item"] end ALERT -->|confirm impact| IMPACT IMPACT -->|check recent change| CHANGE CHANGE -->|check edge route| EDGE EDGE -->|reach app| APP APP -->|check dependencies| DATA APP -->|check third party| EXTERNAL EDGE -.->|edge logs| LOGS APP -.->|app logs| LOGS DATA -.->|resource metrics| METRICS EXTERNAL -.->|provider metrics| METRICS APP -.->|trace spans| TRACES DATA -.->|dependency spans| TRACES LOGS -->|evidence| MITIGATE METRICS -->|evidence| MITIGATE TRACES -->|evidence| MITIGATE MITIGATE -->|after stable| FIX FIX -->|learn| POST classDef alert fill:#FFEBEE,stroke:#C62828,color:#B71C1C; classDef ops fill:#ECEFF1,stroke:#455A64,color:#263238; classDef server fill:#E8F5E9,stroke:#2E7D32,color:#1B5E20; classDef data fill:#FFF3E0,stroke:#EF6C00,color:#E65100; classDef event fill:#F3E5F5,stroke:#6A1B9A,color:#4A148C; class ALERT alert; class IMPACT,CHANGE,MITIGATE,FIX,POST,LOGS,METRICS,TRACES ops; class APP server; class DATA data; class EDGE,EXTERNAL event; linkStyle 0,1,2,3,4,5,12,13,14,15,16 stroke:#455A64,stroke-width:2px; linkStyle 6,7,8,9,10,11 stroke:#455A64,stroke-width:2px,stroke-dasharray:5 5;
이 지도는 특정 기술 하나가 아니라 장애가 났을 때의 조사 순서를 설명한다. 장애 대응의 첫 목적은 원인을 완벽히 설명하는 것이 아니라 사용자 영향을 줄이고, 증거를 잃지 않으면서 원인을 좁히는 것이다.
첫 번째는 사용자 영향 확인이다. 전체 장애인지, 특정 기능인지, 특정 지역인지, 특정 사용자군인지 확인해야 대응 우선순위가 정해진다. 두 번째는 최근 변경 확인이다. 배포, 설정 변경, 인프라 변경, 트래픽 급증은 장애 원인을 빠르게 좁히는 단서가 된다.
그 다음에는 요청 경로를 바깥에서 안쪽으로 본다. DNS, CDN, TLS, WAF, LB를 지나 WAS에 도달했는지 확인하고, WAS에 도달했다면 endpoint, thread, DB, Redis, Queue, 외부 API를 본다.
장애가 났을 때 먼저 확인할 것
- 사용자 영향 범위와 시작 시각을 확인한다.
- 최근 배포, 설정 변경, DB Migration, 트래픽 급증을 확인한다.
- 클라이언트 오류와 서버 로그를 연결해 요청이 어느 지점까지 도달했는지 본다.
- p95 latency, 5xx rate, queue depth, DB connection pool usage를 먼저 본다.
- 복구가 급하면 rollback, scale-out, feature flag off, circuit breaker open 같은 임시 조치를 검토한다.
설계할 때 선택 기준
- 장애 대응이 중요한 서비스는 runbook과 dashboard를 기능 출시와 함께 만든다.
- 전체 장애를 빨리 줄여야 하면 원인 분석보다 rollback이나 traffic shift를 먼저 선택할 수 있다.
- 데이터 손상 가능성이 있으면 서비스 복구보다 쓰기 중단과 backup 확인을 먼저 둘 수 있다.
- 외부 API 장애가 잦으면 timeout, fallback, circuit breaker를 설계에 포함한다.
- 반복 장애는 postmortem과 재발 방지 작업을 backlog가 아니라 운영 작업으로 관리한다.
운영 중 볼 지표
- impact: affected user count, failed request count, region별 error rate
- change: deployment time, config change time, migration time
- service: p95/p99 latency, 5xx rate, timeout count
- saturation: CPU, memory, thread pool, connection pool, queue depth
- response: MTTA, MTTR, rollback duration, recurrence count
흔한 오해
- 장애 대응은 처음부터 정확한 원인을 맞히는 게임이 아니다.
- CPU가 낮아도 Thread Pool, DB Connection Pool, 외부 API 대기로 서비스는 멈출 수 있다.
- 로그만 보고 판단하면 지연시간과 포화 상태를 놓칠 수 있다.
- 임시 조치는 근본 수정이 아니지만 사용자 영향을 줄이는 중요한 단계다.
- Postmortem 없이 넘어가면 같은 장애가 다른 이름으로 반복된다.
실전 체크리스트
- 장애 시작 시각과 영향 범위를 적었는가?
- 최근 변경 사항을 확인했는가?
- 요청이 Edge, WAS, DB, Queue 중 어디서 막히는지 구분했는가?
- 임시 조치와 근본 수정 작업을 분리했는가?
- 재발 방지 항목과 담당자를 남겼는가?
질문에 대한 답변
-
장애가 났을 때 어디부터 확인해야 하는가?
사용자 영향 범위와 최근 변경부터 확인한다. 그 다음 요청이 Edge에서 막히는지, WAS에 도달하는지, DB나 외부 의존성에서 느려지는지를 바깥에서 안쪽으로 좁힌다.
-
사용자 영향, 최근 변경, 의존성 문제는 어떤 순서로 보는가?
먼저 영향 범위를 확인해 심각도를 정한다. 그 다음 최근 변경으로 원인 후보를 줄인다. 이후 DB, Redis, Queue, 외부 API 같은 의존성을 확인해 실제 병목을 찾는다.
-
로그, 메트릭, 트레이스는 장애 조사에서 어떻게 연결되는가?
메트릭은 어디가 이상한지 알려주고, 트레이스는 요청 경로 중 어디서 시간이 걸렸는지 보여주며, 로그는 그 시점에 어떤 에러나 이벤트가 있었는지 설명한다.
-
임시 조치와 근본 수정은 어떻게 구분하는가?
임시 조치는 사용자 영향을 줄이는 즉시 대응이다. rollback, scale-out, feature off가 여기에 해당한다. 근본 수정은 원인이 다시 발생하지 않도록 코드, 설정, 쿼리, 설계를 고치는 작업이다.
관련 상세 문서
- 네트워크 장애 대응과 트러블슈팅 압축 정리
- Incident Response 장애 보고서 압축 정리
- Web Operations Runbook 압축 정리
- OS 관점의 성능 병목 분석 압축 정리
- 실전 DB 시나리오 압축 정리
- Logging Metrics Tracing 압축 정리