django

Django - DB Connection

Jueuunn7 2024. 10. 27. 19:47

db 서버와 클라이언트(서버 애플리케이션) 과는 서로 쿼리를 날리고, 데이터를 조회하며 통신합니다.

통신하기 위해서는 서로 연결이 되어야 하는데, db가 통신하는 방식은 tcp 프로토콜을 사용해서 통신합니다. 이 과정에서 3 way handshak가 필요한데 이 모든 과정을 쿼리를 날릴 때마다 하는 건 매우 비효율적입니다. 그래서 db 커넥션을 관리를 해야 할 필요가 있습니다. 이번 글에선 디비 커넥션을 관리하는 방식을 알아보고 장고에선 어떤 방식으로 처리하는지 알아보겠습니다.

 

1. DB Connection Pool

커넥션 풀은 애플리케이션이 시작되는 시점에 커넥션을 충분히 만들어 둡니다.

애플리케이션은 커넥션이 필요할때마다 커넥션 풀에서 커넥션을 요청하고 커넥션 풀이 전달해 준 커넥션을 사용해서 db와 통신하는 방식입니다.

이때 db커넥션은 미리 생성되어있는 커넥션을 사용하기 때문에 항상 새로운 커넥션을 생성할 필요가 없어집니다.

커넥션 풀을 사용하는 프레임워크는 스프링, JDBC 등등이 있습니다.

하지만 커넥션이 많아질수록 서버 부하가 줄어들지 않고 오히려 컴퓨팅 리소스가 많이 사용된다. db 커넥션도 잡고 있으면 컴퓨텅 리소스를 각각 사용합니다. MySQL 경우에는 커넥션 하나당 약 12 MB 정도의 메모리가 사용된다. 커넥션 1개당 약 6000페이지의 책을 메모리에 올리고 있는 것과 비슷합니다.

 

2. Persistent Conenction

장고는 커넥션 풀을 사용하진 않는다. 그렇다고 모든 요청마다 커넥션을 생성하진 않고 persistent한 커넥션을 생성합니다.

장고 세팅파일에서 CONN_MAX_AGE 값을 설정해서 커넥션의 재사용시간을 정해줄수 있습니다. 단위는 초단위로 설정하고 None값을 주게 되면 한 커넥션을 계속 사용하게 된다. 커넥션이 끊어질 때에는 graceful 하게 요청이 종룔됩니다.

만약 커넥션에 문제가 생기면 해당 커넥션을 끊고 새로운 커넥션을 생성하기도 합니다.

DATABASE = {
    ~~~
    "OPTIONS": {
    	"CONN_MAX_AGE": 60
    }
}

보통은 prod 환경에서 장고의 워커개수를 여러 개를 두거나 멀티스레드를 사용할 시에는 각 애플리케이션, 스레드당 각각의 커넥션을 갖습니다.

CONN_MAX_AGE=None으로 사용할 때에 주의할 점이 있습니다.

커넥션 하나를 계속 사용할 경우 항상 커넥션 연결을 시작할 필요도, 자원소비도 많이 줄일 수 있습니다. 하지만 커넥션 age를 무제한으로 여러 문제가 생길 수도 있습니다.

1. 서버에 트래픽이 적어서 DB 쿼리가 자주 발생하지 않는 경우에는 사용하지 않는 커넥션이 계속 켜져 있게 됩니다.

2. 계속 같은 커넥션을 사용하게 되면 커넥션이 탈취될 위험이 커집니다.

3. 오래된 커넥션이 락을 건 상태로 유지 시 다른 트랜젝션이 계속 기다리며 데드락 관련 문제가 발생할 수도 있습니다.

'django' 카테고리의 다른 글

Django - squashmigrations  (0) 2024.12.16
Django - Trailing Slash  (1) 2024.12.02
Django core - WSGI  (1) 2024.10.21
DRF Serializer  (2) 2024.09.18
Django ORM - Transaction  (0) 2024.08.06