본문 바로가기
ETC DB

Amazon Aurora 스토리지

by 타마마임팩트_쫀 2021. 7. 21.

1. Aurora 스토리지 개요

Aurora SSD(Solid State Drive)를 사용하는 단일 가상 볼륨인 클러스터 볼륨에 저장됩니다. 클러스터 볼륨은 동일한 AWS 리전에 속한 다중 가용 영역의 데이터 사본으로 구성되어 있습니다. 이러한 가용 영역에서 데이터가 자동으로 복제되기 때문에 데이터 손실 가능성은 줄고 오히려 내구성이 크게 높아집니다. 이러한 복제를 통해 장애 조치 중에도 데이터베이스의 가용성이 높아집니다. 데이터 사본이 이미 나머지 가용 영역에 존재하여 DB 클러스터의 DB 인스턴스에 대한 데이터 요청을 계속 처리할 수 있기 때문입니다. 복제 양은 클러스터의 DB 인스턴스 수와는 관계가 없습니다.

 

 

2. 클러스터 볼륨에 포함된 항목

Aurora 클러스터 볼륨에는 모든 사용자 데이터, 스키마 객체, 내부 메타데이터(예: 시스템 테이블 및 이진 로그)가 포함되어 있습니다. 예를 들어 Aurora는 클러스터 볼륨의 Aurora 클러스터에 대한 모든 테이블, 인덱스, BLOB(Binary Large Object), 저장 프로시저 등을 저장합니다.

Aurora 공유 스토리지 아키텍처는 데이터를 클러스터의 DB 인스턴스와 독립적으로 만듭니다. 예를 들어 Aurora가 테이블 데이터의 새 복사본을 만들지 않으므로 DB 인스턴스를 빠르게 추가할 수 있습니다. 대신에 DB 인스턴스는 이미 모든 데이터를 포함하는 공유 볼륨에 연결됩니다. 클러스터에서 기본 데이터를 제거하지 않고 클러스터에서 DB 인스턴스를 제거할 수 있습니다. 전체 클러스터를 삭제하는 경우에만 Aurora가 데이터를 제거합니다.

 

 

3. Aurora 스토리지 크기가 자동으로 조정되는 방법

데이터베이스의 데이터 용량이 늘어날수록 Aurora 클러스터 볼륨도 자동 확장됩니다. Aurora 클러스터 볼륨 크기는 최대 128 tebibytes (TiB)까지 증가할 수 있습니다.

이 자동 스토리지 조정은 고성능의 고도로 분산된 스토리지 하위 시스템을 통해 이루어집니다. 따라서 주요 목표가 안정성과 고가용성인 경우 중요한 엔터프라이즈 데이터에 Aurora를 선택하면 좋습니다.

Aurora 데이터가 제거되면 해당 데이터에 할당된 공간이 복원됩니다. 데이터 제거의 예로는 테이블 삭제 또는 자르기 등이 있습니다. 이렇게 스토리지 사용량이 자동으로 줄어들면 스토리지 요금을 최소화할 수 있습니다.

클러스터 볼륨의 최대 크기 및 데이터 삭제 시 자동 크기 조정과 같은 일부 스토리지 기능은 클러스터의 Aurora 버전에 따라 다릅니다. 

4. Amazon Aurora 안정성

Aurora는 안정성, 내구성 및 내결함성을 고려하여 설계되었습니다. Aurora DB 클러스터는 Aurora 복제본을 추가하여 다른 가용 영역에 배포하는 등의 방법으로 가용성을 높이도록 설계할 수 있습니다. 그 밖에도 Aurora에는 안정적인 데이터베이스 솔루션을 위한 자동 기능이 몇 가지 포함되어 있습니다.

4.1. 스토리지 자동 복구

Aurora은 3개의 가용 영역에 여러 개의 복사본을 보관하고 있기 때문에 디스크 결함으로 인한 데이터 손실 가능성이 최소화됩니다. Aurora은 클러스터 볼륨을 구성하고 있는 디스크 볼륨에서 결함을 자동 감지합니다. 예를 들어 디스크 볼륨 세그먼트에 결함이 발생하면 Aurora가 즉시 해당 세그먼트를 복구합니다. Aurora가 디스크 세그먼트를 복구할 때는 동일한 클러스터 볼륨을 구성하는 나머지 디스크 볼륨의 데이터를 사용하기 때문에 복구 세그먼트의 데이터도 이용 가능합니다. 결과적으로 Aurora는 데이터 손실을 방지할 뿐만 아니라 특정 시점으로 복구 기능을 사용해 디스크 결함을 복구할 필요성도 줄어듭니다.

4.2. 유지 가능한 캐시 워밍

Aurora는 전원이 꺼진 데이터베이스를 가동하거나 결함 발생 이후 다시 시작할 때 버퍼 풀 캐시를 "워밍"합니다. 즉, Aurora가 인 메모리 페이지 캐시에 저장된 기존 공통 쿼리 페이지를 이용해 버퍼 풀을 미리 로드합니다. 이 경우 일반적인 데이터베이스 사용과 달리 버퍼 풀의 "웜 업" 필요성을 우회할 수 있기 때문에 성능이 향상되는 이점이 있습니다.

Aurora 페이지 캐시는 데이터베이스가 아닌 별도의 프로세스로 관리되기 때문에 데이터베이스와 상관없이 유지됩니다. 예상과 달리 데이터베이스에 결함이 발생하더라도 페이지 캐시가 메모리에 남아있기 때문에 데이터베이스를 재시작할 때 버퍼 풀이 가장 최신 상태로 워밍됩니다.

4.3. crush 복구

Aurora은 거의 순간적으로 crush에서 복구하고 바이너리 로그없이 애플리케이션 데이터를 계속 제공하도록 설계되었습니다. Aurora은 병렬 스레드에서 비동기 방식으로 crush 복구를 실행하므로 crush 직후에도 데이터베이스를 열어두고 사용할 수 있습니다.

다음은 Aurora MySQL에서의 바이너리 로깅 및 crush 복구 시 고려 사항입니다.

1. Aurora 바이너리 로깅을 활성화하면 DB 인스턴스로 하여금 강제로 바이너리 로그 복구를 수행하도록 하므로 crush 후 복구 시간에 직접적인 영향을 줍니다.

2. 사용되는 bin 로깅 유형은 로깅의 크기와 효율에 영향을 미칩니다. 데이터베이스 활동의 양이 동일하더라도 형식에 따라 bin 로그에서 더 많은 정보가 로깅됩니다. 다음과 같은 binlog_format 파라미터 설정으로 로그 데이터의 양이 달라집니다.

ROW – 최대 로그 데이터
STATEMENT – 최소 로그 데이터
MIXED – 일반적으로 데이터 무결성과 성능의 최상의 조합을 제공하는 적당량의 로그 데이터

bin 로그 데이터의 양은 복구 시간에 영향을 미칩니다. bin 로그에 로깅된 데이터가 더 많은 경우, DB 인스턴스는 복구 도중 더 많은 데이터를 처리해야 하므로 복구 시간이 길어집니다.

3. Aurora은 DB 클러스터 내에서 데이터를 복제하거나 특정 시점 복원(PITR)을 수행하기 위해 바이너리 로그를 필요로 하지 않습니다.

4. 외부 복제(또는 외부 이진 로그 스트림)에 bin 로그가 필요하지 않은 경우, binlog_format 파라미터를 OFF로 설정하여 이진 로깅을 비활성화하는 것이 좋습니다. 이렇게 하면 복구 시간이 단축됩니다.

 

5. Aurora 스토리지 저장 방식

Aurora는 Shard Storage를 사용하며, MySQL의 binlog 기반의 replication이 아닌 Storage와 page 기반의 replication을 사용합니다.

Aurora 스토리지 내부 아키텍쳐를 이해하기 위해 쿼럼(Quorum)방식을 이해해야 합니다.

Casandra는 세션별로 데이터 저장 , 조회시 몇개의 노드에서 저장, 조회 할지 선택할 수 있습니다. 물론 Global 하게 서버내에서 지정할 수도 있습니다. 일반적으로 노드가 여러개 필요한 NoSQL의 경우 많이 나오는 용어입니다. Aurora는 내부적인 가용성을 확보하기 위해 총 3개의 AZ, 각각의 AZ 별로 2개의 스토리지 영역을 두고 있습니다. 하나의  AZ가 무너져도 다른 AZ에서는 서비스가 가능하고 데이터의 유실이 없게 해줍니다.

Auroroa의 경우 6개의 스토리지 영역이 static하게 설정되어 있기 때문에 write는 4/6, read는 3/6 쿼럼을 사용합니다. 즉 write가 6개 중에 4개의 스토리지에 성공해야 완료이고, read 는 6개중 3개의 스토리지에 성공해야 완료됩니다. Aurora는 내부적으로 스토리지의 latency를 측정하고 있고 응답이 가장 빠르게 오는 스토리지에 write를 시도합니다. 물론 instance와 같은  AZ에 있는 스토리지 영역이 가장 빠르게 응답할 것이고 거기에 데이터가 쌓인 이후 다른  AZ의 스토리지 영역에 데이터가 쌓입니다.

 

Primary Instance(Master)에서 write가 발생하면 Incoming queue라는 것을 이용해서 비동기 방식으로 처리하게 됩니다. 모든 데이터 저장 스탭이 비동기로 이루어 지기 때문에 insert 가 빠르게 느껴지지만 실제로 스토리지가 움직이는 건 비동기이기 때문에 disk에 어디까지 저장했는지는 Aurora 스토리지만 알고 있습니다. 실제로 Incoming queue가 밀리면 ack가 늦을 수도 있고 장애 났을때 복구 되는 시간도 늘어날 수 있습니다. write시 4개의 쓰기가 성공 할때 까지 대기하지 않고 incoming queue에 들어가고 queue 에 쌓이면 바로 ack 하기 때문에 instance에서는 하나의 스토리지에 반영되면 바로 응답을 받기 때문에 신경 안쓰고 완료 처리할 수 있습니다. 즉 4개에 모두 쌓이는 것을 대기 하지 않습니다.

쿼럼은 요청에 대한 응답을 보내기 위한 최소값입니다. 4/6 쿼럼이 충족되면 스토리지는 VCL이라는 값을 가집니다. VCL은 Volume Completed LSN으로 볼륨에 쓰기가 완료 됐다는 의미 입니다. 관련된 용어로는 CPL(Consustency Point LSN)이 존재합니다. CPL은 다른말로 최근에 커밋된 레코드 입니다. 일관성이 보장된 마지막 포인트가 CPL이기 때문에 장애시에는 최종 CPL 이후의 값은 모두 지우고 복구가 일어납니다.

VCL이 일어난 다음에는 스토리지의 background 작업의 일환으로 나머지 2개의 스토리지에도 카피가 일어납니다. 즉 하나의 write에 대한 쿼럼은 6개의 스토리지중 4개지만 저장은 6개 모두 일어납니다.

이처럼 Aurora의 경우 스토리지 내부의 비동기 방식과 쿼럼 방식이 같이 존재하기 때문에 관리가 어렵지만 운영하는 입장에서 보면 내부적으로 무슨 일이 일어나는지 알수 없습니다.

 

'ETC DB' 카테고리의 다른 글

prometheus 개요  (0) 2021.07.21
Amazon Aurora DB와 mysql 차이점  (0) 2021.07.21
Amazon Aurora 특징  (0) 2021.07.21
Amazon Aurora 정의  (0) 2021.07.21
Amazon Aurora 정리 (요약)  (0) 2021.07.21