
2022년 1월 100% 할인 이벤트 장애 부검
두줄요약
할인 이벤트의 트래픽 급증으로 발생한 반복 장애를 쿼리와 PostgreSQL Dead Tuple 관점에서 분석했습니다. 고용량 컬럼 분리와 쿼리 개선으로 근본 병목을 해소했습니다.
문제 상황
- 100% 할인 이벤트 바이럴로 평소 대비 5~20배 트래픽 유입과 반복적인 서비스 장애
- 모놀리틱 Node.js 서비스에서 강의 관련 테이블 병목이 전체 서비스 장애로 확산
원인 분석
- 인덱스 미적용·비효율적 실행 계획·대용량 컬럼의
select *·대량IN조건에 따른 슬로우 쿼리 - 단일 JSON 기반 캐시 데이터와 읽기 쿼리의 쓰기 DB 처리로 인한 쓰기 DB 부하 및 데드락
- 수강생 수 갱신마다 고용량 강의 테이블에 UPDATE 발생, PostgreSQL Dead Tuple 급증에 따른 디스크 I/O 병목
해결 방법
- 문제 쿼리 인덱스 추가·실행 계획 개선·불필요한 대용량 컬럼 조회 제거·기능 OFF 적용
- 대량 강의 조회의
IN조건을 20개 단위로 분할 처리하고, 읽기 쿼리를 읽기 DB로 전환 - 강의 소개 고용량 컬럼을 별도 테이블로 분리해 수강생 수 UPDATE와 분리
주의할 점
- DB 인스턴스 증설만으로는 비효율 쿼리와 데이터 구조 문제 해소 불가
- 과도한 쿼리 추상화, 타입·테스트 부재로 장애 중 원인 코드 탐색과 안전한 수정 지연
- 조직 성숙도 없이 MSA를 도입하기보다 장애 전파율이 높은 도메인부터 점진적 분리

