DBCP = Database Connection Pool
이번 블로그에서는 DBCP에 대해서 정리해보고자 한다.
1. 기존의 애플리케이션과 DB간 통신 방법
- 클라이언트가 API 요청
- 애플리케이션과 DB 간에 TCP 신뢰성 연결
- 응답을 위해 DB에 리소스 요청
- 리소스 응답
- 애플리케이션과 DB 간에 TCP 신뢰성 해제
- 클라이언트에 전달
- 항상 리소스를 받기위해 DB와 TCP 기반의 신뢰성 있는 통신을 하는데 연결할때는 3웨이 핸드셰이크, 연결해제시에는 4웨이 핸드셰이크가 매번 발생하고 이는 시간적으로 비효율적이다.
2. DBCP 동작 방식
- 위의 시간 낭비를 해결하기 위해 사용
- TCP 기반의 DB 커넥션을 미리 만들어 두고 사용함으로 TCP 연결 생성 및 해제 시간 단축
- 애플리케이션 시작전에 TCP 기반의 여러 DB 커넥션을 생성
- 여러 DB 커넥션을 담는 풀 생성
- API 요청시마다 만들어놓은 DB 커넥션을 이용해 리소스 요청
- DB 커넥션 사용 후 DB 풀에 반납
3. DBCP 사용
- 현재 배경은 SpringBoot와 MySQL을 기준으로 DBCP를 설정해보려고 한다.
의존성 설정
- 기본적으로 스프링 부트 2.0 이후 버전에서부터는 보통 Hikari CP 라는 커넥션 풀을 사용하는데 명시적으로 설정해 줄 필요없이 아래와 같이 설정시 사용 가능하다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Config 설정
@Configuration
public class DatabaseConfig {
@Bean
DataSource dataSource(DataSourceProperties dataSourceProperties) {
return DataSourceBuilder
.create()
.url(dataSourceProperties.getUrl())
.username(dataSourceProperties.getUsername())
.password(dataSourceProperties.getPassword())
.driverClassName(dataSourceProperties.getDriverClassName())
.build();
}
}
DB 서버 설정
1. max_connections
- DB가 클라이언트와 맺을 수 있는 최대 커넥션 수를 의미하며, 스케일 아웃 등을 고려해서 설정해야 한다.
- 예를 들어, 트래픽 증가로 애플리케이션 스케일 아웃 처리시 DB 커넥션 수가 부족하면 연결이 불가능해진다.
2. wait_timeout
- 커넥션이 inactive 상태에서 기다리는 시간을 제한해 무의미한 커넥션이나 오류 등을 방지한다.
- 한번 사용할때마다 0초로 초기화 된다.
Application 설정
- DBCP 설정을 의미
1. minimumIdle
- pool에서 유지하는 최소한의 idle 커넥션 수, 최소한으로 유지할 사용되지 않는 커넥션 수
2. maximumPoolSize
- pool이 가질 수 있는 최대 커넥션 수, idle 커넥션 + active 커넥션
예시 : minimumIdle 은 3이고, maximumPoolSize은 5인 경우
- 요청 1 : 하나의 커넥션 사용시 Idle 커넥션 하나 더 생성된다 : idle 3, active 1
- 요청 2 : 하나의 커넥션 사용시 Idle 커넥션 하나 더 생성된다. : idle 3, active 2
- 요청 3 : maximum이 5이기 때문에 더이상 Idle 커넥션이 추가되지 않는다.
- 모두 응답한 경우 : 다시 idle 2, active 0 인 상태로 돌아온다.
보통은 minimumIdle값과 maximumPoolSize 값을 동일하게 설정한다. 매번 새로 추가,해제마다 TCP 연결이 필요하기 때문에 값을 같게 설정하는 것을 권장한다고 한다.
3. maxLifeTime
- 커넥션의 최대 수명을 의미하며 해제 후 maximumPoolSize에 맞추어 다시 생성
- Idle인 경우는 바로 반환, active한 경우에는 작업 종료 후 반환
- active한 상태에서 버그 등의 이유로 pool로 돌아오지 않는 경우에는 문제 발생하니 잘 반환을 해야한다.
- DB의 wait_timeout시간보다 2~5초 정도 짧게 설정한다. 이유는 커넥션을 사용 중 종료가 될 수 있기 때문이다.
4. connectionTimeout
- pool에서 connection을 받기 위한 대기 시간
- 요청이 해당 시간안에 커넥션을 못받으면 오류 처리
- 클라이언트가 기다리는 시간임을 고려해서 설정
연결을 잘했다면 아래와 같이 표시된다.
c.z.hikari.HikariDataSource HikariPool-1 - Starting...
...
c.z.hikari.HikariDataSource HikariPool-1 - Start completed.
4. 적절한 Connection 수 찾기
모니터링 환경 구축을 통한 관찰
벡엔드 시스템 부하 테스트를 통한 관찰 (ex : nGrinder)
- request per second : 단위 초당 몇개의 요청이 처리한가
- avg response time : 평균 응답 시간
- 그래프를 확인해 꺾이는 위치를 확인하여 튜닝
'Server Development > DataBase' 카테고리의 다른 글
REAL MYSQL 정리 (1) | 2023.10.21 |
---|