준티
805
2020-09-13 18:01:35 작성 2020-09-13 18:12:01 수정됨
5
189

DB에 다수의 idle transaction이 발생하는 이유가 뭐가 있을까요?


안녕하세요.

요 최근은 아니지만.. 저번에 회사에서 장애가 발생했던 적이 있습니다.

현상은 아래와 같았습니다.

1. api server에서 아래와 같이 connection pool로 부터 connection을 얻지 못하는 로그가 다수 발생하였습니다.

Unable to acquire JDBC Connection
Connection is not available, request timed out 30000ms

2. 이로 인해 server cpu가 증가하였고, scale out 되었습니다.

3. scale out 된 server 에서도 금방 connection pool이 고갈되었습니다.

4. 2-3이 계속 반복되었고, 결국 reader db의 모든 connection을 사용하게 되어 전체 장애가 발생하였습니다.


장애가 발생했던 당시에 reader db에 굉장히 많은 idle transaction(아무것도 안하는 트랜잭션)들이 있었습니다.(innodb_trx 조회)

무슨 이유에서인지 트랜잭션이 열린 뒤에 제대로 닫히지 않은 것 같았습니다.

해당 트랜잭션을 전부 삭제하고, wait timeout 시간을 줄여서 일단 해결은 했으나.. 원인이 뭔지 아직 잘 모르겠네요.


장애 발생하기 전날에 메인 트랜잭션 테이블에 jpa secondary table을 적용한 내역이 있습니다.

이로 인해 기존에 간당간당하던 쿼리들이 더 느려진 상황은 발생했을 것 같은데요..

slow query가 idle transaction 생성하는데 영향을 줄까요?


처음에는 아래와 같이 생각도 해봤습니다.

1. 쿼리 실행

2. 쿼리 실행시간이 너무 길어져서 client 에서 session을 끊음

3. 쿼리는 완료되었으나 반환할 곳이 없어 broken pipe 발생 -> 트랜잭션 종료되지 않음


이런 현상이 반복되어서 idle transaction이 쌓였나.. 생각도 해봤는데 확신은 안 서네요.


혹시 어느 부분이 원인이 될 수 있을까요?

아니면 다수의 idle transaction은 현상일 뿐이고 다른 원인이 있을까요?

0