JPA 커넥션 장애

Moondy·2022년 9월 14일
0

장애 상황

  • DB Connection이 자꾸 끊기는 에러 발생
    • AWS의 RDS for PostgreSQL을 사용하는데, 자꾸 RDB와의 커넥션이 끊긴다
    • HikariPool이 뜨는 것으로 보아 JPA 에러인것 같다
2022-08-25 22:15:33.485  WARN 1 --- [nio-8081-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 08006
2022-08-25 22:15:33.487 ERROR 1 --- [nio-8081-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : HikariPool-1 - Connection is not available, request timed out after 30000ms.
2022-08-25 22:15:33.492 ERROR 1 --- [nio-8081-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SSL error: Connection reset
2022-08-25 22:15:33.492  INFO 1 --- [nio-8081-exec-2] c.s.a.u.biz.controllers.UsersController  : Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

추정되는 원인

1. 커넥션 풀 사이즈가 과도하여 RDB가 감당 불가

  • PostgreSQL에서 감당할 수 있는 Connection 수보다 MicroServices에서 요청하는 Connection 수가 많은것이 아닐까
  • 또는 쿠버네티스 노드 쓰레드가 감당할 수 있는 커넥션 풀보다 MicroServices에서 만드는 커넥션 풀 사이즈가 더 커서 그런것이 아닐까

2. 무거운 쿼리 등으로 DB 서버에 부하가 가거나, Lock이 발생해서 장애 발생했을 가능성

  • 서버에 부하가 가는 쿼리인 경우 계속 진행해서 DB와 서버에 부하가 가게 하는것보다 빠르게 Fail나게 하는 것이 필요하다

조치

1. 풀 사이즈 제한

  • DB 사용하는 JVM MicroServices에게 maximumPoolSize = 5 설정하여 Connection 생성 제한
    • maximumPoolSize: pool에 유지시킬 수 있는 최대 커넥션 수. pool의 커넥션 수가 옵션값에 도달하게 되면 idle(놀고있는)인 상태는 존재하지 않음 (default:10)

    • 적절한 Pool Size 구하는 공식

      ## Brian Goetz가 제안한 공식
      	
      스레드 수 = 사용 가능한 코어 수 * (1+대기 시간/서비스 시간)
      	
      ## CPU 목표 사용량까지 고려한 공식
      
      스레드 수 = 사용 가능한 코어 수 * CPU 목표 사용량 * (1+대기 시간/서비스 시간)

2. 커넥션의 타임아웃 조정

값은 그냥 임의로 정했다

  • RDS for PostgreSQL
    • statement_timeout35000
    • idle_in_transaction_session_timeout1805000
    • idle_session_timeout1805000
  • MicroServices config에 spring.datasource.hikari.maxLifetime값을 30000
    • connection 유휴 시간이 maxLifetime을 넘어가면 disconnect 처리

기타 추가 조치

  • RDB 쿼리 결과가 느려 사양을 상향 조정했다 (AWS라 가능한 일)
    • 빠르게 탐색하려면 메모리에 데이터를 올려서 계산해야하는데, 만약 메모리가 작아서 계산할 수 없으면 디스크레 있는 데이터를 검색하게 되므로 느려지기 때문에 DB 안정성을 위해 메모리 상향조정
profile
DevOps를 살짝 찍먹하는 BackEnd 개발자

0개의 댓글