본문 바로가기
카테고리 없음

SQLAlchemy - Database Connection Pool 관리

by 올엠 2024. 3. 14.
반응형

Python에서 많이 활용하는 SQLAlchemy 기준으로 Database를 관리하는 방안에 대해서 정리해 보고자 한다.

Python은 Database를 연결 할때 Connection Pool을 통해서 관리하는데, Connection Pool 은 데이터베이스로의 추가 요청이 필요할 때 기존 연결을 재사용하는 방법으로 연결시 사용되는 리소스를 절약하는 구조라고 할 수 있다.

이유는 TCP 연결은 새로운 연결시 기본적으로 TCP 3 Way-Handshake를 진행하는데 이 부분에 대한 자원 소모는 상당한 편이다. 그리고 요청이 많은 경우 기존 연결된 Connection을 활용하면 상당한 리소스를 절약할 수 있다.

다만, Database에 연결하는 Connection Pool은 연결 관리를 해주지 않을 경우, 모든 Databse Connection을 다 사용하여, 추가로 연결할 수 없는 상황이 발생하여 오류가 발생할 수 있다는 점도 주의해야 한다. 

따라서 만약 Databse를 이용한다면 Connection Pool은 본인 환경에 맞춰서 선택해야 한다.

NullPool?

만약 정말 Pool을 사용하고 싶지 않다면, NullPool 옵션을 사용할 수 있다.

Database에 연결이 필요한 경우 연결과 연결종료를 통해서 사용하게 된다. 다만 Pool 자체를 사용하지 않기 때문에, Pool 에서 제공하는 재연결등을 진행하는 연결 무효화 확인등을 지원하지 않아, 사용중 연결 종료가 발생하면 바로 오류로 이어지므로 본인의 서비스 형태와 맞는지 잘 고려해볼 필요가 있다.

Connection Pool

그럼 Pool을 어떻게 관리할 수 있는지 Pool 관리에 활용할 수 있는 옵션에 대해서 알아보도록 하겠다.

Connection Pool은 Database 연결을 생성하는 create_engine 시점에 작성할 수 있으며, 아래와 같은 주요한 옵션이 있다.

SQLAlchemy을 조금 더 정리해 보면,

connection pool

 

pool_size, max_overflow, pool_recycle, pool_timeout 

이렇게 4가지를 옵션에 대해 알아보도록 하자.

pool_size, max_overflow

동시에 연결 가능한 개수와 대기 가능한 옵션을 제공한다. 

이 두 가지 옵션은 연관성이 함께 있기 때문에 보통 함께 설정한다.

앞서 그림에서 보았듯이 create_engine시 연결 갯수와 대기 갯수를 지정할 수 있다.

기본 값은 다음과 같다.

즉 5개의 연결, 그리고 연결 대기를 10로 생성한다는 의미이다.

pool_size = 5, max_overflow = 10

pool_recycle

보통 유휴 세션의 경우 종료하도록 되어 있는데, 만약 pool_recycle을 설정하면 해당 시간이후에는 연결을 끊지 않고 유지하여 재사용하게 된다. 

pool_recycle을 기존 연결된 세션을 재사용하겠다는 의미로 사용된다. 정확히는 연결을 끊지 않고 에코 신호를 보내 연결을 유지하게 된다.

따라서 pool_recycle를 설정한다면, wait_timeout 시간보다 짧게 설정해야 timeout전에 재사용 처리를 하기 때문에 사용하는 의미가 있다고 할 수 있다. 아래와 같이 설정하면, 600초, 즉 10분 마다 Echo를 넣게 된다.

따라서 너무 짧게 pool_recycle을 설정하게 되면, 데이터 처리 중에 Echo를 넣게 되어 문제가 되므로, 유효 세션일때 사용하도록 wait_timeout 과 적절하게 조정해야 문제가 발생하지 않는다.

pool_recycle=600

pool_timeout 

pool_timeout은 Pool 가득 차을 경우에 대기하는 시간이라고 할 수 있다. 

pool_timeout = 50

위와 같이 설정하면, 만약 pool의 모든 리소스를 사용한 상태로 리소스 반환이 없다면, 50초간 대기하게 되고 이후 에러 메세지와 함께, overflow pool에 대해서 종료하게 된다. 에러 메세지는 보통 아래와 같다.

QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 50

마치며

명시적으로 close 하지 않는 경우 유휴 세션이 발생하는 경우가 많기 때문에 Database 세션을 사용하고 나면 close 해주는 습관을 기르도록하자. 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
반응형