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는 없을태니…