Aurora
- AWS의 독점 기술 (오픈소스 X)
- Postgre / MySQL과 호환 (드라이버 호환 O)
- 클라우드 최적화, 기능을 통해 RDS에서 MySQL 대비 5배 / Postgre 대비 3배 높은 성능
- 스토리지 자동 스케일링 (10GB up to 128TB)
- 15개 Read Replica 가능 및 복제 속도 빠름 (MySQL은 5개)
- 리전 간 복제 지원
- 즉각적인 장애 복구 (MySQL의 다중 AZ 장애 조치보다 훨씬 빠름)
- Master 장애 발생 시 평균 30초 이내 장애조치
- 클라우드 네이티브로 고가용성 제공
- 다른 RDS보다 20% 더 많은 비용 <-> 고효율
Aurora의 고가용성 및 읽기 확장성, DB 클러스터
- 데이터에 대해서 3개의 AZ에 6개의 사본이 저장됨
- 쓰기에 대해서는 6개 중 4개 사본 필요 (하나의 AZ가 다운되어도 문제 X)
- 읽기에 대해서는 6개 중 3개 사본 필요
- 데이터 손상 시 자가 복구 프로세스를 통해 백엔드에서 P2P(Peer - to Peer) 복구
- 공유 스토리지는 100개의 Volume에 분산 (직접 관리 X 백엔드에서 이루어짐. 위험 감소)
- 마스터만이 스토리지에 write
- 기본적으로 1개의 Master
- Writer EndPoint (DNS name)를 가지며, 항상 마스터를 가리킴
- 클라이언트는 항상 Writer EndPoint를 통해 통신, 인스턴스에 리디렉션
- Reader EndPoint (DNS name)을 가지며, 모든 Read Replica에 로드밸런싱하여 자동으로 연결
RDS & Aurora 보안
- 미사용 데이터 암호화
- AWS KMS를 통해 암호화 (DB 처음 실행 시 실행 타임에 정의되어야 함)
- Master DB가 암호화되지 않은 경우, Read Replica도 암호화되지 않음
- 암호화 되지 않은 DB를 암호화하기 위해서는 DB의 스냅샷을 가져와 암호화 된 상태로 복원
- 전송 중 암호화 (In-flight)
- AWS 웹사이트에서 제공하는 AWS의 TLS 루트 인증서 사용
- IAM Role을 통해 username / pw 대신 DB 접근 가능
- 보안 그룹을 사용해 DB 네트워크 액세스 제어 가능
- 특정 포트, IP, 보안그룹
- RDS, Aurora는 SSH 액세스를 가지고 있지 않음 (관리형 서비스이므로, AWS RDS Custom 제외)
- CloudWatch 로그 서비스를 통해 로그 저장 가능
RDS Proxy
- RDS Proxy 사용 시 애플리케이션이 DB로 설정된 연결을 풀링, 공유 받을 수 있음
- RDS 인스턴스에 대한 연결이 많은 경우 앞에 Proxy를 두어 CPU, RAM 등 DB 리소스에 대한 스트레스를 줄여 효율성 향상
- open connection, timeout 최소화
- ex) 수백개로 증가하는 람다 함수를 풀링하여 적은 연결로 DB 인스턴스에 대한 open connection, timeout 최소화
- 완전한 서버리스, 오토스케일링 (용량관리 불필요)
- 다중 AZ로 고가용성
- RDS 프록시는 장애 발생 시 장애조치를 직접 처리해 장애 조치 시간 최대 66% 감소
- MySQL, Postgre, MariaDB, Aurora에 대해 지원
- 애플리케이션 코드 수정 불필요 (DB 인스턴스 대신 프록시에 연결하면 끝)
- [보안 강화] DB의 IAM 인증 수행 (IAM을 통해서만 DB 접근 가능)
- 해당 자격증명은 AWS Secrets Manager에 안전하게 저장됨
- VPC에서만 액세스 가능 (인터넷 등 공개적인 액세스 불가능)
ElastiCache
- Redis, Memcached에 대한 관리형 서비스
- 캐시는 높은 성능과 짧은 대기시간을 가진 인메모리 DB
- 읽기 집약적인 워크로드에 대한 DB 부하를 줄일 수 있도록 함
- App 상태를 ElastiCache에 저장해 App을 Stateless로 만들 수 있음
- AWS는 OS 관리 / 패칭, 최적화, 셋업, 구성, 모니터링, 장애복구, 백업 지원
- DB 쿼리 전후 애플리케이션 변경을 통한 캐시 쿼리를 해야하므로 애플리케이션 코드 변경이 많이 요구됨
- 아키텍처 1) ElastiCache에서 Cache Hit 시 바로 데이터 반환 / Miss 시 RDS에서 데이터 반환
- RDS 부하 감소
- 최신 데이터를 위한 캐시 무효화 전략이 필요
- 아키텍처 2) ElastiCache에서 사용자 세션 저장을 통한 애플리케이션 무상태 유지
- 어떤 인스턴스에서 접근하든 ElastiCache에서 사용자 세션을 얻어옴
Redis vs Memcached
- Redis (고가용성, 백업, 데이터 내구성, 캐시기능)
- Multi AZ를 통한 자동 장애복구 지원
- Read Replica 스케일링을 통한 고가용성 지원
- AOF 지속성을 통한 데이터 내구성
- Append Only File
- 데이터 변경에 대한 커맨드를 AOF 파일에 기록하고 해당 파일을 기반으로 복원
- 백업, 복원 기능 존재
- Set, Sorted Set 타입 지원
- Memcached (분산된 순수 캐시, 데이터 손실 가능성 있음)
- 데이터 파티셔닝에 다중 노드 사용 (샤딩)
- 복제 X (고가용성 X)
- 지속적인 캐시 X
- 백업, 복원 기능 X
- 멀티 스레드 아키텍처로, 샤딩을 통한 여러 인스턴스 보유
ElastiCache 캐시 전략
- Lazy Loading / Cache-Aside / Lazy Population (구현 쉬움, 많은 상황에서 기본적으로 사용, 읽기성능 개선)
- 캐시 히트 시 ElastiCache에서 데이터 바로 반환
- 캐시 미스 시 DB에서 데이터 반환 / 애플리케이션은 데이터를 ElastiCache에 Write
- 장점
- 오직 요청된 데이터만 캐싱
- 캐싱 실패, 노드 실패 시 치명적이지 않음 (캐시에 write 하기 위한 예열시간만 존재)
- 단점
- [읽기 페널티] 캐시 미스 시 3번의 네트워크 호출 (RDS Read, DB Read, 캐시 Write)
- 데이터가 RDS에서 업데이트 되어도 ElastiCache에는 오래된 데이터 존재할 수 있음
- Write Through (구현 어려움, 레이지 로딩의 단점을 보완한 것이므로 첫번째 우선순위로는 X, 오래된 캐시 개선을 위함)
- DB가 업데이트 될 때 캐시도 함께 업데이트
- 장점
- 오래된 데이터가 존재할 수 없음
- [쓰기 페널티] 캐시 미스 시 2번의 네트워크 호출 (RDS, 캐시 Write) (vs 읽기 페널티 3번 호출)
- 단점
- RDS에 쓰기 전까지 데이터 누락될 수 있음 (Lazy Loading과 결합 가능, Cache에 데이터 없을 시 RDS에서 Lazy Loading)
- 캐시 이탈률 - RDS에 많은 데이터가 쓰일 때 캐시에도 같이 쓰이지만 캐시에서 읽히지 않을 가능성 (캐시가 작을 경우 문제)
- Cache Evictions and Time-to-Live (TTL)
- 제한된 캐시 크기를 위해 캐시를 제거하기 위한 전략 Cache Evictions
- 최근에 사용되지 않은 항목 제거 (LRU, Least Recently Used)
- 또는 TTL 설정하여 제거 (리더보드, 코멘트, 활동 스트림 등에 유용)
- TTL은 초, 시간, 일 단위로 가능
- 너무 많이 제거된다면 캐시 크기 늘리는 것을 고려
- 캐싱은 자주 변하는 데이터에 적합하지 않음
Reference
'Programming' 카테고리의 다른 글
[AWS, Certified Developer Associate] VPC (0) | 2024.05.06 |
---|---|
[AWS, Certified Developer Associate] DNS, Route 53 (0) | 2024.05.06 |
[AWS, Certified Developer Associate] RDS - Storage Auto Scaling, Read Replica, Multi-AZ (0) | 2024.05.01 |
[AWS, Certified Developer Associate] ASG (0) | 2024.04.29 |
[AWS, Certified Developer Associate] Load Balancer (0) | 2024.04.29 |