RDS Cross-Region Replication & Failover 테스트
AWS RDS와 Aurora Global Database를 활용한 리전 간 재해 복구 솔루션 테스트입니다. 읽기 전용 복제본 기반 Failover와 글로벌 데이터베이스 클러스터 구성을 확인합니다.
개요
최근 RDS 재해 복구에 대한 요구사항을 받게되었습니다.
RDS는 기본적으로 관리형 서비스이므로 리전간 재해 복구가 가능할 것으로 생각했으며 이를 검증하기 위해 읽기 전용 복제본을 활용하여 Failover가 정상적으로 구성되는지 테스트해보았습니다.
추가적으로 Aurora Global Database를 사용해보며 글로벌 데이터베이스의 클러스터는 어떻게 구성되는지 확인하고 Failover를 테스트 해보았습니다.
Process
RDS 마스터 데이터베이스와 슬레이브(읽기 전용) 데이터베이스를 생성합니다.
크로스 리전 복제본을 지원하는 인스턴스는 아래 링크에서 확인할 수 있습니다.


DB가 정상적으로 실행되었다면 테스트를 위해 Master DB를 삭제합니다.

삭제 이후 Slave DB가 Master와 연결을 지속적으로 시도 후 자동으로 독립 DB 인스턴스로 승급됩니다.


혹은 이벤트를 통해 승급시키는 방법도 존재합니다.

단순 Failover 뿐만 아니라 다양한 이유로 읽기 전용 복제본을 승급하는 경우 또한 존재하며 대표적인 사례는 다음과 같습니다.
- 장애 복구 - 주 데이터베이스에 문제가 생기면 읽기 전용 복제본을 승격시켜 복구할 수 있습니다. 장애 발생 시 복제본을 승격하고, 트래픽을 새로운 인스턴스로 전환한 뒤, 새 복제본을 만들면 됩니다.
- 스토리지 업그레이드 - 현재 DB가 최신 스토리지 구성이 아니라면, 복제본을 만들어 스토리지를 업그레이드한 후 승격시킬 수 있습니다. 이는 특히 오래된 32비트 파일 시스템의 한계를 극복하는 데 유용합니다.
- 샤딩 - 큰 데이터베이스를 여러 작은 데이터베이스로 나누는 방식입니다. 관련 없는 테이블들을 분리하거나, 같은 테이블을 여러 호스트에 복제하는 방법이 있습니다. 각 샤드를 위한 복제본을 만들고 필요시 승격할 수 있습니다.
- DDL 작업(MySQL/MariaDB) - 인덱스 생성 같은 무거운 작업은 읽기 전용 복제본에서 수행한 후, 작업이 완료되면 해당 복제본을 승격시켜 사용할 수 있습니다.
- 읽기 전용 복제본 상태에서 직접 DDL을 실행하는 것이 아니라, 복제본을 승격시켜 독립 DB로 만든 후에 작업하라는 의미입니다. 이렇게 하면 기본 DB의 성능에 영향을 주지 않고 구조 변경 작업
더 자세한 내용은 아래 링크를 참조해주세요
https://docs.aws.amazon.com/kokr/AmazonRDS/latest/UserGuide/USERReadRepl.Promote.html
- 읽기 전용 복제본:
- 읽기 부하 분산이 주목적
- Multi-AZ 구성:
- 고가용성이 주목적
- 기본 인스턴스 장애 시 대기 인스턴스로 자동 전환됨
- 별도의 수동 조작 불필요
Aurora Global database
Aurora Global Database를 생성합니다.
- t3.medium 이상의 인스턴스 스펙이 필요합니다.

Aurora Global Cluster의 경우엔 글로벌 엔드포인트를 확인할 수 있습니다.

nslookup bjchoi-aurora-cluster.global-glbpwwwgrlyd.global.rds.amazonaws.com
Server: 203.248.252.2
Address: 203.248.252.2#53
Non-authoritative answer:
bjchoi-aurora-cluster.global-glbpwwwgrlyd.global.rds.amazonaws.com canonical name = bjchoi-aurora-global-test.cluster-csuhqyt3lq7d.ap-northeast-2.rds.amazonaws.com.
bjchoi-aurora-global-test.cluster-csuhqyt3lq7d.ap-northeast-2.rds.amazonaws.com canonical name = bjchoi-aurora-global-test-instance-1.csuhqyt3lq7d.ap-northeast-2.rds.amazonaws.com.
bjchoi-aurora-global-test-instance-1.csuhqyt3lq7d.ap-northeast-2.rds.amazonaws.com canonical name = ec2-3-38-33-33.ap-northeast-2.compute.amazonaws.com.
Name: ec2-3-38-33-33.ap-northeast-2.compute.amazonaws.com
Address: 3.38.33.33
장애 조치를 시작합니다.

전환(Switchover)
- 계획된 작업: 정상 상태의 글로벌 클러스터에서 사전 계획된 이벤트로 수행됩니다.
- 데이터 손실 없음: 데이터 손실이 발생하지 않습니다.
- 용도: 리전 순환이나 장애 조치 후 이전 기본 클러스터로 복구하는 등 계획된 작업에 사용됩니다.
- 프로세스: 기본 DB와 선택한 보조 DB 클러스터의 역할을 전환합니다.
- 제한 사항: 전환 과정 동안에는 글로벌 데이터베이스에 쓰기 작업을 할 수 없습니다(몇 분 소요).
장애 조치(Failover)
- 비계획 작업: 기본 리전의 재해와 같은 계획되지 않은 이벤트에 대응하기 위해 사용됩니다.
- 데이터 손실 가능성: 커밋되지 않은 작업과 보조 클러스터로 복제되지 않은 커밋된 트랜잭션에서 데이터 손실이 발생할 수 있습니다.
- 용도: 주로 재해 복구 시나리오에서 사용됩니다.
- 프로세스: 기본 DB 클러스터를 지정된 보조 DB 클러스터로 강제 전환합니다.
장애조치(Failover)를 선택하여 작업을 수행합니다.

➜ ~ nslookup bjchoi-aurora-cluster.global-glbpwwwgrlyd.global.rds.amazonaws.com
Server: 203.248.252.2
Address: 203.248.252.2#53
Non-authoritative answer:
bjchoi-aurora-cluster.global-glbpwwwgrlyd.global.rds.amazonaws.com canonical name = bjchoi-aurora-cluster-cluster-1.cluster-clpmipqca15k.us-east-1.rds.amazonaws.com.
bjchoi-aurora-cluster-cluster-1.cluster-clpmipqca15k.us-east-1.rds.amazonaws.com canonical name = bjchoi-aurora-cluster-instance-1.clpmipqca15k.us-east-1.rds.amazonaws.com.
bjchoi-aurora-cluster-instance-1.clpmipqca15k.us-east-1.rds.amazonaws.com canonical name = ec2-54-211-161-70.compute-1.amazonaws.com.
Name: ec2-54-211-161-70.compute-1.amazonaws.com
Address: 54.211.161.70