2022년 1월 3일 ~ 17일까지 '인프런' 이라는 사이트에 대용량 트래픽으로 인한 장애가 발생했다.
인프런의 실무 관계자가 작성한 장애 부검글이 워낙 생생하여, 읽고 배운 점을 간단히 정리해보고자 한다.
"현재 인프런의 경우 모놀리틱 NodeJS 프로젝트를 ECS Fargate 에 올려 트래픽에 따라 10대 ~ 30대를 유지하고 있습니다."
왜 필요한가?
별도의 컴퓨팅 자원에 의존하지 않고 컨테이너를 독립적으로 실행하기 위함
"실제 용량을 측정해보면 해당 컬럼 1개의 값이 10KB 나 되는 고용량의 데이터였습니다. 이런 고용량의 컬럼을 모든 강의 관련 쿼리에서 조회 항목에 포함시켜서 가져오고 있었습니다."
select *
로 조회되던 컬럼에서, 실제 기능에 사용되지 않는 컬럼 제거"모니터링과 슬로우쿼리 알람을 통해 문제가 되는 쿼리들을 조사하는데는 30분도 안되는 짧은 시간이 소요된 반면, 실제 해결까지는 3시간이 소요되었는데요."
-> 무조건적인 추상화가 답은 아니라는 것. 디버깅 편의성을 고려한 설계의 추상화가 필요
"이전과는 달리 이번에는
where id in (ID)
에 포함되는 ID의 개수가 100개를 초과해서 인덱스를 사용하지 못하고 테이블 풀 스캔을 하는 쿼리의 문제였습니다."
IN
절에 담는 ID
를 20개씩 Promise.all
로 분할 처리 (Node.js 환경)"기존 데이터를 변경하지 않고 보관하는 방식을 택하다보니,
UPDATE
,DELETE
,Transaction
이벤트가 많아질 수록 Dead Tuple 발생에 따른 디스크 I/O 증가가 성능 저하를 일으키게 됩니다."
원인
-> Read DB에서의 슬로우 쿼리로 표시되기 때문에, 오히려 Read DB만을 모니터링 하던 것이 원인 파악에 방해
-> 고용량 컬럼을 강의 테이블에서 분리함으로써 해결
배달의 민족은 수백명의 개발자분들이 모여서 3년간 (2016 ~ 2019년) 진행 해서 하나의 거대한 모놀리틱 프로젝트를 MSA로 전환하였습니다.