AWS RDS는 관계형 데이터베이스(RDBMS)를 쉽게 설정, 운영하게 하는 관리형 데이터베이스 서비스이다.
RDS는 MySQL, PostgreSQL, Oracle 등의 다양한 DB엔진을 지원하고, 자동 백업, Auto-Scaling, Cloudwatchf를 통한 모니터링 등을 지원해 DB 관리에 드는 노력과 부담을 줄여준다.
이러한 RDS의 기능 중 Multi-AZ와 Read Replica는 DB의 가용성, 성능, 확장성을 크게 향상시킬 수 있는 요소이다.
이번에는 이러한 Multi-AZ와 Read Replica를 알아보고 직접 구성해보도록 한다.
Multi-AZ
2개 이상의 AZ(가용영역, Availability Zone)에 걸쳐 DB를 구축하는 아키텍쳐, DB의 가용성을 높인 구조로 볼 수 있다.
Multi-AZ의 DB 인스턴스는 Primary와 Standby로 나뉘는데, RDS 엔드포인트는 Primary DB를 바라보도록 연결되고, Standby DB에는 직접 접근할 수 없도록 구성이 되어있다.
AZ에 걸쳐 생성된 DB끼리는 동기식 복제(Synchrnous replication)를 통해 내용 동기화를 진행한다.
이렇게 운영되다가 Primary DB에 장애가 발생하는 경우, RDS는 장애를 파악한 뒤 Standby DB를 Primary 급으로 승격시켜 엔드포인트에 연결되도록 사용하게 된다.
즉, DB에 접속하기 위한 RDS 엔드포인트 주소는 그대로이되, 이와 연결되는 DB 인스턴스의 주소가 Primary로 승급된 Standby DB로 바뀌게 되는 것이다.
이와 같은 복구를 Fail-over라 한다.
이러한 Multi-AZ 구성은 RDS DB 인스턴스를 2개 켜두는 것과 같다. 따라서 청구되는 금액도 인스턴스 2개 분량이 된다.
Read Replica
DB의 복제본을 생성해, 읽기 작업은 복제본이 처리하도록 구성하는 아키텍쳐, DB의 성능을 높이기 위한 구조로 볼 수 있다.
원본 DB와 복제본 DB 사이에서 비동기적 복제(Asynchronous replication)가 발생한다.
DB 작업의 대부분은 읽기가 차지한다는 점에서 고안된 아키텍쳐로, 읽기 작업에 대한 부하를 분산시키는 효과가 있다.
쓰기/삭제와 같은 작업은 Master DB에서 수행하며, 읽기 작업은 복제본에서 수행하게 되어 Master DB의 부하를 줄일 수 있게 되는 것이다.
Read Replica는 앞서 살펴본 Multi-AZ와는 달리 복제본에 대해 작업(읽기)을 해야하기 때문에, 복제본 DB에 대한 DNS가 별도로 주어진다.
Master와 같은 AZ에 Read Replica를 구성할 수 있고, 다른 AZ에 Read Replica를 구성할 수도 있다.
구성 실습
앞서 알아본 Multi-AZ와 Read Replica를 설정한 RDS를 직접 구축해 기능을 알아보도록 한다.
각 기능은 Terraform을 이용해 구축한 환경에서 테스트 해본다.
실습에 사용된 Code는 Github을 참고
Multi-AZ
리소스와 환경을 구축하면 RDS 엔드포인트와 구축된 네트워킹 상태 등을 확인할 수 있다.
이 실습에서는 ap-northeast-2a와 ap-northeast-2c 가용영역에 각각 서브넷을 생성해 RDS 서브넷 그룹으로 지정해주었다.
172.18.3.0/24는 ap-northeast-2a, 172.18.4.0/24는 ap-northeast-2c로 구성됨을 확인할 수 있다.
이제 같이 생성된 인스턴스에 접속한 뒤, RDS 엔드포인트에 접근해 어떤 AZ의 RDS 인스턴스로 연결되는지 확인해본다.
while true; do host [RDS 엔드포인트 DNS]; sleep 1; done
확인하면 2c 가용영역의 RDS 인스턴스로 접근하는 것을 볼 수 있다.
이어서 이 RDS 인스턴스를 재부팅시켜 서비스 불능 상태로 전환시켜본다.
앞서 알아본 Multi-AZ 기능에 따르면, Master DB에 접근이 불가능해지는 경우 자동으로 Standby DB가 Master로 승격될 것이다.
RDS를 재부팅시킨 뒤, 해당 엔드포인트에 연결된 DB 인스턴스의 주소가 2a 가용영역으로 변경된 것을 볼 수 있다.
Read Replica
Read Replica도 2a 가용영역에 Master DB, 2c에 Read Replica를 두었다. 물론 Read Replica를 2a에도 둘 수 있다.
RDS DB목록을 확인하면 아래와 같이 2개가 Master와 복제본으로 구성이 된 것을 볼 수 있다. 그리고 각각의 엔드포인트 DNS 주소도 내용이 다른 것도 볼 수 있다.
먼저 Read Replica에 담긴 데이터를 확인해본다.
그리고 Master DB에 데이터를 Write한다.
다시 Read Replica에 담긴 데이터를 확인하면, Master DB에 Write된 내용이 동기화되어 읽을 수 있게 됨을 볼 수 있다.
Read Replica의 지연시간은 `ReplicaLag`라는 Cloudwatch Metric으로 확인할 수 있다.
0에 가까울수록 Replica의 데이터가 Master와 완벽하게 동기화가 되었다는 것을 나타낸다.
데이터 전송 비용
일반적으로 동일한 AZ에 위치한 리소스끼리의 데이터 전송비용은 청구되지 않고, 다른 AZ나 리전으로 통신하는 데이터에 대해서만 GB단위로 청구가 된다.
그리고 Multi-AZ 구성에서의 Replication을 위해 통신되는 데이터는 청구되지 않는다.
자세한 RDS 요금은 아래 링크에서 확인할 수 있다.