AWS 기술 블로그

AWS Data Migration Service(DMS)를 활용하여 Amazon Aurora PostgreSQL 블루/그린 배포 환경 생성하기

데이터베이스 운영 안정성 및 다운타임은 애플리케이션을 운영하는 관점에서 매우 중요합니다. 데이터베이스 운영 시 발생하는 파라미터 변경 또는 데이터베이스 버전 업그레이드하는 경우 필연적으로 다운타임이 발생하며 이에 소요되는 시간도 예측하기 어렵습니다. 데이터베이스가 단일 소스의 원천으로 구성되어 있는 아키텍쳐에서 데이터베이스의 운영 관리 측면에서 발생하는 이런 다운타임은 최종 사용자가 사용하는 애플리케이션의 가용성에 크게 영향을 미칩니다. 이런 상황에서 블루/그린 환경 배포 전략을 통해 데이터베이스 운영시 필수적인 버전 업그레이드 시 다운타임을 최소화할 수 있습니다.

이번 게시글은 Amazon Aurora에서 제공하는 빠른 데이터베이스 복제 기능 (Aurora Fast Database Cloning)과 AWS Database Migration Service(DMS)에서 제공하는 CDC(Change Data Capture) 데이터 복제 기능을 통해 Amazon Aurora PostgreSQL 환경에서 손쉽게 블루/그린 환경을 배포하는 방법을 설명합니다.

Aurora PostgreSQL 블루/그린 배포 개요

아래 다이어그램은 상위 레벨의 블루/그린 구성 아키텍쳐에 대해 소개하고 있습니다.

Amazon Aurora 빠른 클러스터 복제 기능을 통해 블루(운영) 환경의 Aurora의 데이터베이스와 스토리지 노드를 공유하는 그린 (복제) 환경의 Aurora PostgreSQL 데이터베이스 클러스터를 생성합니다. 데이터베이스 복제 생성은 일반적으로 수분의 복제 시간이 소요되며, 이 시기에 소스 데이터베이스 클러스터에 추가 또는 업데이트 된 데이터를 복제하기 위해 DMS의 CDC 마이그레이션 태스크를 활용하여 그린 클러스터 생성 이후 변경된 데이터를 복제합니다.

DMS 태스크를 통해 블루환경에서 변경되는 데이터 셋을 그린환경으로 복제하며, 대량의 스키마 및 테이블을 운영 중인 Aurora PosgreSQL의 경우, 여러 DMS 태스크 및 DMS 인스턴스로 나누어 복제를 진행합니다.

블루/그린 환경 배포의 장점은 그린 환경으로 운영 전환 이후 문제가 발생하는 경우 이전 블루환경으로 빠르게 롤백하여 다운타임을 최소화 할 수 있다는 점입니다. 이런 블루 환경으로 전환이 가능하도록 그린 환경에서 블루환경으로 데이터를 복제하는 DMS태스크를 생성합니다. DMS 태스크는 블루환경에서 그린환경으로 데이터 복제하는 정방향 태스크 및 그린환경에서 블루환경으로 데이터를 복제하는 역방향 태스크가 존재합니다.

데이터가 양방향으로 복제되는 환경에서 Amazon Route53 DNS 레코드 업데이트를 통해  엔드포인트를 그린환경의 데이터베이스로 전환합니다.

Amazon Aurora 빠른 클러스터 복제 기능 (Fast Cloning)

Amazon Aurora 빠른 데이터베이스 복제 기능은 Aurora 서비스의 분산 스토리지 엔진을 사용하여 동일한 데이터를 가지고 있는 신규 Aurora 클러스터를 수 분내에 생성할 수 있습니다. 빠른 데이터베이스 복제기능은 copy-on-write 프로토콜을 활용하여 복제 데이터베이스 생성 시 소스 데이터베이스가 사용하던 데이터 페이지에 새로운 포인터를 생성하여 동일 데이터 페이지를 바라보도록 구성됩니다.

아래 그림은 데이터 변경이 일어나지 않은 상태에서 소스 데이터베이스와 복제 데이터베이스 상태를 설명합니다. 소스 데이터베이스와 복제 데이터베이스는 Aurora 분산 스토리지 시스템 내 존재하는 동일한 페이지를 참조하고 있습니다.

이렇게 복제된 환경에서 소스 Aurora 클러스터 또는 복제 Aurora 클러스터에 데이터 변경이 발생하는 경우 해당 클러스터가 참조하는 페이지를 생성하기 위해 별도 스토리지 할당합니다.

아래 다이어그램은 Aurora 빠른 데이터베이스 복제 기능을 통해 복제 클러스터를 생성한 이후 소스 클러스터에는 페이지 4에 저장된 데이터가 변경되고, 복제 클러스터에는 페이지 3~5에 저장된 데이터가 변경된 이후 구성을 보여주고 있습니다.

단계 요약

Aurora PostgreSQL 블루/그린 배포는 아래와 같은 단계로 배포 및 테스트해 볼 수 있습니다.

  • 단계 1 : AWS DMS 복제를 위해 필요한 소스 Aurora PostgreSQL (블루 환경) 파라미터 변경
  • 단계 2 : 소스 Aurora PostgreSQL 환경에서 복제 슬롯 생성
  • 단계 3 : 복제Aurora PostgreSQL 클러스터(그린 환경) 생성
  • 단계 4 : AWS DMS를 통해 CDC 복제 태스크 수행
  • 단계 5 : 데이터 정합성 테스트 및 버전 업그레이드 수행
  • 단계 6 : Amazon Route53 서비스를 통해 데이터베이스 엔드포인트 전환

사전 준비사항

솔루션을 배포하기 위해서는 아래와 같은 사항을 미리 준비해야 합니다.

단계 1 : AWS DMS 복제를 위해 필요한 Aurora Postgres 파라미터 변경

AWS DMS 의 CDC only 태스크는 PostgreSQL에서 제공하는 논리적 복제(logical replication) 기능을 활용합니다. Amazon Aurora PostgreSQL 클러스터에서 논리적 복제 기능을 활성화하기 위해 필요한 파리미터를 변경 및 확인합니다.

이 단계에서는 아래 절차를 따릅니다.

  1. Amazon RDS서비스 메뉴 중 파라미터 그룹 메뉴에 접속합니다.
  2. 블루 환경의 Aurora 클러스터에 적용된 클러스터 파라미터 그룹 및 인스턴스 파라미터 그룹에서 파라미터를 아래와 같이 변경하고 확인합니다.
    • 클러스터 파라미터 그룹
      rds.logical_replication = 1       # PostgreSQL 논리적 복제 활성화
      max_replication_slots = 10     # 데이터베이스에 계획된 논리적 복제 발행 (publication) 및 구독(subscription)의 합으로 설정합니다. 
      max_wal_senders = 20            # 계획된 논리적 복제 또는 DMS 태스크 수와 동일하게 설정합니다.
      max_logical_replication_workers = 20     # 계획된 논리적 복제 또는 DMS 태스크 수와 동일하게 설정합니다.
      wal_sender_timeout = 300000                 # 비활성화된 커넥션 유지 타임아웃시간, 디폴트 값은 60000ms 입니다.
      max_worker_processes = GREATEST(max_logical_replication_workers, autovacuum_max_workers, max_parallel_workers, 10)
    • 인스턴스 파라미터 그룹
      max_worker_processes = GREATEST(max_logical_replication_workers, autovacuum_max_workers, max_parallel_workers, 10)

단계 2 : 블루 Aurora PostgreSQL 환경에서 복제 슬롯 생성

Aurora 빠른 데이터베이스 복제 기능을 통해 복제 클러스터를 생성 시 수분의 시간이 필요합니다. 해당 시간동안 소스 클러스터에서 변경된 데이터를 AWS DMS의 CDC 태스크를 통해 마이그레이션하기 위하여 복제 클러스터 생성 전 블루 Aurora PostgreSQL 환경에서 논리적 복제 슬롯을 생성합니다. AWS DMS는 CDC복제 태스크 내 논리적 복제 슬롯(logical replication slot)을 사용하여 로그가 논리적 디코딩될 때까지 WAL로그를 유지합니다. WAL 로그를 Aurora 복제 클러스터를 생성하기 전 CDC 작업을 위한 복제 시작 시점을 파악하기 위해 PostgreSQL의 복제 슬롯을 생성합니다.

이 단계에서는 아래 절차를 따릅니다.

  1. Aurora PostgreSQL 클러스터에 어드민(superuser) 권한을 가진 사용자로 접속합니다.
    psql --host=your-db-cluster-instance-1.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=your-db-name
  2. 논리적 복제 슬롯을 생성합니다. 아래 구문 실행을 통해 슬롯 이름은  abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef이고 출력 플러그인은 test_decoding 을 사용하는 논리적 복제 슬롯을 생성합니다.
    postgres=# SELECT * FROM 
    pg_create_logical_replication_slot('abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef', 'test_decoding');
    
                               slot_name                           |    lsn    
    ---------------------------------------------------------------+-----------
     abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef1 | 0/AE9F460
    (1 row)
  3. 논리적 복제 슬롯이 생성되었는지 확인하고 쿼리 실행 레코드의 restart_lsn 정보 및 confirmed_flush_lsn 정보를 확인합니다.
    postgres=# select * from pg_replication_slots where slot_name like 'abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef';
    
                              slot_name                           |    plugin     | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog
    _xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size 
    --------------------------------------------------------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------
    ------+-------------+---------------------+------------+---------------
     abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef | test_decoding | logical   |  14360 | postgres | f         | f      |            |      |       8
    44047 | 0/400A258   | 0/53548F8           | reserved   |              
    (1 row)
    

단계 3 : 그린 환경 클러스터 (Amazon Aurora PostgreSQL 복제 클러스터) 생성

Aurora 빠른 데이터베이스 복제 기능을 통해 블루 환경과 스토리지 노드 내 페이지를 공유하는 복제 Aurora 클러스터를 생성합니다.

이 단계에서는 아래 절차를 따릅니다.

  1. Amazon RDS 서비스 메뉴 중 데이터베이스 메뉴에 접속합니다.
  2. 소스 클러스터를 선택하고 작업 > 복제본 생성 메뉴를 클릭합니다.
  3. DB 인스턴스 식별자, 용량 유형 및 DB 인스턴스 클래스, VPC 및 DB 서브넷 그룹, DB 파라미터 그룹 등을 입력 후 복제 클러스터를 생성합니다. 생성 시 소스 클러스터와 동일한 VPC 및 DB 서브넷 그룹을 선택합니다.
  4. 그린환경의 복제 클러스터는 블루환경에서 생성한 논리적 복제 슬롯도 포함하고 있습니다. 복제 클러스터에 접속하여 해당 슬롯을 삭제합니다.
    postgres=# SELECT pg_drop_replication_slot('abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef');

단계 4 : AWS DMS를 통해 CDC 복제 수행

AWS DMS 서비스를 통해 블루 환경에서 그린환경으로 CDC 복제 태스크를 실행합니다.

AWS DMS 서브넷 그룹을 생성합니다.

  1. AWS DMS 서비스 내  서브넷 그룹 메뉴로 이동합니다.
  2.  화면 오른쪽 위에 위치한 “서브넷 그룹 생성” 버튼을 클릭합니다.
  3. 서브넷 그룹의 이름과, 소스 데이터베이스가 위치한 VPC 및 서브넷을 추가하고 서브넷 그룹을 생성합니다.

AWS DMS 복제 인스턴스를 생성하기 위해 아래 절차를 따릅니다.

  1. AWS DMS 서비스 내  복제 인스턴스 메뉴로 이동합니다.
  2. 화면 오른쪽 위에 위치한 “복제 인스턴스 생성” 버튼을 클릭합니다.
  3. 복제 인스턴스 이름을 입력하고, 인스턴스 클래스를 선택하고 고가용성 옵션, VPC 및 복제 서브넷 그룹을 선택하고 복제 인스턴스를 생성합니다.

(선택사항) CloudFormation 스택 배포 – AWS DMS엔드포인트 및 마이그레이션 태스크 생성

Aurora PostgreSQL 복제 클러스터 및 DMS 클러스터 생성 후 해당 스택을 배포하여 DMS 엔드포인트 및 마이그레이션 태스크를 생성합니다.

CloudFormation스택에서 요구하는 파라미터 값을 입력 후 스택을 배포합니다. CloudFormation 스택을 배포한 이후, AWS DMS 데이터베이스 마이그레이션 태스크 메뉴에서 태스크를 시작하고, 정상적으로 복제가 진행되는 것을 확인합니다. CloudFormation을 통해 엔드포인트 및 마이그레이션 태스크를 생성한 경우, “단계 5”로 넘어갑니다.

AWS 콘솔 대쉬보드 환경에서 구성하기를 원하는 경우, 아래 단계를 계속 수행합니다.

AWS DMS 소스 엔드포인트를 생성합니다.

  1. AWS DMS 서비스 콘솔 내  엔드포인트 메뉴로 이동합니다.
  2. 화면 오른쪽 위에 위치한 “엔드포인트 생성” 버튼을 클릭합니다.
  3. 소스 엔드포인트를 선택 후 “RDS DB 인스턴스 선택”을 체크하고 소스인 RDS 인스턴스를 선택합니다.
  4. 엔드포인트 구성 섹션에 엑세스 정보를 “수동으로 액세스 정보 제공”으로 선택 후 사용자 이름 및 암호, 데이터베이스 이름을 입력합니다.
  5. “엔드포인트 설정” 섹션을 확장하여 “PluginName” 및 “SlotName” 설정을 입력합니다. “PluginName” 설정은 PostgreSQL 논리적 복제 슬롯 생성 시 지정한 플러그인 값인 “test_decoding” 으로 입력하고 “SlotName”은 복제 슬롯 이름을 입력합니다.

AWS DMS 타겟 엔드포인트를 생성하기 위해 아래 절차를 따릅니다.

  1. Aurora 복제 클러스터 생성이 완료한 이후, 위와 동일한 방식으로 엔드포인트를 생성합니다. 복제 데이터베이스 클러스터는 소스 데이터베이스와 동일한 사용자를 통해 접근이 가능합니다. 타겟 엔드포인트 설정 시 “PluginName” 및 “SlotName” 설정은 필요하지 않습니다.

AWS DMS 마이그레이션 태스크를 생성하기 위해 아래 절차를 따릅니다.

  1. AWS DMS 서비스 콘솔 내  데이터베이스 마이그레이션 태스크 메뉴로 이동합니다.
  2. 화면 오른쪽 위에 위치한 “태스크 생성” 버튼을 클릭합니다.
  3. 태스크 식별자, 복제 인스턴스에 이전에 생성한 DMS 인스턴스를 선택하고, 소스 데이터베이스 엔드포인트에 블루 환경 엔드포인트, 대상 데이터베이스 엔드포인트에 그린 환경 엔드포인트를 입력합니다. 마이그레이션 유형에는 “데이터 변경사항만 복제”를 선택합니다.
  4. 태스크 설정에서 마법사 편집 모드에서 “사용자 지정 CDC 시작 모드”를 활성화하고, 시스템 변경 번호(Log sequence number)에 복제 슬롯 생성의 restart_lsn 정보를 입력합니다. 대상 테이블 준비 모드가 “아무 작업 안함”으로 선택되어 있는지 확인합니다.
  5. 양방향 복제 설정 시 루프백을 방지하는 설정을 합니다. 태스크 설정에서 JSON 편집기를 선택 후 LoopbackPreventionSettings 설정을 아래와 같이 변경합니다.
    "LoopbackPreventionSettings": {
        "EnableLoopbackPrevention": true,
        "SourceSchema": "<복제 소스 schema>",
        "TargetSchema": "<복제 대상 schema>"
      },
    

  6. 테이블 매핑에 모든 스키마와 모든 테이블을 포함합니다.
  7. 마이그레이션 태스크 시작 구성을 “생성 시 자동으로 시작”으로 설정한 이후 “태스크 생성” 버튼을 클릭하여 태스크를 생성합니다.

그린 환경에서 블루 환경으로 역방향 복제를 위한 AWS DMS 마이그레이션 태스크를 생성하기 위해 아래 절차를 따릅니다.

  1. 그린 환경을 소스로 하는 DMS 소스 엔드포인트를 생성합니다.
  2. 블루 환경을 타겟으로 하는 DMS 타겟 엔드포인트를 생성합니다.
  3. 위 엔드포인트를 사용하여 역방향 복제하는 마이그레이션 태스크를 생성하고 시작합니다.

단계 5 : 그린 클러스터 변경 작업 및 테스트 수행

그린 환경의 복제 데이터베이스 클러스터에서 파리미터 변경 또는 버전 업그레이드를 수행합니다. 그린환경 복제 클러스터 변경동안 발생된 데이터 변경사항은 그린환경이 정상화된 이후 AWS DMS를 마이그레이션 태스크를 통해 복제 수행됩니다. 클러스터 변경 작업을 완료된 이후 운영환경을 그린 클러스터로 전환하기 전 필요한 기능 테스트 및 성능 테스트를 수행합니다.

그린 클러스터를 운영환경으로 전환하기 이전 아래 항목 등을 확인합니다.

  • 그린 클러스터 환경에 모든 사용자와 권한이 설정되어 있는 것을 확인합니다.
  • 그린 클러스터 환경에 블루 환경과 동일한 인스턴스 타입, 커스텀 클러스터 파라미터 그룹, 인스턴스 파라미터 그룹, 보안그룹이 설정되어 있는 것을 확인합니다.
  • 그린 클러스터 환경에 최소 한개 이상의 읽기 전용 복제본을 타 가용영역에 배포하여 고가용성을 구성합니다.
  • 그린 클러스터 환경에서 애플리케이션이 제대로 동작하는 것을 확인합니다.

단계 6 : 그린 클러스터로 엔드포인트 전환

Amazon Route53에 CNAME 으로 등록된 Aurora 데이터베이스 엔드포인트 레코드 값을 그린 클러스터를 바라보도록 수정합니다. Route 53으로 그린 Aurora 클러스터로 운영환경을 전환하기 이전에, 애플리케이션은 Amazon Route53에 등록된 DNS 레코드를 통해 연결 구성이 되어 있는 것을 전제로 합니다.

이 단계에서는 아래 절차를 따릅니다.

  1. Amazon Route53 서비스 콘솔 내 호스팅 영역 메뉴에 접속합니다.
  2. 기존에 등록되어 있는 레코드 정보를 확인합니다. 아래 예제에서는 프라이빗 호스팅영역을 사용하여 데이터베이스를 바라보는 애플리케이션이 위치한 VPC 에서 해당 DNS 레코드를 쿼리할 수 있도록 구성되었습니다.
  3. (선택사항) TTL 값을 디폴트값인 300초에서 5초로 변경합니다. 해당 설정이 반영되기 까지 최소 300초 시간동안 대기합니다.
  4. 해당 레코드값을 그린 클러스터의 엔드포인트로 변경합니다.
  5. 그린 Aurora 클러스터에서 쿼리 요청을 모니터링하고, 블루 환경에서 변경 사항이 반영되는 것을 확인합니다.

리소스 정리하기

이번 게시물에서 배포한 아래 리소스를 삭제합니다.

  • AWS DMS 마이그레이션 태스크
  • AWS DMS 엔드포인트
  • AWS DMS 복제 인스턴스
  • AWS DMS 서브넷 그룹
  • Aurora 복제 클러스터

CloudFormation 스택을 통해 DMS 엔드포인트 및 마이그레이션 태스크를 구성한 경우, AWS CloudFormation 콘솔에서 화면 오른쪽 위의 “삭제” 버튼을 클릭하여 배포 스택을 삭제합니다.

결론

이번 게시물에서는 Aurora 빠른 데이터베이스 복제 기능 및 AWS DMS 서비스를 통해 Aurora PostgreSQL 환경에서 블루/그린 배포 전략을 통해 데이터베이스 다운타임을 최소화하고 예정된 일정과 시간 내에 데이터베이스를 업데이트할 수 있는 방법 소개해드렸습니다. Aurora PostgreSQL 환경에서 빠른 데이터베이스 복제 기능을 통해 별도의 데이터 마이그레이션 및 복사 작업 없이 빠르게 신규 Aurora 데이터베이스 클러스터를 생성할 수 있고, AWS DMS 서비스에서 제공하는 CDC 마이그레이션 태스크를 통해 블루환경에서 변경된 데이터를 그린환경으로 복제할 수 있었습니다.

데이터베이스의 엔진 버전 업그레이드는 DB 엔진 버그 패치, 보안 강화 및 개선사항을 반영하여 보다 안정적으로 데이터베이스를 운영하기 위해 필수적인 작업입니다. 버전 업그레이드를 포함하여 운영 상 데이터베이스 변경으로 인한 영향을 최소화할 수 있는 블루/그린 배포 전략을 통해 Aurora PostgreSQL 버전 데이터베이스의 안정적인 운영을 기대합니다.

Simyung Yang

Simyung Yang

양시명 솔루션즈 아키텍트는 텔코 엔터프라이즈 기업 고객을 대상으로 고객의 비즈니스 성과 달성을 위해 고객과 함께 최적의 아키텍처를 구성하는 역할을 수행하고 있습니다. MSA 아키텍쳐를 기반으로 애플리케이션 및 텔코 네트워크와 미디어 워크로드에 클라우드를 적용하고 현대화하는데 도움을 드리고 있습니다.