1. 랩 모드 사용

Aurora 랩 모드는 현재 Aurora 데이터베이스 버전에서 사용 가능한 Aurora 기능을 활성화하는 데 사용되지만 기본적으로 비활성화되어 있습니다. 프로덕션 DB 클러스터에서 Aurora 랩 모드 기능을 사용하지 않는 것이 좋지만 개발 및 테스트 환경에서 Aurora 랩 모드를 사용하여 DB 클러스터에 대해 이러한 기능을 활성화할 수 있습니다.

aurora_lab_mode 파라미터는 기본 파라미터 그룹에 속하는 인스턴스 수준 파라미터입니다. 기본 파라미터 그룹에서는 이 파라미터가 0(비활성)으로 설정됩니다. Aurora 랩 모드를 활성화하려면 사용자 지정 파라미터 그룹을 생성하고 사용자 지정 파라미터 그룹에서 aurora_lab_mode 파라미터를 1(활성)로 설정한 후, 사용자 지정 파라미터 그룹을 사용하도록 Aurora 클러스터에서 하나 이상의 DB 클러스터를 수정합니다. 그런 다음, 랩 모드 기능을 시도하기 위해 해당되는 인스턴스 엔드포인트에 연결합니다.

 

1.1. Aurora 랩 모드 기능

배치화 스캔 :
Aurora MySQL 스캔 배치화는 인 메모리 스캔 지향 쿼리의 속도를 크게 높입니다. 이 기능은 일괄 처리로 테이블 전체 스캔, 인덱스 전체 스캔 및 인덱스 범위 스캔의 성능을 향샹시킵니다.

해시 조인 :
이 기능은 동등 조인을 사용하여 많은 양의 데이터를 조인해야 하는 경우 쿼리 성능을 향상시킬 수 있습니다. Aurora MySQL 버전 1에는 랩 모드가 필요합니다. Aurora MySQL 버전 2에는 랩 모드 없이 이 기능을 사용할 수 있습니다.

빠른 DDL :
이 기능을 사용하면 ALTER TABLE tbl_name ADD COLUMN col_name column_definition 작업을 거의 동시에 실행할 수 있습니다. 이 작업은 테이블을 복사하거나 다른 DML 명령문에 영향을 거의 주지 않고 완료됩니다. 테이블 복사를 위해 임시 스토리지를 사용하지 않으므로 라지 테이블에 대해서도 DDL 문을 쉽게 만듭니다. 현재 빠른 DDL은 테이블 끝에서 기본값 없이 null이 허용된 열에 대해서만 지원됩니다.

 

2. 비동기식 키 미리 가져오기

Amazon Aurora은 Async Key Prefetch(AKP)를 사용하여 여러 인덱스 사이에 테이블을 조인하는 쿼리 성능을 높일 수 있습니다. 이 기능은 JOIN 쿼리에서 Batched Key Access(BKA) 조인 알고리즘과 Multi-Range Read(MRR) 최적화 기능을 사용해야 하는 쿼리를 실행하면서 필요한 행을 예측하여 성능을 높이는 효과가 있습니다.

쿼리가 AKP 기능을 이용하기 위해서는 BKA와 MRR이 모두 필요합니다. 일반적으로 JOIN 절이 보조 인덱스를 사용하지만 기본 인덱스의 열도 일부 필요할 때 이러한 쿼리가 발생합니다. 예를 들어 JOIN 절이 작은 용량의 외부 테이블과 큰 용량의 내부 테이블 사이에서 인덱스 값을 기준으로 한 등가 조인을 나타내고, 테이블 용량이 커질수록 인덱스 선택의 폭이 매우 제한적일 때 AKP를 사용할 수 있습니다. AKP는 JOIN 절을 평가하는 동안 BKA 및 MRR과 함께 보조-기본 인덱스 조회를 실행합니다. 동시에 쿼리를 실행하는 데 필요한 행까지 식별합니다. 그런 다음 쿼리를 실행하기에 앞서 백그라운드 스레드를 사용하여 식별된 행이 포함된 페이지를 메모리에 비동기식으로 로드합니다.

 

EXPLAIN 문 출력에서 Extra 열은 실행 계획에 추가되는 정보에 대한 설명입니다. AKP 기능이 쿼리에 사용할 테이블에 적용되는 경우 이 열에 다음 값 중 하나가 포함됩니다.

 

  • Using Key Prefetching
  • Using join buffer (Batched Key Access with Key Prefetching)

 

다음은 EXPLAIN 문에 EXTENDED 키워드를 사용하여 AKP를 이용할 수 있는 쿼리의 실행 계획을 확인하는 예제입니다.

mysql> explain extended select sql_no_cache
    ->     ps_partkey,
    ->     sum(ps_supplycost * ps_availqty) as value
    -> from
    ->     partsupp,
    ->     supplier,
    ->     nation
    -> where
    ->     ps_suppkey = s_suppkey
    ->     and s_nationkey = n_nationkey
    ->     and n_name = 'ETHIOPIA'
    -> group by
    ->     ps_partkey having
    ->         sum(ps_supplycost * ps_availqty) > (
    ->             select
    ->                 sum(ps_supplycost * ps_availqty) * 0.0000003333
    ->             from
    ->                 partsupp,
    ->                 supplier,
    ->                 nation
    ->             where
    ->                 ps_suppkey = s_suppkey
    ->                 and s_nationkey = n_nationkey
    ->                 and n_name = 'ETHIOPIA'
    ->         )
    -> order by
    ->     value desc;
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
| id | select_type | table    | type | possible_keys         | key           | key_len | ref                              | rows | filtered | Extra                                                       |
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
|  1 | PRIMARY     | nation   | ALL  | PRIMARY               | NULL          | NULL    | NULL                             |   25 |   100.00 | Using where; Using temporary; Using filesort                |
|  1 | PRIMARY     | supplier | ref  | PRIMARY,i_s_nationkey | i_s_nationkey | 5       | dbt3_scale_10.nation.n_nationkey | 2057 |   100.00 | Using index                                                 |
|  1 | PRIMARY     | partsupp | ref  | i_ps_suppkey          | i_ps_suppkey  | 4       | dbt3_scale_10.supplier.s_suppkey |   42 |   100.00 | Using join buffer (Batched Key Access with Key Prefetching) |
|  2 | SUBQUERY    | nation   | ALL  | PRIMARY               | NULL          | NULL    | NULL                             |   25 |   100.00 | Using where                                                 |
|  2 | SUBQUERY    | supplier | ref  | PRIMARY,i_s_nationkey | i_s_nationkey | 5       | dbt3_scale_10.nation.n_nationkey | 2057 |   100.00 | Using index                                                 |
|  2 | SUBQUERY    | partsupp | ref  | i_ps_suppkey          | i_ps_suppkey  | 4       | dbt3_scale_10.supplier.s_suppkey |   42 |   100.00 | Using join buffer (Batched Key Access with Key Prefetching) |
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
6 rows in set, 1 warning (0.00 sec)

3. 해시 조인 작업

동등 조인을 사용하여 많은 양의 데이터를 조인해야 하는 경우 해시 조인을 통해 쿼리 성능을 향상시킬 수 있습니다. Aurora MySQL의 해시 조인을 활성화할 수 있습니다.

해시 조인 열은 복잡한 표현식이 될 수 있습니다. 해시 조인 열에서 다음과 같은 방식으로 데이터 유형을 비교할 수 있습니다.

  • int, bigint, numeric 및 bit 등과 같은 정확한 숫자 데이터 형식 범주의 모든 항목을 비교할 수 있습니다.
  • float 및 double과 같은 대략적인 숫자 데이터 형식 범주의 모든 항목을 비교할 수 있습니다.
  • 문자열 유형에 동일한 문자 세트와 콜레이션이 있는 경우 문자열 유형간에 항목을 비교할 수 있습니다.
  • 유형이 동일한 경우 날짜 및 타임스탬프 데이터 형식으로 항목을 비교할 수 있습니다.

 

Aurora MySQL의 해시 조인에는 다음의 제한 사항이 적용됩니다.

  • left/right outer 조인은 지원되지 않습니다.
  • 하위 쿼리가 구체화되지 않는 한 하위 쿼리와 같은 Semijoin은 지원되지 않습니다.
  • 다중 테이블의 업데이트 또는 삭제는 지원되지 않습니다.
  • BLOB 및 공간 데이터 타입 열은 해시 조인의 조인 할 수 없습니다.

 

해시 조인이 쿼리에 사용할 테이블에 적용되는 경우 이 열에 다음과 비슷한 값이 포함됩니다.

  • Using where; Using join buffer (Hash Join Outer table table1_name)
  • Using where; Using join buffer (Hash Join Inner table table2_name)

 

다음은 EXPLAIN을 사용하여 해시 조인 쿼리의 실행 계획을 확인하는 예제입니다.

mysql> explain SELECT sql_no_cache * FROM hj_small, hj_big, hj_big2
    ->     WHERE hj_small.col1 = hj_big.col1 and hj_big.col1=hj_big2.col1 ORDER BY 1;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra                                                          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
|  1 | SIMPLE      | hj_small | ALL  | NULL          | NULL | NULL    | NULL |    6 | Using temporary; Using filesort                                |
|  1 | SIMPLE      | hj_big   | ALL  | NULL          | NULL | NULL    | NULL |   10 | Using where; Using join buffer (Hash Join Outer table hj_big)  |
|  1 | SIMPLE      | hj_big2  | ALL  | NULL          | NULL | NULL    | NULL |   15 | Using where; Using join buffer (Hash Join Inner table hj_big2) |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
3 rows in set (0.04 sec)

출력에서 Hash Join Inner table은 해시 테이블을 작성하는 데 사용하는 테이블이며 Hash Join Outer table은 해시 테이블을 프로브하는 데 사용하는 테이블입니다.

 

4. Aurora MySQL 힌트

Aurora MySQL 쿼리와 함께 SQL 힌트를 사용하여 성능을 미세 조정할 수 있습니다. 또한 힌트를 사용하여 예기치 않은 조건에 따라 중요한 쿼리에 대한 실행 계획이 변경되는 것을 방지할 수 있습니다.

 

4.1. HASH_JOIN, NO_HASH_JOIN

쿼리에 해시 조인 최적화 방법을 사용할지 여부를 선택할 수 있는 최적화 프로그램의 기능을 설정하거나 해제합니다. HASH_JOIN을 사용하면 해당 메커니즘이 더 효율적인 경우 최적화 프로그램이 해시 조인을 사용할 수 있습니다. NO_HASH_JOIN은 최적화 프로그램이 쿼리에 해시 조인을 사용하지 못하게 합니다.

다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다.

EXPLAIN SELECT/*+ HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;


EXPLAIN SELECT /*+ NO_HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

 

4.2. HASH_JOIN_PROBING, NO_HASH_JOIN_PROBING

해시 조인 쿼리에서 조인의 프로브 측에 지정된 테이블을 사용할지 여부를 지정합니다. 쿼리는 프로브 테이블의 전체 내용을 읽는 대신 빌드 테이블의 열 값이 프로브 테이블에 있는지 여부를 테스트합니다. HASH_JOIN_PROBING 및 HASH_JOIN_BUILDING을 사용하여 쿼리 텍스트 내에서 테이블을 재정렬하지 않고 해시 조인 쿼리가 처리되는 방법을 지정할 수 있습니다.

다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다. T2 테이블에 HASH_JOIN_PROBING 힌트를 지정하면 T1 테이블에 NO_HASH_JOIN_PROBING을 지정하는 것과 같은 효과가 있습니다.

EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_PROBING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;


EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_PROBING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

 

4.3. HASH_JOIN_BUILDING, NO_HASH_JOIN_BUILDING

해시 조인 쿼리에서 조인의 빌드 측에 지정된 테이블을 사용할지 여부를 지정합니다. 쿼리는 이 테이블의 모든 행을 처리하여 다른 테이블과 상호 참조할 열 값 목록을 작성합니다. HASH_JOIN_PROBING 및 HASH_JOIN_BUILDING을 사용하여 쿼리 텍스트 내에서 테이블을 재정렬하지 않고 해시 조인 쿼리가 처리되는 방법을 지정할 수 있습니다.

다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다. T2 테이블에 HASH_JOIN_BUILDING 힌트를 지정하면 T1 테이블에 NO_HASH_JOIN_BUILDING을 지정하는 것과 같은 효과가 있습니다.

EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_BUILDING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;


EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_BUILDING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

 

4.4. JOIN_FIXED_ORDER

쿼리의 테이블이 쿼리에 나열된 순서에 따라 조인되도록 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 특히 유용합니다. 이는 MySQL STRAIGHT_JOIN 힌트를 대체하기 위한 것입니다. MySQL JOIN_FIXED_ORDER 힌트에 해당합니다.

다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다.

EXPLAIN SELECT /*+ JOIN_FIXED_ORDER */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);

 

4.5. JOIN_ORDER

쿼리의 테이블에 대한 조인 순서를 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 특히 유용합니다.

다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다.

EXPLAIN SELECT /*+ JOIN_ORDER (t4, t2, t1, t3) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);

 

4.6. JOIN_PREFIX

조인 순서에서 먼저 넣을 테이블을 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 특히 유용합니다.

다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다.

EXPLAIN SELECT /*+ JOIN_ORDER (t4, t2) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);

 

4.7. JOIN_SUFFIX

조인 순서에 마지막으로 넣을 테이블을 지정합니다. 이는 세 개 이상의 테이블을 포함하는 쿼리에 특히 유용합니다.

다음 예제에서는 이 힌트를 사용하는 방법을 보여 줍니다.

EXPLAIN SELECT /*+ JOIN_ORDER (t1, t3) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);

'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

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

1. Aurora 란?

Amazon Aurora(Aurora)는 MySQL 및 PostgreSQL과 호환되는 완전 관리형 관계형 데이터베이스 엔진입니다. 기존 MySQL 및 PostgreSQL 데이터베이스에 사용되는 코드, 도구 및 애플리케이션 모두 Aurora에서도 사용할 수 있습니다. 일부 워크로드의 경우 Aurora은 기존 애플리케이션을 거의 변경하지 않고도 MySQL의 처리량을 최대 5배, PostgreSQL의 처리량을 최대 3배 제공할 수 있습니다.

Aurora에는 고성능 스토리지 하위시스템이 포함됩니다. MySQL 및 PostgreSQL과 호환되는 데이터베이스 엔진은 빠른 분산형 스토리지를 활용하도록 사용자 지정됩니다. 기본 스토리지는 필요에 따라 자동으로 커집니다. Aurora 클러스터는 최대 128 tebibytes (TiB) 크기까지 늘릴 수 있습니다. Aurora는 또한 데이터베이스 구성 및 관리의 가장 어려운 측면 중 하나인 데이터베이스 클러스터링 및 복제를 자동화하고 표준화합니다.

Aurora은 관리형 데이터베이스 서비스 Amazon Relational Database Service(Amazon RDS)의 일부입니다. Amazon RDS는 클라우드에서 관계형 데이터베이스를 보다 쉽게 설정, 작동 및 확장할 수 있게 해주는 웹 서비스입니다.

Aurora는 관리 및 운영을 위해 익숙한 Amazon Relational Database Service(Amazon RDS) 기능을 활용합니다. Aurora는 Amazon RDS AWS Management 콘솔 인터페이스, AWS CLI 명령 및 API 작업을 사용하여 프로비저닝, 패치, 백업, 복구, 장애 감지 및 수리와 같은 일상적인 데이터베이스 작업을 처리합니다.

Aurora 관리 작업에는 일반적으로 개별 데이터베이스 인스턴스 대신 복제를 통해 동기화되는 전체 데이터베이스 서버 클러스터가 포함됩니다. 자동 클러스터링, 복제 및 스토리지 할당을 통해 최대 MySQL 및 PostgreSQL 배포판에 대한 설정, 작동 및 확장 작업이 간편하고 비용 효율적입니다.

스냅 샷을 생성 및 복원하거나 단방향 복제를 설정하여 MySQL용 Amazon RDS 및 PostgreSQL용 Amazon RDS의 데이터를 Aurora로에서 데이터를 가져올 수 있습니다. 기존 MySQL 애플리케이션용 Amazon RDS와 PostgreSQL 애플리케이션용 Amazon RDS를 Aurora로 전환할 수 있는 푸시 버튼식 마이그레이션 도구를 사용할 수 있습니다. 

 

2. Aurora DB 클러스터

Amazon Aurora DB cluster는 하나 이상의 DB 인스턴스와 이 DB 인스턴스의 데이터를 관리하는 클러스터 볼륨으로 구성됩니다. Aurora 클러스터 볼륨은 다중 가용 영역을 아우르는 가상 데이터베이스 스토리지 볼륨으로서, 각 가용 영역에는 DB 클러스터 데이터의 사본이 있습니다. Aurora DB 클러스터는 다음과 같이 두 가지 유형의 DB 인스턴스로 구성됩니다.

기본 DB 인스턴스 – 읽기 및 쓰기 작업을 지원하고, 클러스터 볼륨의 모든 데이터 수정을 실행합니다. Aurora DB 클러스터마다 기본 DB 인스턴스가 하나씩 있습니다.

Aurora 복제본 – 기본 DB 인스턴스와 동일한 스토리지 볼륨에 연결되며 읽기 작업만 지원합니다. 각 Aurora DB 클러스터는 기본 DB 인스턴스에 더해 최대 15개까지 Aurora 복제본을 구성할 수 있습니다. Aurora 복제본을 별도의 가용 영역에 배포하여 고가용성을 유지할 수 있습니다. 기본 DB 인스턴스를 사용할 수 없는 상태가 되면 Aurora은 Aurora 복제본으로 자동 장애 조치합니다. Aurora 복제본에 대해 장애 조치 우선 순위를 지정할 수 있습니다. 또한 Aurora 복제본은 기본 DB 인스턴스에서 읽기 워크로드를 오프로드할 수 있습니다.

Aurora 멀티 마스터 클러스터의 경우 모든 DB 인스턴스에 읽기/쓰기 기능이 있습니다. 

다음은 클러스터 볼륨과 Aurora DB 클러스터에 속하는 기본 DB 인스턴스 및 Aurora 복제본 사이의 관계를 나타낸 그림입니다. 

Aurora 클러스터를 보면 컴퓨팅 용량과 스토리지가 분리되어 있습니다. 예를 들어 DB 인스턴스가 1개뿐인 Aurora 구성은 계속해서 클러스터입니다. 기본 스토리지 볼륨에는 여러 가용 영역(AZ)으로 분산된 다수의 스토리지 노드가 포함되어 있기 때문입니다.

 

3. 리전 및 가용 영역

Amazon 클라우드 컴퓨팅 리소스는 세계 각지의 여러 곳에서 호스팅됩니다. 이 위치들은 AWS 리전과 가용 영역으로 구성됩니다. 각 AWS 리전은 개별 지리 영역입니다. 각 AWS 리전은 가용 영역이라고 알려진 격리된 위치를 여러 개 가지고 있습니다.

Amazon은 최신 기술을 탑재한 고가용성 데이터 센터를 운영하고 있습니다. 드물기는 하지만 동일한 위치에 있는 인스턴스의 가용성에 영향을 미치는 장애가 발생할 수도 있습니다. 그러한 장애의 영향을 받는 단일한 위치에서 모든 인스턴스를 호스팅하는 경우에는 모든 인스턴스가 사용이 불가능해질 수 있습니다.

각 AWS 리전이 서로 완전히 독립적이라는 점에 유의하십시오. 사용자의 모든 Amazon RDS 활동(데이터베이스 인스턴스 또는 사용할 수 있는 데이터베이스 인스턴스 목록 생성 등)은 현재 기본 AWS 리전에서만 실행됩니다. 기본 AWS 리전은 EC2_REGION 환경 변수를 설정하여 콘솔에서 변경하거나 AWS Command Line Interface(AWS CLI)에서 --region 파라미터를 사용해 재정의할 수 있습니다.

Amazon RDS는 미국 정부 기관 및 고객이 더욱 민감한 워크로드를 클라우드로 이전할 수 있도록 설계된 AWS GovCloud (US-West)라는 특별한 AWS 리전을 지원합니다. AWS GovCloud (US-West)은 미국의 특정 규제 및 규정 준수 요건을 처리합니다.

특정 AWS 리전에서 Amazon RDS DB 인스턴스를 생성하거나 사용하려면 해당 리전 서비스 엔드포인트를 사용하십시오.
Aurora는 로컬 영역을 지원하지 않습니다.

 

3.1. AWS 리전

각 AWS 리전은 다른 AWS 리전에서 완전히 격리되도록 설계되었습니다. 이를 통해 가장 강력한 내결함성 및 안정성을 달성할 수 있습니다.

리소스를 볼 때 지정한 AWS 리전에 연결된 리소스만 표시됩니다. AWS 리전이 서로 격리되어 있고 여러 AWS 리전에 리소스가 자동으로 복제되지 않기 때문입니다.

 

3.2. 가용 영역

DB 인스턴스를 생성할 때 가용 영역을 선택하거나 AWS에서 자동으로 가용 영역을 선택하도록 설정할 수 있습니다. 가용 영역은 AWS 리전 코드와 식별 문자의 조합으로 표시됩니다(예: us-east-1a).

 

3.3. 리전 가용성

명령줄 인터페이스 또는 API 작업을 사용하여 Aurora DB 클러스터로 작업하는 경우 리전 엔드포인트를 지정해야 합니다.

다음 표에는 Aurora MySQL을 현재 이용할 수 있는 AWS 리전 및 각 리전의 엔드포인트가 나와 있습니다.

리전 이름리전EndpointProtocol

미국 동부(오하이오) us-east-2 rds.us-east-2.amazonaws.com HTTPS
미국 동부(버지니아 북부) us-east-1 rds.us-east-1.amazonaws.com HTTPS
미국 서부(캘리포니아 북부) us-west-1 rds.us-west-1.amazonaws.com HTTPS
미국 서부(오레곤) us-west-2 rds.us-west-2.amazonaws.com HTTPS
아프리카(케이프타운) af-south-1 rds.af-south-1.amazonaws.com HTTPS
아시아 태평양(홍콩) ap-east-1 rds.ap-east-1.amazonaws.com HTTPS
아시아 태평양(뭄바이) ap-south-1 rds.ap-south-1.amazonaws.com HTTPS
아시아 태평양(서울) ap-northeast-2 rds.ap-northeast-2.amazonaws.com HTTPS
아시아 태평양(싱가포르) ap-southeast-1 rds.ap-southeast-1.amazonaws.com HTTPS
아시아 태평양(시드니) ap-southeast-2 rds.ap-southeast-2.amazonaws.com HTTPS
아시아 태평양(도쿄) ap-northeast-1 rds.ap-northeast-1.amazonaws.com HTTPS
캐나다(중부) ca-central-1 rds.ca-central-1.amazonaws.com HTTPS
중국(베이징) cn-north-1 rds.cn-north-1.amazonaws.com.cn HTTPS
중국(닝샤) cn-northwest-1 rds.cn-northwest-1.amazonaws.com.cn HTTPS
유럽(프랑크푸르트) eu-central-1 rds.eu-central-1.amazonaws.com HTTPS
유럽(아일랜드) eu-west-1 rds.eu-west-1.amazonaws.com HTTPS
유럽(런던) eu-west-2 rds.eu-west-2.amazonaws.com HTTPS
유럽(밀라노) eu-south-1 rds.eu-south-1.amazonaws.com HTTPS
유럽(파리) eu-west-3 rds.eu-west-3.amazonaws.com HTTPS
유럽(스톡홀름) eu-north-1 rds.eu-north-1.amazonaws.com HTTPS
중동(바레인) me-south-1 rds.me-south-1.amazonaws.com HTTPS
남아메리카(상파울루) sa-east-1 rds.sa-east-1.amazonaws.com HTTPS
AWS GovCloud (미국 동부) us-gov-east-1 rds.us-gov-east-1.amazonaws.com HTTPS
AWS GovCloud (US) us-gov-west-1 rds.us-gov-west-1.amazonaws.com HTTPS

 

3.4. Amazon Aurora DB 클러스터의 현지 시간대

기본적으로 Amazon Aurora DB 클러스터의 시간대는 협정 세계시(UTC)입니다. 대신 DB 클러스터의 인스턴스 시간대를 애플리케이션의 현지 시간대로 설정할 수 있습니다.

DB 클러스터의 현지 시간대를 설정하려면 DB 클러스터의 클러스터 파라미터 그룹에서 time_zone 파라미터를 지원되는 값 중 하나로 설정합니다. DB 클러스터에 대한 time_zone 파라미터를 설정하면 DB 클러스터의 모든 인스턴스가 새로운 현지 시간대를 사용하도록 변경됩니다. 다른 DB 클러스터가 동일한 클러스터 파라미터 그룹을 사용하면 해당 DB 클러스터의 모든 인스턴스도 새로운 현지 시간대를 사용하도록 변경됩니다.

현지 시간대를 설정하면 데이터베이스에 대한 모든 새 연결에 변경 사항이 반영됩니다. 현지 시간대를 변경할 때 데이터베이스에 대해 열린 연결이 있는 경우 연결을 닫고 새 연결을 열어야 현지 시간대 업데이트가 표시됩니다.

AWS 리전 간 복제를 사용 중인 경우 복제 마스터 DB 클러스터와 복제본이 서로 다른 파라미터 그룹을 사용합니다. 파라미터 그룹은 AWS 리전에 고유합니다. 각 인스턴스에 대해 동일한 현지 시간대를 사용하려면 복제본 마스터와 복제본 모두의 파라미터 그룹에서 time_zone 파라미터를 설정해야 합니다.

DB 클러스터 스냅샷에서 DB 클러스터를 복원할 경우 현지 시간대가 UTC로 설정됩니다. 복원이 완료된 후 시간대를 현지 시간대로 업데이트할 수 있습니다. DB 클러스터를 특정 시점으로 복원할 경우 복원된 DB 클러스터의 현지 시간대는 복원된 DB 클러스터의 파라미터 그룹에서 설정한 시간대입니다.

 

'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

Aurora 란?

  • Amazon Aurora(이하 Aurora)는 MySQL 및 PostgreSQL과 호환되는 완전 관리형 관계형 데이터베이스 엔진
  • 기존 애플리케이션을 거의 변경하지 않고도 MySQL의 처리량을 최대 5배, PostgreSQL의 처리량을 최대 3배 제공
  • Aurora는 관리형 데이터베이스 서비스 Amazon Relational Database Service(Amazon RDS)의 일부

 

Aurora DB 클러스터

Aurora DB cluster는 하나 이상의 DB 인스턴스와 데이터를 관리하는 클러스터 볼륨으로 구성


 DB 인스턴스 2가지 유형

  • 기본 DB 인스턴스 
    • 읽기 및 쓰기 작업을 지원하고, 클러스터 볼륨의 모든 데이터 수정을 실행
    • Aurora DB 클러스터마다 기본 DB 인스턴스가 하나씩 존재
  • Aurora 복제본 
    • 기본 DB 인스턴스와 동일한 스토리지 볼륨에 연결되며 읽기 작업만 지원 
    • 최대 15개까지 Aurora 복제본을 구성

 

리전 및 가용 영역

Aurora는 세계 각지의 여러 곳에서 호스팅되고, 위치들은 AWS 리전과 가용 영역으로 구성
AWS 리전은 개별 지리 영역
각 AWS 리전은 가용 영역이라고 알려진 격리된 위치를 여러 개 가지고 있음 
가용 영역은 AWS 리전 코드와 식별 문자의 조합으로 표시 (예: us-east-1a)

 

Aurora 만의 특징

랩 모드 사용

  • 기본적으로 비활성화
  • 사용자 지정 파라미터 그룹에서 aurora_lab_mode 파라미터를 1(활성)로 설정

랩모드 기능

배치화 스캔 in memory 쿼리의 속도를 크게 높임
full table scan, index full scan 및 index range scan 성능을 향샹
hash join 동등 조인을 사용하여 많은 양의 데이터를 조인해야 하는 경우 쿼리 성능을 향상
빠른 DDL ALTER TABLE tbl_name ADD COLUMN col_name column_definition 작업을 거의 동시에 실행
테이블 끝에서 기본값 없이 null이 허용된 열에 대해서만 지원

 

Async Key Prefetch(비동기식 키 미리 가져오기)

  • Async Key Prefetch(AKP)를 사용하여 여러 인덱스 사이에 테이블을 조인하는 쿼리 성능 향상
  • JOIN 쿼리에서 Batched Key Access(BKA) 조인 알고리즘과 Multi-Range Read(MRR) 최적화 기능을 사용하여 필요한 행을 예측
  • AKP 기능이 테이블에 적용되는 경우 plan extra 열에 다음 값 중 하나가 포함
    • Using Key Prefetching
    • Using join buffer (Batched Key Access with Key Prefetching)

AKP 사용 예제

mysql> explain extended select sql_no_cache
    ->     ps_partkey,
    ->     sum(ps_supplycost * ps_availqty) as value
    -> from
    ->     partsupp,
    ->     supplier,
    ->     nation
    -> where
    ->     ps_suppkey = s_suppkey
    ->     and s_nationkey = n_nationkey
    ->     and n_name = 'ETHIOPIA'
    -> group by
    ->     ps_partkey having
    ->         sum(ps_supplycost * ps_availqty) > (
    ->             select
    ->                 sum(ps_supplycost * ps_availqty) * 0.0000003333
    ->             from
    ->                 partsupp,
    ->                 supplier,
    ->                 nation
    ->             where
    ->                 ps_suppkey = s_suppkey
    ->                 and s_nationkey = n_nationkey
    ->                 and n_name = 'ETHIOPIA'
    ->         )
    -> order by
    ->     value desc;
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
| id | select_type | table    | type | possible_keys         | key           | key_len | ref                              | rows | filtered | Extra                                                       |
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
|  1 | PRIMARY     | nation   | ALL  | PRIMARY               | NULL          | NULL    | NULL                             |   25 |   100.00 | Using where; Using temporary; Using filesort                |
|  1 | PRIMARY     | supplier | ref  | PRIMARY,i_s_nationkey | i_s_nationkey | 5       | dbt3_scale_10.nation.n_nationkey | 2057 |   100.00 | Using index                                                 |
|  1 | PRIMARY     | partsupp | ref  | i_ps_suppkey          | i_ps_suppkey  | 4       | dbt3_scale_10.supplier.s_suppkey |   42 |   100.00 | Using join buffer (Batched Key Access with Key Prefetching) |
|  2 | SUBQUERY    | nation   | ALL  | PRIMARY               | NULL          | NULL    | NULL                             |   25 |   100.00 | Using where                                                 |
|  2 | SUBQUERY    | supplier | ref  | PRIMARY,i_s_nationkey | i_s_nationkey | 5       | dbt3_scale_10.nation.n_nationkey | 2057 |   100.00 | Using index                                                 |
|  2 | SUBQUERY    | partsupp | ref  | i_ps_suppkey          | i_ps_suppkey  | 4       | dbt3_scale_10.supplier.s_suppkey |   42 |   100.00 | Using join buffer (Batched Key Access with Key Prefetching) |
+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+
6 rows in set, 1 warning (0.00 sec)

 

Hash Join

동등 조인을 사용하여 많은 양의 데이터를 조인해야 하는 경우 쿼리 성능을 향상

Aurora MySQL의 hash join 제한 사항

  • left/right outer 조인은 지원하지 않음
  • Semijoin은 지원 안함
  • 다중 테이블의 업데이트 또는 삭제는 지원 안됨
  • BLOB 및 공간 데이터 타입 열은 해시 조인 할 수 없음

해시 조인이 테이블에 적용되는 경우 plan extra 열에 다음 값이 포함

  • Using where; Using join buffer (Hash Join Outer table table1_name)
  • Using where; Using join buffer (Hash Join Inner table table2_name)

hash join 쿼리 예제

mysql> explain SELECT sql_no_cache * FROM hj_small, hj_big, hj_big2
    ->     WHERE hj_small.col1 = hj_big.col1 and hj_big.col1=hj_big2.col1 ORDER BY 1;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra                                                          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
|  1 | SIMPLE      | hj_small | ALL  | NULL          | NULL | NULL    | NULL |    6 | Using temporary; Using filesort                                |
|  1 | SIMPLE      | hj_big   | ALL  | NULL          | NULL | NULL    | NULL |   10 | Using where; Using join buffer (Hash Join Outer table hj_big)  |
|  1 | SIMPLE      | hj_big2  | ALL  | NULL          | NULL | NULL    | NULL |   15 | Using where; Using join buffer (Hash Join Inner table hj_big2) |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+
3 rows in set (0.04 sec)

 

Aurora MySQL 힌트

HASH_JOIN, NO_HASH_JOIN 쿼리에 해시 조인 최적화 방법을 사용할지 여부를 선택
HASH_JOIN_PROBING, NO_HASH_JOIN_PROBING 해시 조인 쿼리에서 조인의 프로브 측에 지정된 테이블을 사용할지 여부를 지정
HASH_JOIN_BUILDING, NO_HASH_JOIN_BUILDING 해시 조인 쿼리에서 조인의 빌드 측에 지정된 테이블을 사용할지 여부를 지정
JOIN_FIXED_ORDER 쿼리의 테이블이 나열된 순서에 따라 조인되도록 지정
MySQL STRAIGHT_JOIN 힌트를 대체
JOIN_ORDER 쿼리의 테이블에 대한 조인 순서를 지정
JOIN_PREFIX 조인 순서에서 먼저 넣을 테이블을 지정
JOIN_SUFFIX 조인 순서에 마지막으로 넣을 테이블을 지정

 

 Aurora 스토리지

aurora 스토리지는 개념적으로 Amazon Aurora 스토리지 엔진은 한 리전(Region)의 여러 AWS 가용 영역(Availability Zone)에 걸친 분산된 SAN

  1. Amazon Aurora는 보호 그룹(protection groups) 이라고 하는 10GB 논리 블록에 스토리지 볼륨을 구축
  2. 각 보호 그룹의 데이터는 6개의 스토리지 노드에 복제
  3. 스토리지 노드는 Amazon Aurora 클러스터가 운영되는 리전의 3개 AZ에 할당
  4. 데이터 양이 증가하여 현재 할당된 스토리지를 넘어서면 Aurora는 요건을 충족시키기 위해 볼륨을 자연스럽게 확장하고 필요에 따라 새로운 보호 그룹을 추가

 

Aurora 쓰기 처리 방법

Primary Instance(Master)에서 write가 발생하면 데이터를 쓰면 6개의 스토리지 노드로 병렬로 전송

  1. 각 스토리지 노드에서 로그 레코드를 수신하고 Incoming queue에 추가하고 지속적으로 레코드를 유지
  2. 데이터베이스에 대한 ACK
  3. 레코드를 정리하고 로그의 gap 확인
  4. 보관할 레코드는 핫 로그(hot log)에서 디스크에 저장하고 하나 이상의 로그 시퀀스 번호(LSN)가 누락 된 것으로 판단되면 스토리지 노드는 볼륨의 다른 노드에서 누락 된 LSN을 검색
  5. 로그 레코드를 병합하여 데이터 페이지로 만듦
  6. S3에 주기적으로 로그 및 새 페이지 버전 전송
  7. 데이터 페이지가 갱신 된 후 로그 레코드가 백업되고 이전 버전에 대한 가비지 컬렉션 진행
  8. 데이터 블록의 CRC 코드를 주기적으로 검증

 

Aurora replica

Aurora는 MySQL의 binlog 기반의 replication이 아닌 Storage와 page 기반의 replication을 사용


RDS MySQL replica는 Primary Instance(Master)에서 write가 발생하면

  1. 데이터를 EBS로 데이터를 저장
  2. 쌓은 데이터를 EBS로 미러링
  3. replication을 통해 replica로 데이터를 보냄
  4. replica는 받은 데이터를 자신의 EBS로 저장
  5. 쌓은 데이터를 EBS로 미러링

데이터베이스는 결국 트랜잭션의 결과물이 input/output 형태로 수행되는 것이기에 before & after 작업들이 WAL(Write-Ahead-Log)를 통해 스토리지에 저장

단점은 I/O 대역폭과 IOPS가 제한적이고, 변경이 필요할 경우 사용자가 직접 튜닝 필요

 


Aurora MySQL replica는 Primary Instance(Master)에서 write가 발생하면 4/6 쿼럼을 사용해서 스토리지에 저장하며, frm 및 redo log를 replica로 전송

  • Auroroa의 경우 6개의 스토리지 영역이 static하게 설정되어 있기 때문에 write는 4/6, read는 3/6 쿼럼을 사용
    (write가 6개 중에 4개의 스토리지에 성공해야 완료이고, read 는 6개중 3개의 스토리지에 성공해야 완료)
  • Aurora는 내부적으로 스토리지의 latency를 측정하고 있고 응답이 가장 빠르게 오는 스토리지에 write를 시도

 

 

MySQL의 경우 read replica도 binlog를 받아서 처리하기 때문에 read 뿐만아니라 write도 같이 처리

aurora MySQL의 경우 read replica가 binlog를 읽어서 싱크를 맞추는 것이 아니라 redo log를 받아서 동기화 하기 때문에 read만 처리

 

MySQL과 Aurora MySQL 차이


MySQLAurora MySQL스토리지 관리 주체read replica 구성

자체 storage Cloud Shared Storage
디비 관리자 AWS
binlog를 사용 내부 storage 및 redo log 전송을 통해 빠른 동기화가 가능하며 bandwidth 줄어듬

 

'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

+ Recent posts