RDS (Relational Database Service)
- AWS 관리형 관계형 데이터베이스
- 프로비저닝, 백업, 패치를 자동화
- EC2에 직접 DB를 설치하는 것보다 운영이 간편
지원하는 데이터베이스 엔진
1. Amazon Aurora
- AWS 자체 개발 엔진
- MySQL/PostgreSQL 호환
- 최고 성능 및 가용성
2. MySQL
- 가장 인기 있는 오픈소스 DB
- 웹 애플리케이션에 적합
3. PostgreSQL - 요새 인기 오르는 추세
- 고급 기능 지원
- 복잡한 쿼리 처리
4. MariaDB
- MySQL 포크
- 커뮤니티 주도 개발
5. Oracle
- 엔터프라이즈급 기능
- BYOL (Bring Your Own License) 가능
6. SQL Server
- Microsoft 데이터베이스
- Windows 애플리케이션 통합
EC2에 DB 설치 vs RDS
항목 | EC2 자체 관리 | RDS |
설치 및 설정 | 직접 수행 | 자동화 |
백업 | 수동 스크립트 | 자동 백업 |
OS 패치 | 직접 관리 | 자동 적용 |
고가용성 | 직접 구성 | Multi-AZ 클릭 |
확장 | 다운타임 필요 | 간편한 스케일링 |
모니터링 | 직접 구축 | CloudWatch 통합 |
비용 | 저렴 (시간 투자) | 비쌈 (편의성) |
RDS 주요 기능
1. 자동 백업
- 매일 전체 백업 (retention period 설정 가능)
- 5분마다 트랜잭션 로그 백업
- Point-in-time Recovery (특정 시점으로 복구)
- 보관 기간: 0~35일
# RDS 인스턴스 생성 (자동 백업 활성화)
aws rds create-db-instance \
--db-instance-identifier mydb \
--db-instance-class db.t3.micro \
--engine mysql \
--master-username admin \
--master-user-password MyPassword123 \
--allocated-storage 20 \
--backup-retention-period 7 \
--preferred-backup-window "03:00-04:00"
# 특정 시점으로 복구
aws rds restore-db-instance-to-point-in-time \
--source-db-instance-identifier mydb \
--target-db-instance-identifier mydb-restored \
--restore-time 2024-11-17T10:30:00Z
2. 수동 스냅샷
- 사용자가 명시적으로 생성
- 무제한 보관 가능
- 리전 간 복사 가능
# 스냅샷 생성
aws rds create-db-snapshot \
--db-instance-identifier mydb \
--db-snapshot-identifier mydb-snapshot-20241117
# 스냅샷으로부터 복원
aws rds restore-db-instance-from-db-snapshot \
--db-instance-identifier mydb-new \
--db-snapshot-identifier mydb-snapshot-20241117
# 스냅샷 다른 리전으로 복사
aws rds copy-db-snapshot \
--source-db-snapshot-identifier arn:aws:rds:ap-northeast-2:...:snapshot:mydb-snapshot \
--target-db-snapshot-identifier mydb-snapshot-us \
--source-region ap-northeast-2 \
--region us-east-1
3. Multi-AZ 배포
고가용성을 위한 필수 설정
Primary Instance (AZ-A) ↓ 동기 복제 Standby Instance (AZ-C) ↓ 자동 장애 조치 (Failover)
작동 방식:
- Primary DB에 쓰기 수행
- Standby DB로 동기 복제
- Primary 장애 시 자동으로 Standby로 전환
- DNS 자동 업데이트 (애플리케이션 수정 불필요)
장애 조치 시간: 약 60-120초
# Multi-AZ 활성화
aws rds modify-db-instance \
--db-instance-identifier mydb \
--multi-az \
--apply-immediately
주의사항:
- Standby는 읽기 트래픽을 처리하지 않음 (순수 대기용)
- 읽기 확장을 원하면 Read Replica 사용
4. Read Replica
읽기 성능 확장
Primary DB (읽기+쓰기)
↓ 비동기 복제
┌───────┬───────┬───────┐
│Read │Read │Read │
│Replica│Replica│Replica│
│ (읽기)│ (읽기)│ (읽기)│
└───────┴───────┴───────┘
- 최대 15개의 Read Replica 생성 가능
- 동일 리전 또는 다른 리전
- 비동기 복제 (약간의 지연 발생)
- Replica를 Primary로 승격 가능
사용 사례:
- 리포팅 및 분석 쿼리
- 대시보드 조회
- 검색 기능
- 읽기 부하가 높은 애플리케이션
# Read Replica 생성
aws rds create-db-instance-read-replica \
--db-instance-identifier mydb-replica \
--source-db-instance-identifier mydb \
--db-instance-class db.t3.micro
# Replica를 독립 DB로 승격
aws rds promote-read-replica \
--db-instance-identifier mydb-replica
Multi-AZ vs Read Replica:
항목 | Multi-AZ | Read Replica |
목적 | 고가용성 | 읽기 확장 |
복제 방식 | 동기 | 비동기 |
Standby 읽기 | 불가능 | 가능 |
장애 조치 | 자동 | 수동 승격 |
비용 | Primary + Standby | Primary + N개 Replica |
5. 스토리지 자동 확장
초기: 20GB
↓ 사용량 증가
자동 확장: 30GB
↓
자동 확장: 50GB
↓
최대: 1000GB (설정한 한도)
설정:
- 최대 스토리지 임계값 지정
- 여유 공간 < 10% 시 자동 확장
- 6시간 이내 다시 확장 안 함
# 스토리지 자동 확장 활성화
aws rds modify-db-instance \
--db-instance-identifier mydb \
--max-allocated-storage 1000 \
--apply-immediately
Amazon Aurora
- AWS가 클라우드를 위해 재설계한 데이터베이스
- MySQL 및 PostgreSQL과 호환
- RDS보다 5배(MySQL) ~ 3배(PostgreSQL) 빠름
Aurora의 아키텍처
1. 스토리지 자동 확장
10GB에서 시작
↓
128TB까지 자동 확장 (10GB 단위)
2. 고가용성 설계
3개 AZ에 데이터 6개 복사본 저장
AZ-A: [Copy 1] [Copy 2]
AZ-B: [Copy 3] [Copy 4]
AZ-C: [Copy 5] [Copy 6]
쓰기: 6개 중 4개 승인 필요
읽기: 6개 중 3개 승인 필요
→ 2개 복사본 손실되어도 정상 작동
3. 자가 복구
- 손상된 데이터 블록 자동 복구
- P2P 복제로 빠른 복구
Aurora 클러스터 구조
[Writer Endpoint] → Primary Instance (읽기+쓰기)
↓ 복제
[Reader Endpoint] → ┌─ Read Replica 1
├─ Read Replica 2
└─ Read Replica 3
Writer Endpoint:
- 항상 Primary 인스턴스를 가리킴
- 장애 조치 시 자동으로 새 Primary로 전환
Reader Endpoint:
- 모든 Read Replica로 로드 밸런싱
- 자동으로 새 Replica 추가/제거
Aurora 고급 기능
1. Aurora Serverless
- 사용량에 따라 자동으로 확장/축소
- 용량 단위: ACU (Aurora Capacity Unit)
- 사용하지 않을 때 자동 일시 중지
사용 사례:
- 간헐적 트래픽
- 개발/테스트 환경
- 예측 불가능한 워크로드
가격:
- 사용한 ACU × 시간만큼만 과금
- 일시 중지 시 스토리지 비용만 발생
# Aurora Serverless v2 생성
aws rds create-db-cluster \
--db-cluster-identifier myaurora-serverless \
--engine aurora-mysql \
--engine-version 8.0.mysql_aurora.3.02.0 \
--serverless-v2-scaling-configuration \
MinCapacity=0.5,MaxCapacity=1 \
--master-username admin \
--master-user-password MyPassword123
2. Global Database
- 최대 5개 보조 리전
- 리전 간 복제 지연 < 1초
- 재해 복구 시간(RTO) < 1분
Primary Region (ap-northeast-2)
↓ 비동기 복제 (<1초)
Secondary Region (us-east-1)
↓
Secondary Region (eu-west-1)
사용 사례:
- 글로벌 서비스
- 재해 복구
- 지역별 읽기 성능 최적화
# Global Database 생성
aws rds create-global-cluster \
--global-cluster-identifier myglobal \
--engine aurora-mysql
# 보조 리전 클러스터 추가
aws rds create-db-cluster \
--db-cluster-identifier myaurora-secondary \
--engine aurora-mysql \
--global-cluster-identifier myglobal \
--region us-east-1
3. Aurora Machine Learning
SQL에서 직접 ML 모델 호출 가능
-- SageMaker 모델 호출
SELECT
customer_id,
aws_sagemaker_invoke_endpoint(
'fraud-detection-endpoint',
transaction_data
) AS fraud_score
FROM transactions;
-- Comprehend로 감정 분석
SELECT
review_id,
aws_comprehend_detect_sentiment(review_text, 'en') AS sentiment
FROM reviews;
Aurora 비용 최적화
1. Aurora I/O-Optimized
기존 모델:
- 인스턴스 비용 + I/O 요청당 과금
I/O-Optimized:
- 인스턴스 비용만 (40% 높음)
- I/O 무제한 무료
선택 기준:
I/O 비용이 인스턴스 비용의 25% 초과 시
→ I/O-Optimized 선택
2. Backtrack
- 특정 시점으로 '되돌리기' (복원이 아님)
- 72시간 이내 어느 시점으로든 가능
- 수 초 내에 완료
- MySQL만 지원
# Backtrack 활성화
aws rds modify-db-cluster \
--db-cluster-identifier myaurora \
--backtrack-window 72 \
--apply-immediately
# 특정 시점으로 Backtrack
aws rds backtrack-db-cluster \
--db-cluster-identifier myaurora \
--backtrack-to 2024-11-17T10:30:00Z
ElastiCache
개념
- 인메모리 캐시 서비스
- Redis 또는 Memcached 엔진
- 읽기 성능 극대화 (밀리초 단위 지연)
Redis vs Memcached
기능 | Redis | Memcached |
데이터 타입 | 문자열, 리스트, 셋, 해시 등 | 문자열만 |
다중 AZ | 지원 (자동 장애 조치) | 미지원 |
Read Replica | 지원 | 미지원 |
백업/복원 | 지원 | 미지원 |
Pub/Sub | 지원 | 미지원 |
멀티 스레드 | 싱글 스레드 | 멀티 스레드 |
사용 사례 | 복잡한 데이터, HA 필요 | 단순 캐시, 높은 처리량 |
Redis 클러스터 모드
1. Cluster Mode Disabled (기본)
Primary Node (읽기+쓰기)
↓
┌─ Replica 1 (읽기)
├─ Replica 2 (읽기)
└─ Replica 3 (읽기)
- 단일 샤드
- 최대 5개 Replica
- 간단한 구성
2. Cluster Mode Enabled
Shard 1: [Primary] → [Replica]
Shard 2: [Primary] → [Replica]
Shard 3: [Primary] → [Replica]
- 데이터가 여러 샤드에 분산
- 최대 500개 노드
- 확장성 극대화
캐싱 전략
1. Lazy Loading (Cache-Aside)
def get_user(user_id):
# 캐시 먼저 확인
user = cache.get(f"user:{user_id}")
if user is None:
# 캐시 미스: DB에서 조회
user = db.query(f"SELECT * FROM users WHERE id={user_id}")
# 캐시에 저장
cache.set(f"user:{user_id}", user, ttl=3600)
return user
장점:
- 필요한 데이터만 캐시
- 캐시 장애 시에도 서비스 가능
단점:
- 첫 요청은 느림 (캐시 미스)
- 캐시 데이터가 오래될 수 있음
2. Write-Through
def update_user(user_id, data):
# DB 업데이트
db.update(f"UPDATE users SET ... WHERE id={user_id}")
# 캐시도 함께 업데이트
cache.set(f"user:{user_id}", data, ttl=3600)
장점:
- 캐시 데이터 항상 최신
- 읽기 성능 우수
단점:
- 모든 데이터를 캐시 (불필요한 데이터도)
- 쓰기 지연 증가
3. Hybrid (Lazy + TTL)
def get_user(user_id):
user = cache.get(f"user:{user_id}")
if user is None:
user = db.query(f"SELECT * FROM users WHERE id={user_id}")
cache.set(f"user:{user_id}", user, ttl=300) # 5분 TTL
return user
권장 방식:
- Lazy Loading + 적절한 TTL
- 중요한 데이터는 Write-Through
ElastiCache 활용 사례
1. 세션 저장소
# Flask 세션 저장
from flask_session import Session
from redis import Redis
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis(host='elasticache-endpoint')
Session(app)
2. 리더보드
# Redis Sorted Set으로 구현
# 점수 추가/업데이트
redis.zadd('leaderboard', {'player1': 1000, 'player2': 850})
# 상위 10명 조회
top10 = redis.zrevrange('leaderboard', 0, 9, withscores=True)
3. Rate Limiting
def is_rate_limited(user_id):
key = f"ratelimit:{user_id}"
count = redis.incr(key)
if count == 1:
redis.expire(key, 60) # 1분 TTL
return count > 100 # 분당 100 요청 제한
데이터베이스 선택 가이드
RDS vs Aurora
RDS 선택:
- 기존 MySQL/PostgreSQL 사용 중
- 예산 제약
- 간단한 워크로드
Aurora 선택:
- 고성능 필요
- 높은 가용성 필요
- 자동 확장 필요
- 글로벌 서비스
데이터베이스 엔진 선택
관계형 데이터 → RDS 또는 Aurora
├─ 고성능 + 확장성 → Aurora
├─ MySQL 호환 → Aurora MySQL 또는 RDS MySQL
├─ PostgreSQL 호환 → Aurora PostgreSQL 또는 RDS PostgreSQL
├─ 엔터프라이즈 → Oracle 또는 SQL Server
└─ 예산 중시 → RDS MySQL/PostgreSQL
키-값 캐시 → ElastiCache
├─ 단순 캐시 → Memcached
└─ 고급 기능 → Redis
NoSQL → DynamoDB
문서 DB → DocumentDB
그래프 DB → Neptune
시계열 → Timestream
원장 DB → QLDB
보안 모범 사례
1. 네트워크 격리
Internet
↓
Public Subnet
├─ [Application Server]
↓
Private Subnet
└─ [RDS] (외부 접근 차단)
2. 암호화
# 저장 데이터 암호화 (생성 시에만 설정 가능)
aws rds create-db-instance \
--storage-encrypted \
--kms-key-id arn:aws:kms:...
# 전송 중 암호화 (SSL/TLS)
mysql -h mydb.xxxxx.rds.amazonaws.com \
--ssl-ca=rds-ca-2019.pem \
--ssl-mode=REQUIRED
3. IAM 인증
# IAM 데이터베이스 인증 활성화
aws rds modify-db-instance \
--db-instance-identifier mydb \
--enable-iam-database-authentication
# 임시 토큰 생성
TOKEN=$(aws rds generate-db-auth-token \
--hostname mydb.xxxxx.rds.amazonaws.com \
--port 3306 \
--username iamuser)
# 토큰으로 연결
mysql -h mydb.xxxxx.rds.amazonaws.com \
--user=iamuser \
--password="$TOKEN" \
--enable-cleartext-plugin
마치며
AWS 데이터베이스 서비스는 운영 부담을 줄이고 성능을 최적화하는 강력한 도구입니다.
핵심 요약:
- RDS로 관리형 관계형 DB 운영
- Aurora로 고성능 및 확장성 확보
- ElastiCache로 읽기 성능 극대화
- Multi-AZ로 고가용성 구현
- Read Replica로 읽기 확장
다음 글에서는 Route 53을 활용한 DNS 관리와 트래픽 라우팅을 알아보겠습니다.
Share article