2022. 7. 24. 17:39ㆍDataBase/DB 이론
✅ 아래 내용들에 대해서 알아보자
- DB 커넥션 과정
- DBCP
- Hikari DBCP
- connection 최적화
애플리케이션이 DB에 접근하여 리소스를 사용하기 위해서는 DB에 연결을 해야 한다.
DB에 연결하는 과정을 DB 커넥션 과정이라고 하는데 DB 커넥션 과정은 복잡한 과정을 거치게 된다.(그림 1 참고)
DB 커넥션 과정
- 애플리케이션은 DB 드라이버를 통해 커넥션을 조회한다.
- DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 이 과정에서 TCP 신뢰성 연결을 위한 3 Way handshake 과정이 발생하게 된다.
- DB 드라이버는 2번 과정 연결 후 ID, PW 등 기타 부가정보를 DB에 전달한다.
- DB는 부가정보를 통한 인증 절차 후, 내부에 DB 세션을 생성한다.
- DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
- DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다.
이러한 복잡한 DB 커넥션 과정은 많은 리소스, 시간 등을 사용하므로 결과적으로 응답 속도에 영향을 준다.
그래서 이러한 문제를 해결하기 위해서 DB Connection Pool(DBCP) 방법을 사용하여 빠른 커넥션을 확보한다.
DB Connection Pool(DBCP)
커넥션 풀은 커넥션을 미리 생성해 두고 사용하는 방법이다.(그림 2 참고)
애플리케이션을 시작하는 시점에 커넥션 풀(ex. 수영장)에 커넥션을 미리 확보해서 보관한다.
디폴트로 커넥션 풀의 기본값은 10이다.
커넥션 풀에 커넥션이 관리가 되어 있으면 TCP/IP로 DB와 연결되어 있는 상태이기 때문에 언제든지 즉시 DB에 접근하여 리소스를 사용할 수 있음(그림 3 참고)
이러한 DB 커넥션 풀이 관리되어 있을 때 애플리케이션 로직에서 DB 연결이 필요할 때 커넥션 풀에 있는 커넥션을 객체 참조로 가져다 쓰고 -> 커넥션 풀이 커넥션 중 하나를 반환함 (그림 4 참고)
그리고 다 쓴 커넥션을 커넥션 풀에 반환함으로써 재사용할 수 있도록 관리한다. -> 다 쓴 커넥션을 close 하는 것이 아니라 커넥션 풀에 반환해야 한다! (그림 5 참고)
커넥션 풀은 대체로 오픈소스를 사용해서 실무에서 사용한다. 대표적으로 commons-dbcp2 , tomcat-jdbc pool , HikariCP 등이 있다. 주로 HikariCP를 사용한다. 스프링 부트 2.0부터 Default 커넥션 풀로 HikariCP를 제공한다.
HikriCP
아래 코드는 HiKariCP를 사용하고 옵션을 설정하는 코드이다(설명을 위한 자바 코드)
일반적으로 application.properties에서 옵션을 설정하여 사용한다.
이러한 옵션을 설정하고 실행해 보면 아래와 같이 HikariConfig에 설정된 많은 옵션들을 볼 수 있음!
Mysql DB 설정
wait_timeout
: connection이 inactive 할 때 다시 요청이 오기까지 얼마의 시간을 기다린 뒤에 close 할 것인지 결정
시간 내에 요청이 도착하면 0으로 초기화
max_connections
: client와 맺을 수 있는 최대 connection 수
Hikari 설정
minimumIdle
- Connection Pool에서 유지하는 최소한의 idel(유휴, 사용되지 않는) connection 수
- Idel connection수가 minimumIdel보다 작고, 전체 connection 수도 maximumPoolSize보다 작다면 신속하게 추가로 connection을 만든다.
- 기본 값은 maximumPoolSize와 동일(권장값, pool size 고정)
maximumPoolSize
- Connection Pool이 가질 수 있는 최대 Connection 수
- idel과 active(in-use) connection 합친 수
maxLifetime
- Connection Pool에서 connection의 최대 수명
- maxLifetime을 넘기면 idle일 경우 pool에서 바로 제거, active인 경우 pool로 반환된 후 제거
- 다 사용한 connection을 pool로 반한이 안되면 maxLifetime이 작동하지 않아 connection 누수현상이 발생할 가능성이 높다.
- DB의 connection time limit(mysql에서 wait_timeout) 보다 몇 초 짧게 설정해야 한다.
connectionTimeout
- Connection pool에서 connection을 받기 위한 대기 시간(적절하게 시간이 중요함)
HikariCP 커넥션 풀에 대한 좀 더 자세한 내용은 아래 공식 사이트를 참고하자.
공식사이트를 참고하여 Parameter를 적절하게 설정해 보자~
적절한 connection 수를 찾기 위한 과정
1. 모니터링 환경 구축
: 서버 리소스, 서버 스레드 수, DBCP 등
2. 백엔드 시스템 부하 테스트(nGrinder, Jmeter 등 사용)
- request per second(rps), avg response time(art) 확인하여 트래픽을 늘려주면서 DB가 받는 부하 체크 및 성능 체크하여 부하가 걸리는 포인트를 체크한다.
- thread per request 모델(병렬 스레드 처리)이라면 active thread 수 확인
- 2번이 문제가 없다면 DBCP의 active connection 수 확인(max_connection, maximumPoolSize 값을 증가하면서 확인)
정리
- 커넥션 풀 과정을 통해 효율적인 DB 통신 및 성능 좋아진다. -> TCP 3 way handshake 시간 비용 감소
- 커넥션 풀은 서버당 최대 커넥션을 수를 제한할 수 있다. 따라서 DB에 무한정 접근을 막아주는 효과를 보장한다 그리고 적절한 커넥션 풀의 숫자는 스펙에 따라 다르기에 성능 테스트를 통해서 결정을 해야 한다.
- 실무에서 대표적으로 커넥션 풀을 HikariCP를 사용하여 관리한다
참고자료
- 인프런 김영한 님의 스프링 DB1편
- https://steady-coding.tistory.com/564
- https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/
- https://www.youtube.com/watch?v=zowzVqx3MQ4&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=30
- https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
- https://d2.naver.com/helloworld/5102792
'DataBase > DB 이론' 카테고리의 다른 글
Connection/Read Timeout (0) | 2022.08.22 |
---|---|
트랜잭션 2편 (0) | 2022.08.05 |
트랜잭션 1편 (0) | 2022.07.26 |