트래픽이 높아질 때, DB 관리하는 방법
1. Scale-Up (서버 스펙 업그레이드)
정의: 서버의 하드웨어 성능을 업그레이드하여 더 많은 트래픽을 처리할 수 있도록 하는 방식이다. CPU, 메모리, 디스크 I/O 등을 확장하여 성능을 높인다.
장점: 단일 서버만 관리하기 때문에 복잡성이 낮고, 성능 향상이 직접적이다.
단점: 하드웨어 업그레이드에 따른 비용이 많이 든다. 특정 시점 이후에는 하드웨어 성능의 물리적 한계에 도달한다.
2. Scale-Out (수평적 확장)
정의: 동일한 역할을 하는 여러 서버를 추가하여 트래픽을 분산 처리하는 방식이다. 일반적으로 로드 밸런서를 통해 여러 DB 서버로 트래픽을 나누어 처리한다.
장점: 트래픽 증가에 따라 서버를 추가하면 확장성이 높아지며, 단일 서버 장애 시에도 서비스 연속성을 유지할 수 있다.
단점: 서버가 많아질수록 관리 복잡성이 증가하며, 데이터의 일관성을 유지하기 위한 방법이 필요하다.
3. CQRS (Command Query Responsibility Segregation)
정의: 읽기 작업과 쓰기 작업을 서로 다른 데이터베이스로 분리하여 각각 최적화 하는 방식이다. 예를 들어 쓰기 작업은 NoSQL DB에서 처리하고, 읽기 작업은 관계형 DB에서 처리할 수 있다.
장점: 읽기와 쓰기 작업의 성능을 각각 최적화할 수 있으며, 동시성 문제와 데이터 일관성 문제를 줄일 수 있다.
단점: 복잡한 아키텍처 설계가 필요하며, 데이터를 동기화하는 데 추가적인 개발 및 유지보수 비용이 발생한다.
DB 서버를 분산하지 않고, 트래픽을 감당할 수 있는 방법
위에서 말한 Scale-UP 이 있다. 그 외에도 Connection Pooling이 있다.
DB Connection Pool
커넥션 풀은 애플리케이션과 데이터베이스 사이의 연결을 효율적으로 관리하는 메커니즘이다. pool에는 미리 생성된 여러 개의 데이터베이스 연결이 포함되어 있고, 애플리케이션이 DB와 상호작용할 때마다 새로운 연결을 생성하는 대신 이 풀에서 미리 생성된 연결을 재사용한다.
1. Connection Pool의 필요성
데이터베이스와의 연결을 생성하는 작업은 시간과 리소스를 많이 소모한다. 특히, 많은 사용자가 동시에 요청을 보낼 때 각 요청마다 새로운 연결을 생성하면, 데이터베이스 서버에 과부하가 걸리고 응답 시간이 길어진다. Connection Pool은 이러한 문제를 해결하기 위해, 미리 일정 수의 연결을 생성해 두고, 필요할 때 이 연결을 재사용하도록 한다. 이렇게 하면 매번 연결을 생성하고 해제하는 오버헤드를 줄일 수 있다.
2. Connection Pool의 동작 방식
- 초기화: 애플리케이션 서버가 시작될 때, Connection Pool은 미리 설정된 수의 DB 연결을 생성한다. 이 연결들은 풀에 저장되고, 애플리케이션이 사용할 수 있도록 준비된다
- 연결 요청: 애플리케이션에서 DB 작업이 필요할 때 Connection Pool에 연결을 요청한다. Pool에 미리 생성된 연결이 있다면, 그 중 하나를 할당받아 사용한다.
- 연결 사용: 애플리케이션은 할당받은 연결을 사용하여 DB 쿼리를 실행하거나 데이터를 처리한다.
- 연결 반환: 작업이 끝나면, 애플리케이션은 사용한 연결을 풀에 반환한다. 반환된 연결은 다시 다른 요청을 위해 대기 상태로 전환된다.
- 동적 관리: Connection Pool은 설정에 따라 연결의 수를 동적으로 조절할 수 있다. 사용량이 많아지면 새로운 연결을 생성하여 풀에 추가할 수 있고, 사용량이 줄어들면 일정 시간 동안 사용되지 않은 연결을 해제할 수도 있다.
3. Connection Pool의 장점
- 성능 향상: 매번 새로운 연결을 생성하는 대신, 미리 생성된 연결을 재사용하여 DB와의 연결 비용을 절감하고 응답 시간을 단축할 수 있다
- 리소스 효율성: 제한된 수의 연결을 유지하면서 효율적으로 관리할 수 있어, 시스템 자원(메모리, CPU 등)을 절약할 수 있다.
- 안정성: Connection Pool이 연결의 수를 제어하므로, 과도한 연결로 인해 DB 서버가 과부하에 걸리는 것을 방지할 수 있다.
4. Connection Pool의 단점
- 메모리 소모: Connection Pool이 유지하는 연결의 수가 많아질수록 메모리 소모가 증가한다. 특히, 최소 연결 수와 최대 연결 수의 설정이 적절하지 않으면 메모리 자원의 낭비가 발생할 수 있다.
- 대기 시간 증가: 최대 연결 수에 도달했을 때 추가적인 연결 요청이 대기 상태에 빠지며, 이로 인해 응답 시간이 길어질 수 있다. 이 문제는 적절한 최대 연결 수 설정으로 완화할 수 있다.
DB와 Client의 Connection 구성 방식
- 미리 생성된 연결 사용: 애플리케이션 서버는 초기화 단계에서 미리 여러 개의 DB 연결을 생성하여 Connection Pool에 저장해 둔다.
- 재사용 가능한 연결: 클라이언트 요청이 발생하면, Connection Pool에서 사용 가능한 연결을 제공하여 DB 작업을 처리한다. 이는 매번 새로운 연결을 생성하는 오버헤드를 줄여준다.
- 연결 반환: DB 작업이 완료되면 클라이언트는 연결을 종료하는 대신, 해당 연결을 Connection Pool에 반환한다. 이 연결은 다른 요청을 위해 재사용된다.
- 연결 생성 및 해제: 필요에 따라 Connection Pool은 동적으로 연결을 추가로 생성하거나, 사용되지 않는 연결을 해제하여 자원 사용을 최적화한다.
'전공 > 데이터베이스' 카테고리의 다른 글
[DB] Schema, Index, SQL Injection (0) | 2024.09.29 |
---|---|
Functional Dependency와 정규화, 트랜잭션, 회복 (1) | 2024.06.05 |