Amazon Web Services 한국 블로그

Amazon Aurora 글로벌 데이터베이스 쓰기 전달을 사용하여 전 세계 분산 MySQL 애플리케이션 구축하기

AWS는 2018 년에 Amazon Aurora 글로벌 데이터베이스를 출시했습니다. Aurora 글로벌 데이터베이스는 두 가지 기본 사용 사례를 지원합니다. 첫 번째 사용 사례는 낮은 RPO (복구 지점 목표) 및 RTO (복구 시간 목표)를 사용하여 전체 리전(Region) 장애를 처리 할 수있는 재해 복구 솔루션을 지원하는 동시에 보호되는 데이터베이스 클러스터에 대한 성능 영향을 최소화하는 것입니다. Aurora 글로벌 데이터베이스를 사용하면 일반적으로 5 초 미만의 RPO와 1 분 미만의 RTO를 달성 할 수 있습니다. 쓰기 워크로드가 큰 경우에도 소스 및 대상 클러스터 모두에 미치는 성능 영향은 미미합니다.

Aurora 글로벌 데이터베이스의 두 번째 주요 사용 사례는 해당 리전에 가까운 사용자에게 서비스를 제공하기 위해 최대 5 개의 원격 리전에서 Amazon Aurora 클러스터의 읽기 전용 사본을 제공하는 것입니다. 이는 원격 리전의 사용자에게 더 멀리 떨어져있는 기본 리전에 연결하는 것보다 지연 시간이 더 짧은 읽기를 제공합니다.

다음 그래프는 두 리전간에 MySQL 논리적 복제를 사용하는 예를 나타냅니다. 쿼리 수가 단계적으로 증가하면 대상 클러스터에서 관찰되는 복제 시간 지연이 기하 급수적으로 증가합니다. 또한 테스트 된 구성에서 처리 할 수있는 초당 쿼리 수는 약 35,000 개에 달했습니다.

대조적으로 다음 그래프는 Aurora 글로벌 데이터베이스를 사용한 동일한 워크로드 및 인스턴스 크기를 보여줍니다. 여기서 복제 시간 지연은 1 초 미만으로 유지되고 초당 쿼리는 약 200,000 (+ 5.7x)에 달했습니다.

읽기 복제본 쓰기 전달 (Write Forwarding)

지연 시간이 짧은 읽기를 여러 리전의 사용자에게 더 가깝게 제공하는 것 외에도 원격 리전에서 실행되는 애플리케이션은 데이터베이스에 기록해야 할 수도 있습니다. 이렇게하려면 응용 프로그램에서 다음을 수행해야 합니다:

  • 각 원격 리전에서 기본 리전으로의 연결 설정
  • 읽기는 리전의 로컬 클러스터로 전송되고 쓰기는 기본 리전으로 전송되도록 애플리케이션 코드에서 읽기 및 쓰기 트래픽을 분할
  • Aurora 글로벌 데이터베이스 복제는 비동기식이고 복제 시간 지연이 적기 때문에 쓰기와 후속 읽기 간의 일관성을 관리합니다. 이것이 올바르게 수행되지 않으면 로컬 클러스터에 대한 읽기가 애플리케이션에서 수행한 기본 리전에 대한 이전 쓰기의 결과를 보지 못할 수 있습니다.

Aurora 글로벌 데이터베이스의 새로운 읽기 전용 복제본 쓰기 전달 기능을 사용하면 원격 리전에서 쓰기를 훨씬 쉽게 수행 할 수 있습니다. 쓰기 전달을 사용하면 애플리케이션이 로컬 읽기 전용 클러스터에 쓰기를 보낼 수 있으며, 그런 다음 애플리케이션에 대해 위에서 언급 한 단계를 투명하게 처리합니다. 이를 통해 애플리케이션은 Aurora 글로벌 데이터베이스 원격 클러스터에 쓰기를 보낼 수 있으므로 애플리케이션 개발이 간소화됩니다. 쓰기 전달의 주요 이점은 다음과 같습니다:

  • 관리형 솔루션 – 원격 클러스터에서 실행 된 쓰기가 기본 클러스터로 투명하게 전달됩니다.
  • 복제 충돌 없음 – 모든 쓰기가 기본 클러스터에서 적용되기 때문에 복제 관련 업데이트 충돌이 발생하지 않습니다.
  • 단순화 – 원격 클러스터에 쓰기를 실행 한 다음 이전 쓰기의 결과를 볼 수 있는 읽기를 실행할 수 있습니다.
  • 유연성 – 일관성과 성능의 균형을 맞추기 위해 여러 읽기 일관성 수준 중에서 선택할 수 있습니다.

애플리케이션 개발을 단순화하고 원격 Aurora 글로벌 데이터베이스 클러스터에 쓸 수 있도록 쓰기 전달에는 다음과 같은 기능이 있습니다:

  • 원격 클러스터와 기본 클러스터 간의 연결은 Amazon 백본에서 보안 연결을 사용하여 자동으로 관리됩니다.
  • 원격 클러스터의 동일한 인스턴스에 읽기 및 쓰기를 실행할 수 있습니다. 읽기 및 쓰기 트래픽을 분할하거나 읽기 및 쓰기를 위해 별도의 연결, 세션 또는 트랜잭션을 관리 할 필요가 없습니다.
  • 일관성과 성능의 균형을 맞출 수있는 여러 일관성 모드가 제공됩니다.

Aurora 글로벌 데이터베이스 쓰기 전달은 원격 클러스터의 인스턴스에 있는 애플리케이션에서 쓰기 문장을 수락하고 필요한 컨텍스트와 함께 해당 문장을 기본 클러스터에 전달하는 방식으로 작동합니다. 그러면 쓰기 문장이 기본 인스턴스에서 실행됩니다. 경고 및 오류를 포함하여 명령문 실행의 모든 ​​결과는 원격 인스턴스로 리턴된 다음 애플리케이션으로 리턴됩니다. 이 전체 프로세스는 애플리케이션에 투명합니다. 클러스터에 대한 쓰기 전달을 활성화하고 쓰기를 수행하려는 각 세션에 대해 일관성 모드를 설정하기만 하면됩니다.

쓰기 전달을 사용하려면 다음 사항에 유의해야 합니다:

  • aurora_replica_read_consistency 옵션을 설정하여 세션에서 쓰기 전달을 활성화해야 합니다.
  • INSERT, UPDATEDELETE가 모두 지원되지만 임시 테이블의 결과를 기반으로 영구 테이블을 수정하는 경우는 제외됩니다.
  • 잠금 읽기를 사용할 수 있습니다 (SELECT … FOR UPDATE, SELECT … LOCK IN SHARE MODE).
  • PREPAREEXECUTE 구문을 사용하는 prepared statement가 지원됩니다.
  • Stored procedure는 지원되지 않으며 기본 클러스터에서 실행되어야 합니다.
  • DDL 문은 지원되지 않으며 기본 클러스터에서 실행되어야 합니다.

자세한 내용은 Amazon Aurora 글로벌 데이터베이스 작업을 참조하십시오.

일관성 모드 설정

애플리케이션이 원격 클러스터에 대해 쓰기 명령문을 실행하면 해당 명령문의 결과가 기본 클러스터에서 실행 된 직후 애플리케이션에 리턴됩니다. 이는 트랜잭션이 사용된 일관성 모드에 관계없이 지속된다는 것을 의미합니다. 그러나 변경 사항이 기본 클러스터에 적용된 후에는 변경 사항이 원격 읽기를 제공하기 위해 원격 클러스터로 다시 복제되는데 시간이 걸립니다. 애플리케이션의 특정 트랜잭션에 따라 쓰기 후 읽기 일관성이 필요할 수도 있고 필요하지 않을 수도 있습니다. 복제가 완료 될 때까지 기다렸다가 이전 쓰기를 읽을 수 있는지 확인하거나, 성능을 개선하고 복제가 완료 될 때까지 기다리지 않고 다음 문을 계속할 수 있습니다. 이를 위해 쓰기 전달은 구성 가능한 읽기 일관성 모드를 지원합니다.

일관성 모드는 세션 수준에서 구성되며 aurora_replica_read_consistency 매개 변수에 의해 제어됩니다. 기본적으로이 매개 변수는 빈 값으로 설정되며 쓰기 전달을 사용하려면 이 옵션을 session, global 또는 eventual으로 설정해야 합니다.

Session consistency

aurora_replica_read_consistencysession으로 설정하면 동일한 세션에서 쓰기 이후의 읽기 쿼리는 복제가 이전 쓰기를 따라 잡을 때까지 기다립니다. 이렇게하면 세션이 자체 변경 사항을 볼 수 있지만 다른 세션에서 수행된 변경 사항을 볼 수 있다는 보장은 없습니다.

Global consistency

aurora_replica_read_consistencyglobal로 설정하면 읽기 쿼리는 읽기가 시작된 시점부터 복제가 따라 잡을 때까지 대기합니다. 즉, 원격 클러스터에서의 읽기 쿼리는 원격 클러스터에서 시작될 때부터 기본 클러스터에 커밋된 모든 변경 사항을 원격 클러스터에서 읽을 수 있게 됩니다. 이 모드는 가장 강력한 쓰기 후 읽기 일관성을 제공하지만 성능이 저하됩니다. 이 모드를 사용할 때 쿼리 대기 시간은 복제 지연 시간 이상입니다.

Eventual consistency

aurora_replica_read_consistencyeventual으로 설정하면 읽기 쿼리에 복제 시간 지연이 적용됩니다. 이렇게하면 원격 복제본이 복제가 완료 될 때까지 기다리지 않고 다음 읽기에서 이전 쓰기의 결과를 볼 수 있는지 확인하지 않기 때문에 쓰기 대기 시간이 줄어 듭니다. 이것은 쓰기가 손실 될 수 있음을 의미하지 않습니다. 쿼리가 계속되면 기본 클러스터가 쓰기를 수행하고 원격 클러스터에 이를 적용했음을 의미합니다. 그러나 해당 쓰기에 의해 생성된 결과 데이터 변경은 읽기가 실행될 때 원격 클러스터로 다시 복제되지 않았을 수 있습니다.

쓰기 전달을 사용하여 Aurora 글로벌 데이터베이스 설정

기존 클러스터가 있는 경우 쓰기 전달을 통해 Aurora 글로벌 데이터베이스를 활성화하는 첫 번째 단계는 글로벌 클러스터를 생성하는 것입니다. 다음 단계를 완료하십시오:

  1. Amazon RDS 콘솔에서 Database를 선택합니다.
  2. 소스 클러스터 선택.
  3. Actions 드롭 다운 메뉴에서 Add region 를 선택합니다.
  4. Add an AWS Region 페이지에서 Global database 식별자에 글로벌 데이터베이스의 이름을 입력합니다. 예 : globalcluster.
    읽기 및 쓰기 리전을 모두 포함하는 전역 클러스터의 이름입니다.
  5. Secondary Region에서 대상 리전을 선택합니다.
    이 블로그는 EU (Ireland)를 선택합니다.
  6. 이 페이지의 나머지 설정에 대해서는 Aurora DB 클러스터를 생성하는데 사용한 것과 동일한 설정을 사용합니다. 단, 다음은 예외입니다:
    • Read replica write forwarding의 경우 Enable read replica write forwarding을 선택합니다.

      글로벌 클러스터 생성이 완료되면 콘솔의 보기는 다음 스크린 샷과 유사합니다.

      이 시점에서 쓰기 및 읽기 클러스터가 모두 온라인 상태이며 트래픽을 수락 할 준비가 되었습니다.

리전 사이의 쓰기 설정

읽기 리전에서 쓰기를 수행하기 위해 다음을 수행합니다:

  1. 쓰기 리전의 클러스터에 연결하고 다음 코드를 사용하여 새 스키마를 생성합니다.
    mysql> create schema globaldb;
    Query OK, 1 row affected (0.00 sec)

    쓰기 전달은 DML 명령만 전달합니다. 즉, 쓰기 리전에서 CREATE TABLE과 같은 DDL 명령을 실행해야 합니다. 다음 코드를 참조하십시오.

    mysql> use globaldb;
    Database changed
    
    mysql> CREATE TABLE `test_table` (
        ->   `row_id` int(11) NOT NULL AUTO_INCREMENT,
        ->   `column01` varchar(45) DEFAULT NULL,
        ->   PRIMARY KEY (`row_id`)
        -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Query OK, 0 rows affected (0.02 sec)
  2. 신규 테이블을 소유한 신규 스키마를 생성 한 후 쓰기 리전에서 해당 테이블에 단일 행을 삽입하고 결과를 선택합니다. 다음 코드를 참조하십시오.
    mysql> INSERT INTO `globaldb`.`test_table`
        -> (`column01`)
        -> VALUES
        -> ('writer region column 01');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SELECT * FROM `globaldb`.`test_table`;
    +--------+-------------------------+
    | row_id | column01                |
    +--------+-------------------------+
    |      1 | writer region column 01 |
    +--------+-------------------------+
    1 row in set (0.00 sec)

    이제 쓰기 리전에 단일 행을 포함하는 단일 테이블이 있는 단일 스키마가 존재합니다.

  3. 읽기 리전에 연결하여 이러한 모든 항목이 읽기 리전에 있는지 확인합니다. 다음 코드를 참조하십시오.
    mysql> use globaldb;
    Database changed
    
    mysql> SELECT * FROM `globaldb`.`test_table`;
    +--------+-------------------------+
    | row_id | column01                |
    +--------+-------------------------+
    |      1 | writer region column 01 |
    +--------+-------------------------+
    1 row in set (0.07 sec)
  4. 읽기 일관성 모드를 설정하고 행을 삽입하고 현재 테이블 내용을 확인합니다. 다음 코드를 참조하십시오.
    mysql> set @@aurora_replica_read_consistency = 'session';
    Query OK, 0 rows affected (0.07 sec)
    
    mysql> INSERT INTO `globaldb`.`test_table`
        -> (`column01`)
        -> VALUES
        -> ('reader region column 01');
    Query OK, 1 row affected (0.15 sec)
    
    mysql> SELECT * FROM `globaldb`.`test_table`;
    +--------+-------------------------+
    | row_id | column01                |
    +--------+-------------------------+
    |      1 | writer region column 01 |
    |      2 | reader region column 01 |
    +--------+-------------------------+
    2 rows in set (0.08 sec)

    지원되는 명령문을 실행하기 전에 세션 수준에서 @@ aurora_replica_read_consistency 모드를 설정해야 합니다. 이 매개 변수를 설정하지 않으면 다음 예외가 발생합니다.

    mysql> INSERT INTO `globaldb`.`test_table`
        -> (`column01`)
        -> VALUES
        -> ('reader region column 01');
    ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

Amazon Aurora 글로벌 데이터베이스를 사용하면 원격 리전에서 로컬 읽기를 제공 할 수있는 글로벌 분산 애플리케이션을 생성 할 수 있습니다. 최소한의 RPO 및 RTO로 재해 복구 솔루션을 유지 관리 할 수 ​​있으며 전 세계 리전에 짧은 지연 시간 읽기를 제공 할 수 있습니다. 쓰기 전달을 사용하면 이제 글로벌 애플리케이션이 최소한의 코드 변경으로 원격 리전에서 쓰기를 수행 할 수 있습니다.

Amazon Aurora 글로벌 데이터베이스와 쓰기 전달을 지금 바로 시작하십시오!

– Steve Abraham, AWS Principal Solutions Architect

이 글은 AWS Database 블로그의 Building globally distributed MySQL applications using write forwarding in Amazon Aurora Global Database 한국어 번역본으로 장동훈 AWS DB  솔루션 아키텍트가 번역 및 검수하였습니다.