RDS와 EKS 아키텍처
TL;DR
- RDS와 EKS 아키텍처의 핵심 개념과 사용 범위를 한눈에 정리
- 등장 배경과 필요한 이유를 짚고 실무 적용 포인트를 연결
- 주요 특징과 체크리스트를 빠르게 확인
1. 개념
┌─────────────────────────────────────────────────────────────┐ │ │ │ 중요한 사실: │ │ │ │ ❌ "EKS에서 제공하는 RDS" │ │ ✅ "AWS에서 제공하는 별개의 서비스" │ │ │ │ EKS = Elastic Kubernetes Service (컨테이너 오케스트레이션)│ │ RDS = Relational Database Service (관리형 데이터베이스) │ │ │ │ → 둘은 완전히 독립적인 AWS 서비스 │ │ → EKS의 Pod이 RDS에 "접속"하는 클라이언트-서버 구조 │ │ → RDS는 Pod이 아님, EC2 기반의 별도 관리형 인스턴스 │ │ │ └─────────────────────────────────────────────────────────────┘
2. 배경
RDS와 EKS 아키텍처이(가) 등장한 배경과 기존 한계를 정리한다.
3. 이유
이 주제를 이해하고 적용해야 하는 이유를 정리한다.
4. 특징
- 핵심 개념
- 아키텍처 다이어그램
- 자동 스케일링이 아님
- 오해와 사실
- Read Replica 사용 시
5. 상세 내용
작성일: 2026-02-09 카테고리: Cloud / AWS / Database 포함 내용: RDS, EKS, Aurora, Read Replica, RDS Proxy, Connection Pooling, Auto Scaling, Aurora Serverless
1. EKS와 RDS의 관계
핵심 개념
┌─────────────────────────────────────────────────────────────┐
│ │
│ 중요한 사실: │
│ │
│ ❌ "EKS에서 제공하는 RDS" │
│ ✅ "AWS에서 제공하는 별개의 서비스" │
│ │
│ EKS = Elastic Kubernetes Service (컨테이너 오케스트레이션)│
│ RDS = Relational Database Service (관리형 데이터베이스) │
│ │
│ → 둘은 완전히 독립적인 AWS 서비스 │
│ → EKS의 Pod이 RDS에 "접속"하는 클라이언트-서버 구조 │
│ → RDS는 Pod이 아님, EC2 기반의 별도 관리형 인스턴스 │
│ │
└─────────────────────────────────────────────────────────────┘
아키텍처 다이어그램
┌─────────────────────────────────────────────────────────────┐
│ │
│ VPC │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ EKS Cluster (Public/Private Subnet) │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ... ┌─────┐ │ │
│ │ │Pod 1│ │Pod 2│ │Pod 3│ │Pod N│ │ │
│ │ │ App │ │ App │ │ App │ │ App │ │ │
│ │ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ │ │
│ │ │ │ │ │ │ │
│ │ └───────┴───────┴─────┬─────┘ │ │
│ │ │ │ │
│ └───────────────────────────┼────────────────────────┘ │
│ │ TCP 연결 (3306/5432) │
│ ┌───────────────────────────┼────────────────────────┐ │
│ │ RDS (Private Subnet) ▼ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ RDS Instance (관리형) │ │ │
│ │ │ PostgreSQL / MySQL / etc. │ │ │
│ │ │ │ │ │
│ │ │ → Pod이 아님! │ │ │
│ │ │ → EC2 기반 관리형 인스턴스 │ │ │
│ │ │ → AWS가 OS, 패치, 백업 관리 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
2. Pod 스케일링과 RDS
자동 스케일링이 아님
┌─────────────────────────────────────────────────────────────┐
│ │
│ 시나리오: Pod 10개 → 1000개 스케일링 │
│ │
│ Pod 1 ──┐ │
│ Pod 2 ──┤ │
│ Pod 3 ──┤ TCP Connection │
│ ... ├────────────────────────→ RDS (단일 인스턴스) │
│ Pod 999 ─┤ │ │
│ Pod 1000─┘ │ │
│ │ │
│ 질문: AWS가 자동으로 RDS 스케일링? │ │
│ 답변: ❌ 아니요! │ │
│ │ │
│ RDS는: ▼ │
│ ├── 지정한 인스턴스 타입 그대로 유지 (db.t3.medium 등) │
│ ├── Pod 개수와 무관하게 고정 │
│ ├── 수동으로 스케일업 필요 (더 큰 인스턴스로 변경) │
│ └── 또는 Aurora Auto Scaling 사용 (읽기 전용) │
│ │
│ EKS HPA: Pod 자동 스케일링 ✅ │
│ RDS 일반: 수동 스케일링만 가능 │
│ Aurora: Read Replica 자동 스케일링 가능 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 동기화 문제는 없음
오해와 사실
┌─────────────────────────────────────────────────────────────┐
│ │
│ 오해: RDS도 여러 Pod처럼 분산 → 동기화 필요? │
│ │
│ 사실: │
│ ├── RDS는 Pod이 아님 │
│ ├── RDS는 단일 인스턴스 (또는 Primary-Replica 구조) │
│ ├── 모든 Pod이 "같은" RDS 엔드포인트에 접속 │
│ └── 데이터는 RDS 내부에서 단일 진실 (Single Source) │
│ │
│ Pod 1 ──write──→ ┌──────────┐ │
│ Pod 2 ──write──→ │ RDS │ ← 하나의 데이터베이스 │
│ Pod 3 ──read───→ │ (단일) │ │
│ Pod 4 ──read───→ └──────────┘ │
│ │
│ → Pod 간 데이터 동기화 문제 없음 (같은 DB에 접속) │
│ → 동시성 제어는 DB 트랜잭션/락이 처리 │
│ → ACID 보장은 RDS(PostgreSQL/MySQL)의 책임 │
│ │
└─────────────────────────────────────────────────────────────┘
Read Replica 사용 시
┌─────────────────────────────────────────────────────────────┐
│ │
│ Primary-Replica 구조: │
│ │
│ Pod ──write──→ ┌─────────┐ │
│ Pod ──write──→ │ Primary │──비동기 복제──→ ┌─────────┐ │
│ └─────────┘ │ Replica │ │
│ └─────────┘ │
│ Pod ──read───────────────────────────────────→ ↑ │
│ Pod ──read───────────────────────────────────────┘ │
│ │
│ 동기화: │
│ ├── AWS가 자동으로 Primary → Replica 복제 │
│ ├── 비동기 복제 (약간의 지연 있음, 보통 ms 단위) │
│ ├── 애플리케이션은 복제 신경 안 써도 됨 │
│ └── 단, 읽기 직후 쓴 데이터가 안 보일 수 있음 (최종 일관성)│
│ │
└─────────────────────────────────────────────────────────────┘
4. RDS 스케일링 옵션
4.1 수직 스케일링 (Scale Up)
┌─────────────────────────────────────────────────────────────┐
│ │
│ 인스턴스 타입 변경: │
│ │
│ db.t3.medium (2 vCPU, 4GB) │
│ │ │
│ ▼ 수동 변경 (AWS Console / CLI) │
│ db.r5.xlarge (4 vCPU, 32GB) │
│ │ │
│ ▼ │
│ db.r5.4xlarge (16 vCPU, 128GB) │
│ │
│ 특징: │
│ ├── 수동으로 변경해야 함 (자동 아님) │
│ ├── Multi-AZ면 다운타임 최소화 (Failover) │
│ ├── Single-AZ면 다운타임 발생 (수 분) │
│ └── 비용 증가 │
│ │
└─────────────────────────────────────────────────────────────┘
4.2 읽기 복제본 (Read Replica)
┌─────────────────────────────────────────────────────────────┐
│ │
│ 수평 스케일링 (읽기 전용): │
│ │
│ ┌─────────────┐ │
│ │ Primary │ ← 쓰기 전용 │
│ │ (Write) │ │
│ └──────┬──────┘ │
│ │ 비동기 복제 │
│ ┌──────┴──────┬──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │Replica1│ │Replica2│ │Replica3│ ← 읽기 전용 │
│ └────────┘ └────────┘ └────────┘ │
│ │
│ 특징: │
│ ├── RDS: 최대 5개 복제본 │
│ ├── Aurora: 최대 15개 복제본 │
│ ├── 읽기 부하 분산 │
│ ├── 수동 생성 (AWS Console / CLI) │
│ └── Aurora는 Auto Scaling 지원 │
│ │
└─────────────────────────────────────────────────────────────┘
4.3 Aurora Auto Scaling
┌─────────────────────────────────────────────────────────────┐
│ │
│ Aurora 한정 기능: │
│ │
│ 읽기 복제본 자동 증감: │
│ ├── CPU 사용률 기반 │
│ ├── 연결 수 기반 │
│ └── 최소 1개 ~ 최대 15개 설정 │
│ │
│ 예시 정책: │
│ ├── CPU > 70% → Replica 추가 │
│ ├── CPU < 30% → Replica 제거 │
│ └── 최소 2개, 최대 10개 유지 │
│ │
│ 제한: │
│ ├── ✅ Read Replica 자동 스케일링 │
│ ├── ❌ Primary(쓰기) 자동 스케일링 없음 │
│ └── ❌ 일반 RDS에서는 사용 불가 │
│ │
└─────────────────────────────────────────────────────────────┘
4.4 Aurora Serverless v2
┌─────────────────────────────────────────────────────────────┐
│ │
│ Aurora Serverless v2: │
│ │
│ ACU (Aurora Capacity Unit) 기반 자동 스케일링: │
│ ├── 0.5 ACU ~ 128 ACU 범위에서 자동 조절 │
│ ├── 1 ACU ≈ 2GB RAM │
│ ├── 읽기/쓰기 모두 자동 스케일링 │
│ └── 초 단위로 용량 조절 │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ ┌──┐ │ │
│ │ ACU ┌─┘ └─┐ │ │
│ │ ↑ ┌───┘ └───┐ │ │
│ │ │ ┌───┘ └───┐ │ │
│ │ │ ────┘ └──── │ │
│ │ └────────────────────────────────→ 시간│ │
│ │ 부하에 따라 자동으로 용량 조절 │ │
│ └──────────────────────────────────────────┘ │
│ │
│ 장점: │
│ ├── 완전 자동 스케일링 (읽기+쓰기) │
│ ├── 유휴 시 비용 최소화 │
│ └── 급격한 트래픽 변화 대응 │
│ │
│ 단점: │
│ ├── 비용 예측 어려움 │
│ ├── 콜드 스타트 지연 가능 │
│ └── Aurora만 지원 (일반 RDS 불가) │
│ │
└─────────────────────────────────────────────────────────────┘
5. 대규모 트래픽 시 실제 문제들
5.1 Connection 고갈
┌─────────────────────────────────────────────────────────────┐
│ │
│ 문제: │
│ Pod 1000개 × 각 10 connections = 10,000 connections 필요 │
│ │
│ RDS max_connections (인스턴스 크기별): │
│ ├── db.t3.medium ≈ 80 │
│ ├── db.r5.large ≈ 700 │
│ ├── db.r5.4xlarge ≈ 5,000 │
│ └── 아무리 커도 수만 개는 힘듦 │
│ │
│ 증상: │
│ ├── "too many connections" 에러 │
│ ├── 연결 실패 │
│ └── 애플리케이션 장애 │
│ │
└─────────────────────────────────────────────────────────────┘
5.2 해결책: Connection Pooling
┌─────────────────────────────────────────────────────────────┐
│ │
│ RDS Proxy (AWS 관리형): │
│ │
│ Pod 1 ──┐ ┌────────┐ │
│ Pod 2 ──┤ │ │ │
│ Pod 3 ──┼── 10,000 connections ──→│ RDS │── 200 ──→ RDS│
│ ... │ │ Proxy │ connections │
│ Pod 1000─┘ │ │ │
│ └────────┘ │
│ │
│ 특징: │
│ ├── 연결 재사용 (Connection Pooling) │
│ ├── 수천 개 앱 연결 → 수백 개 DB 연결로 변환 │
│ ├── IAM 인증 지원 │
│ ├── Failover 자동 처리 │
│ └── 추가 비용 발생 ($0.015/vCPU/시간) │
│ │
│ 대안: │
│ ├── PgBouncer (PostgreSQL) │
│ ├── ProxySQL (MySQL) │
│ └── 애플리케이션 레벨 풀링 (HikariCP 등) │
│ │
└─────────────────────────────────────────────────────────────┘
6. 권장 아키텍처
대규모 트래픽용
┌─────────────────────────────────────────────────────────────┐
│ │
│ EKS Pods (1000개) │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ RDS Proxy │ ← Connection Pooling │
│ └──────┬──────┘ │
│ │ │
│ ┌────┴────┐ │
│ ▼ ▼ │
│ ┌─────┐ ┌─────────────────────────┐ │
│ │Write│ │ Read Replicas │ │
│ │ DB │ │ ┌────┐ ┌────┐ ┌────┐ │ │
│ │ │──→ │ R1 │ │ R2 │ │ R3 │ │ ← Aurora Auto Scale │
│ └─────┘ │ └────┘ └────┘ └────┘ │ │
│ Primary └─────────────────────────┘ │
│ │
│ Write: Primary (단일, 수동 스케일업) │
│ Read: Replica들 (Aurora Auto Scaling) │
│ Connection: RDS Proxy로 관리 │
│ │
└─────────────────────────────────────────────────────────────┘
애플리케이션 코드 예시
// DataSource 설정
@Configuration
public class DataSourceConfig {
// Write용 DataSource (Primary)
@Bean
@Primary
public DataSource writeDataSource() {
return DataSourceBuilder.create()
.url("jdbc:postgresql://my-db-proxy.proxy-xxx.rds.amazonaws.com:5432/mydb")
.build();
}
// Read용 DataSource (Replica)
@Bean
public DataSource readDataSource() {
return DataSourceBuilder.create()
.url("jdbc:postgresql://my-db-cluster-ro.cluster-xxx.rds.amazonaws.com:5432/mydb")
.build(); // Aurora Reader Endpoint
}
}
7. 비교 정리
RDS vs Aurora
| 항목 | RDS (일반) | Aurora |
|---|---|---|
| Read Replica | 최대 5개 | 최대 15개 |
| Replica Auto Scaling | ❌ | ✅ |
| Serverless 옵션 | ❌ | ✅ (v2) |
| 스토리지 자동 확장 | 제한적 | 자동 (최대 128TB) |
| 복제 지연 | 수 초 | 수 ms |
| 비용 | 저렴 | 20% 정도 비쌈 |
| Failover 속도 | 60-120초 | 30초 이내 |
스케일링 방식 요약
| 방식 | 자동? | 쓰기 스케일링 | 읽기 스케일링 |
|---|---|---|---|
| 수직 스케일링 | 수동 | ✅ | ✅ |
| Read Replica | 수동 | ❌ | ✅ |
| Aurora Auto Scaling | 자동 | ❌ | ✅ |
| Aurora Serverless v2 | 자동 | ✅ | ✅ |
관련 키워드
RDS, EKS, Aurora, Read Replica, Primary, RDS Proxy, Connection Pooling, PgBouncer, ProxySQL, Aurora Auto Scaling, Aurora Serverless, ACU, max_connections, Multi-AZ, Failover