August 24, 2021
보통 Connection Pool을 사용하는 이유가 ’Connection에 드는 비용‘이 크기때문이라고 하는데, 정확히 어떤 비용인지 궁금하여 찾아서 정리해봤다.
애플리케이션에서 매 쿼리마다 새로운 Connection을 생성하고 종료한다고 했을때 어떤일이 발생할까?
네트워크 관점, DBMS관점에서 드는 비용을 살펴 본 후 애플리케이션 관점에서 설명해보겠다.
DBMS와의 통신은 TCP/IP로 이루어진다. 그렇다면 이러한 TCP/IP의 연결 과정은 무엇일까?
먼저 TCP는 연결형 프로토콜이다. 가상 경로를 생성하고 통신을 하는데, 이는 서버측이 미리 준비하고 있어야 가능하다
서버 프로세스(DB)는 OS에게 포트 번호 xx에 통신 요청이 오면 자신에게 전달해 달라하며 기다리는데, 이를 LISTEN
하고 있다고 한다.
이때 우리는 연결을 위해 3-way handshake
과정을 거친다.
SYN
패킷 전송LISTENING
상태이기에 ACK +SYN
패킷 응답.ACK
패킷으로 응답하며 서버의 새로운 소켓이 생성되며 연결(ESTABLISHED
)된다더 자세한 내용은 링크 참고
위 모든 요청은 실제 물리적 회선을 거쳐 이루어진다.
따라서 위 연결 과정을 매번 반복하지 않을 수 있는데, 반복한다면 비효율적인 일이다.
또 위 가상경로의 연결은 지속 유지되며 연결을 끊는 과정에서 4-way handshake
을 거친다.
오라클과 클라이언트의 연결과정은 아래와 같다
LISTEN
상태)위 과정에서 알 수 있듯이, 오라클의 경우 연결마다 매번 ‘서버 프로세스’를 실제로 OS단에 생성해야 한다.
이는 공유메모리 확보 등 무거운 작업고, 따라서 이 과정을 반복하는것은 엄청나게 비효율적이다.
위 오라클은, 하나의 쿼리마다 하나의 프로세스가 생기게 되어 부담이 큽니다.
MySQL은 단일 프로세스, 멀티 스레드 개념이다.
즉, 오라클과 달리 클라이언트를 담당할 프로세스가 아니라 스레드가 존재한다.
이 스레드는 사용자가 요청한 쿼리문장을 처리하는 역할을 합니다
그러나 이러한 스레드도 매 연결마다 생성하면 부담이 크기에 스레드풀 개념을 사용한다.
실제 동시접속이 늘었을때 스레드 생성으로 인해 지연이 발생할 수 있습니다.
커뮤니티 버전에서는 사용 불가능한것으로 알고 있습니다.
이제 각각 어떤 비용이 발생하는지를 정리했고, 애플리케이션에서 Connection Pool
을 사용하는 과정을 설명하겠다.
Node.js
애플리케이션 시작시, Connection
을 5개 생성하여 Connection Pool
을 구성한다고 가정하자
Connection
이 생성된다.Connection
은 TCP/IP 3-way handshake
과정을 거친다 (이때 Node.js
애플리케이션이 클라이언트이고, 클라이언트 측 소켓은 각각 서로 다른 고유한 포트 번호에 할당된다.)Connection
을 재사용한다.Connection Pool
을 사용해 아낄 수 있다.