서비스 중 인증이 안된다는 요청이 들어왔습니다.
그리하여 로그 확인 결과 노드 서버에서 PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR 라는 로그가 찍혀있었고
검색 결과 DB커넥션이 끊겨있는 상태에서 query요청을 하여 발생한 에러로 확인하였습니다.

그리하여 DB서버에서 현재 연결된 커넥션을 조회(SHOW processlist;) 결과 총 7개의 커넥션이 있어야하는데
2개의 커넥션만 연결되어 있는 것을 확인하였습니다.

리눅스 WAS서버에서 node서버를 재시작하기 위해 pm2 restart all을 하여 서버를 재시작 하였습니다.

재시작 후 DB 커넥션 조회를 하였을때 7개의 커넥션이 연결되어 있는 것을 확인하였고
pm2 restart 후 서비스가 정상적으로 작동하는 것까지 확인하였습니다.
그러면 왜 커넥션이 끊겨있었던 것인지 고민을 해보았고 그 원인을 찾았습니다.
원인은 node.js의 createConnection에 있었습니다.
현재 회사 서비스의 DB커넥션은 커넥션을 싱글톤 객체로 모듈화하여 각각의 모듈이 공유하도록 설계되어 있지 않고(1:N)
node서버가 시작될 때 딱 한번 각각의 모듈이 각각의 커넥션을 연결하고
연결된 커넥션을 사용하도록 설계되어 있습니다.(1:1)
그리하여 많이 사용되는 모듈의 커넥션은 지속적으로 요청과 응답을 통해 연결되어 있는 반면
많이 사용되지 않고 방치되어 있는 모듈은 mysql의 interactive_timeout과 wait_timeout의 설정 시간동안 요청이 없으면
자동으로 커넥션을 끊어서 발생된 현상이었습니다.

이런 현상을 조치하기 위해서 createPool을 사용하여 미리 커넥션을 pool에 담아두고 필요할 때마다 pool에서 커넥션을 할당받아 사용하도록 싱글톤 객체로 모듈화하여 추가 하였습니다.
'트러블슈팅' 카테고리의 다른 글
[node.js]커넥션 수에 따른 속도차이 (속도개선,createPool) (0) | 2023.03.29 |
---|---|
[spring]@Value와 빈 생명주기(Bean LifeCycle) (0) | 2023.03.02 |
[php]UTF-8 BOM 이슈 원인 및 해결 (0) | 2023.02.23 |