August 24, 2021
아래 실제 에러 시나리오와, 개인 경험을 바탕으로 Slow Query 장애 시나리오를 작성해봤다.
영상의 내용을 요약해보겠다.
Dead Lock Query
들이 발생
lock
이 잡힌다.lock
을 잡아버렸다kill
해도 의미가 없다 계속 lock이
잡히니까. 일단 락을 우회하게 hotfixSlow Query
문제로 긴급히 DB 사용을 높였다Node.js
가 처리를 못해서 100대까지 늘렸는데 해결이 안됬다max connection
수를 node 서버당 5개로 잡고 있었다.
client > server > DB
구조라고 가정한다.
/api/slow-query
에 인덱스를 타지 않는 쿼리가 있다고 가정한다.
full scan
한다./api/slow-query
특점 시점에 자주 실행된다면 어떤일이 발생할까?
DB CPU 사용률이 99%로 급격히 증가하기 시작한다
모니터링을 통해 문제를 발견했고, 전사에 이슈를 공유한다.
CPU 사용률이 너무 높아, DBA팀에서 쿼리 확인조차 불가능했다
DBA팀에서 Active Query
들을 확인하여 애플리케이션 개발팀에 전달한다.
kill
하기도 한다.개발팀은 문제가 되는 /api/slow-query
로직과 Slow Query
를 발견한다.
Slow Query를 처리하는게 CPU 사용률을 끌어올리고, 다른 요청(쿼리)는 처리하지 못한다.
Server 실행시 connection pool
의 connection
을 최소값만큼 생성한다.
connection
을 2개 생성한다.connectoin
이 부족하자, 점점 limit까지 생성한것이다.더 자세히 알아보자.
DB Connection Pool
에서 유휴 connection
을 가져와서 slow query
실행
Connection
이 반납하지 않았다.DB Module
은 설정된 limit까지 새로운 Connection
을 생성한다.Connection
으로 요청을 해도 응답은 오지 않는다.가정상 Node.js
애플리케이션이다.
이때 Node.js 애플리케이션은 DB랑 관련 없는 api 응답이 가능하다.
그러나 DB 요청 필요한 api는 응답 불가능하다.
따라서 /api/slow-query
요청은 계속 새로운 Connection
연결 시도를 만들고 DB에 query
를 전달한다. 그러나 응답은 없다.
클라이언트 입장에서는 사실상 서버로 보내는 모든 요청은 응답이 없다.
DB랑 관련되지 않은 API는 없을태니…