[AWS] RDS, Aurora, ElastiCache

silver's avatar
Nov 17, 2025
[AWS] RDS, Aurora, ElastiCache

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)
작동 방식:
  1. Primary DB에 쓰기 수행
  1. Standby DB로 동기 복제
  1. Primary 장애 시 자동으로 Standby로 전환
  1. 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 (읽기+쓰기) ↓ 비동기 복제 ┌───────┬───────┬───────┐ │ReadReadRead │ │ReplicaReplicaReplica│ │ (읽기)│ (읽기)│ (읽기)│ └───────┴───────┴───────┘
  • 최대 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

silver