Aurora에서 PostgreSQL 논리적 복제 사용 - Amazon Aurora

Aurora에서 PostgreSQL 논리적 복제 사용

PostgreSQL의 논리적 복제 기능을 Aurora PostgreSQL DB 클러스터와 함께 사용하면 전체 데이터베이스 인스턴스가 아닌 개별 테이블을 복제하고 동기화할 수 있습니다. 논리적 복제에서는 게시 및 구독 모델을 사용하여 원본에서 한 명 이상의 수신자에게 변경 내용을 복제합니다. 이 작업은 PostgreSQL 미리 쓰기 로그(WAL)의 변경 레코드를 사용하여 작동합니다. 소스 또는 게시자는 지정된 테이블에 대한 WAL 데이터를 한 명 이상의 수신자(구독자)에게 전송하여 변경 사항을 복제하고 구독자의 테이블을 게시자의 테이블과 동기화된 상태로 유지합니다. 게시자의 변경 사항 집합은 게시를 사용하여 식별됩니다. 구독자는 게시자의 데이터베이스 및 게시에 대한 연결을 정의하는 구독을 만들어 변경 사항을 적용합니다. 복제 슬롯은 이 체계에서 구독 진행 상황을 추적하는 데 사용되는 메커니즘입니다.

Aurora PostgreSQL DB 클러스터의 경우 WAL 레코드가 Aurora 스토리지에 저장됩니다. 논리적 복제 시나리오에서 게시자 역할을 하는 Aurora PostgreSQL DB 클러스터는 Aurora 스토리지에서 WAL 데이터를 읽고 디코딩하고 구독자에게 전송하여 변경 사항이 해당 인스턴스의 테이블에 적용될 수 있도록 합니다. 게시자는 논리적 디코더를 사용하여 구독자가 사용할 데이터를 디코딩합니다. 기본적으로 Aurora PostgreSQL DB 클러스터는 데이터를 전송할 때 네이티브 PostgreSQL pgoutput 플러그인을 사용합니다. 다른 논리적 디코더도 사용할 수 있습니다. 예를 들어, Aurora PostgreSQL는 WAL 데이터를 JSON으로 변환하는 wal2json 플러그인도 지원합니다.

Aurora PostgreSQL 버전 14.5, 13.8, 12.12 및 11.17부터 Aurora PostgreSQL은 라이트-스루 캐시를 통해 PostgreSQL 논리적 복제 프로세스를 보강하여 성능을 개선합니다. WAL 트랜잭션 로그는 버퍼에 로컬로 캐시되어 디스크 I/O의 양, 즉 논리적 디코딩 중에 Aurora 스토리지에서 읽는 양을 줄입니다. 기본적으로 라이트-스루 캐시는 Aurora PostgreSQL DB 클러스터에 대한 논리적 복제를 사용할 때마다 사용됩니다. Aurora는 캐시 관리에 사용할 수 있는 다양한 함수를 제공합니다. 자세한 내용은 Aurora PostgreSQL 논리적 복제 라이트-스루 캐시 관리 단원을 참조하십시오.

논리적 복제는 현재 사용 가능한 모든 Aurora PostgreSQL 버전에서 지원됩니다. 자세한 정보는 Aurora PostgreSQL 릴리스 정보에서 Amazon Aurora PostgreSQL 업데이트 내용을 참조하세요.

Babelfish for Aurora PostgreSQL은 다음 버전에서 논리적 복제를 지원합니다.

  • 15.7 이상 버전

  • 16.3 이상 버전

참고

Aurora PostgreSQL은 PostgreSQL 10에 도입된 기본 PostgreSQL 논리적 복제 기능 외에 pglogical 확장도 지원합니다. 자세한 내용은 pglogical을 사용하여 인스턴스 간 데이터 동기화 단원을 참조하십시오.

PostgreSQL 논리적 복제에 대한 자세한 내용은 PostgreSQL 설명서의 Logical replication(논리적 복제) 및 Logical decoding concepts(논리적 디코딩 개념)을 참조하세요.

다음 주제에서는 Aurora PostgreSQL DB 클러스터 간에 논리적 복제를 설정하는 방법에 대한 정보를 찾을 수 있습니다.

Aurora PostgreSQL DB 클러스터의 논리적 복제 설정

논리적 복제를 설정하려면 rds_superuser 권한이 필요합니다. 다음 절차에 설명된 대로 필요한 파라미터를 설정하려면 사용자 지정 DB 클러스터 파라미터 그룹을 사용하도록 Aurora PostgreSQL DB 클러스터를 구성해야 합니다. 자세한 내용은 Amazon Aurora DB 클러스터의 DB 클러스터 파라미터 그룹 단원을 참조하십시오.

Aurora PostgreSQL DB 클러스터에 논리적 복제를 설정하는 방법
  1. https://console.aws.amazon.com/rds/에서 AWS Management Console에 로그인한 후 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 Aurora PostgreSQL DB 클러스터를 선택합니다.

  3. 구성 탭을 엽니다. 인스턴스 세부 정보 중에서 유형이 DB 클러스터 파라미터 그룹인 파라미터 그룹 링크를 찾아보세요.

  4. 링크를 선택하여 Aurora PostgreSQL DB 클러스터와 연결된 사용자 지정 파라미터를 엽니다.

  5. 파라미터 검색 필드에 rds를 입력하여 rds.logical_replication 파라미터를 찾습니다. 이 파라미터의 기본값은 0이며 기본적으로 꺼져 있음을 의미합니다.

  6. 파라미터 편집을 선택하여 속성 값에 액세스한 다음 선택기에서 기능을 켜도록 1을 선택합니다. 예상 사용량에 따라 다음 파라미터의 설정을 변경해야 할 수도 있습니다. 하지만 대부분의 경우 기본값이면 충분합니다.

    • max_replication_slots - 이 파라미터를 적어도 계획한 총 논리적 복제 게시 및 구독 수와 동일한 값으로 설정합니다. AWS DMS를 사용하는 경우 이 파라미터를 적어도 클러스터에서 계획한 변경 데이터 캡처 작업과 논리적 복제 게시 및 구독 수를 합친 값과 동일해야 합니다.

    • max_wal_sendersmax_logical_replication_workers - 이 파라미터를 적어도 활성화하려는 논리적 복제 슬롯 수 또는 변경 데이터 캡쳐를 위한 활성 AWS DMS 작업의 수와 동일한 값으로 설정합니다. 논리적 복제 슬롯을 비활성 상태로 두면 vacuum이 테이블에서 사용되지 않는 튜플을 제거할 수 없으므로 복제 슬롯을 모니터링하고 필요에 따라 비활성 슬롯을 제거하는 것이 좋습니다.

    • max_worker_processes - 이 파라미터를 적어도 max_logical_replication_workers, autovacuum_max_workersmax_parallel_workers 값의 합계와 동일한 값으로 설정합니다. 소규모 DB 인스턴스 클래스에서는 백그라운드 작업자 프로세스 수가 애플리케이션 워크로드에 영향을 줄 수 있으므로 max_worker_processes를 기본값보다 높게 설정한 경우 데이터베이스 성능을 모니터링합니다. (기본값은 GREATEST(${DBInstanceVCPU*2},8}의 결과입니다. 즉, 기본적으로 DB 인스턴스 클래스에 해당하는 CPU의 2배 또는 8 중 더 큰 값입니다.)

    참고

    고객이 생성한 DB 파라미터 그룹의 파라미터 값은 수정할 수 있지만, 기본 DB 파라미터 그룹의 파라미터 값은 변경할 수 없습니다.

  7. Save changes(변경 사항 저장)를 선택합니다.

  8. Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 재부팅하여 변경 사항이 적용되도록 합니다. Amazon RDS 콘솔에서 클러스터의 기본 DB 인스턴스를 선택하고 작업 메뉴에서 재부팅을 선택합니다.

  9. 인스턴스를 사용할 수 있게 되면 다음과 같이 논리적 복제가 활성화되어 있는지 확인할 수 있습니다.

    1. psql을 사용하여 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 연결합니다.

      psql --host=your-db-cluster-instance-1.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
    2. 다음 명령을 사용하여 논리적 복제가 활성화되었는지 확인합니다.

      labdb=> SHOW rds.logical_replication; rds.logical_replication ------------------------- on (1 row)
    3. wal_levellogical로 설정되어 있는지 확인합니다.

      labdb=> SHOW wal_level; wal_level ----------- logical (1 row)

논리적 복제를 사용하여 데이터베이스 테이블을 원본 Aurora PostgreSQL DB 클러스터의 변경 사항과 동기화된 상태로 유지하는 예는 예: Aurora PostgreSQL DB 클러스터에서 논리적 복제 사용 섹션을 참조하세요.

논리적 복제 비활성화

복제 작업을 완료한 후에는 복제 프로세스를 중지하고 복제 슬롯을 삭제한 다음 논리적 복제를 비활성화해야 합니다. 슬롯을 삭제하기 전에 슬롯이 더 이상 필요가 없는지 확인합니다. 활성 복제 슬롯은 삭제할 수 없습니다.

논리적 복제를 비활성화하는 방법
  1. 모든 복제 슬롯을 삭제합니다.

    모든 복제 슬롯을 삭제하려면 게시자에 연결하고 다음 SQL 명령을 실행합니다.

    SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name IN (SELECT slot_name FROM pg_replication_slots);

    이 명령을 실행할 때는 복제 슬롯을 활성화할 수 없습니다.

  2. Aurora PostgreSQL DB 클러스터의 논리적 복제 설정에 설명된 대로 게시자와 연결된 사용자 지정 DB 클러스터 파라미터 그룹을 수정하되 rds.logical_replication 파라미터를 0으로 설정합니다.

    사용자 지정 파라미터 그룹에 대한 자세한 내용은 Amazon Aurora에서 DB 클러스터 파라미터 그룹의 파라미터 수정 단원을 참조하세요.

  3. rds.logical_replication 파라미터 변경 사항이 적용되도록 게시자 Aurora PostgreSQL DB 클러스터를 다시 시작합니다.

Aurora PostgreSQL 논리적 복제 라이트-스루 캐시 관리

기본적으로 Aurora PostgreSQL 버전 14.5, 13.8, 12.12 및 11.17 이상에서는 라이트-스루 캐시를 사용하여 논리적 복제의 성능을 개선합니다. 라이트-스루 캐시가 없으면 Aurora PostgreSQL은 기본 PostgreSQL 논리적 복제 프로세스를 구현할 때 Aurora 스토리지 계층을 사용합니다. 이를 위해 WAL 데이터를 스토리지에 쓴 다음 스토리지에서 데이터를 다시 읽어 디코딩하고 대상(가입자)에 전송(복제)합니다. 그 결과 Aurora PostgreSQL DB 클러스터의 논리적 복제 중에 병목 현상이 발생할 수 있습니다.

라이트-스루 캐시를 사용하면 Aurora 스토리지 계층을 사용할 필요가 줄어듭니다. Aurora PostgreSQL은 Aurora 스토리지 계층에서 항상 쓰고 읽는 대신, 버퍼를 사용하여 논리적 WAL 스트림을 캐시하므로 항상 디스크에서 가져오는 대신 복제 프로세스 중에 사용할 수 있습니다. 이 버퍼는 논리적 복제에 사용하는 PostgreSQL 기본 캐시이며, Aurora PostgreSQL DB 클러스터 파라미터에서 rds.logical_wal_cache로 식별됩니다. 기본적으로 이 캐시는 Aurora PostgreSQL DB 클러스터의 버퍼 캐시 설정(shared_buffers)의 1/32를 사용하지만, 64kB보다 작거나 한 WAL 세그먼트 크기(일반적으로 16MB)보다 크지는 않습니다

(라이트-스루 캐시를 지원하는 버전의) Aurora PostgreSQL DB 클러스터에서 논리적 복제를 사용하는 경우, 캐시 적중률을 모니터링하여 사용 사례에 맞게 작동하는지 확인할 수 있습니다. 이렇게 하려면 다음 예제와 같이 psql을 사용하여 Aurora PostgreSQL DB 클러스터의 쓰기 인스턴스에 연결한 다음 Aurora 함수(aurora_stat_logical_wal_cache)를 사용해야 합니다.

SELECT * FROM aurora_stat_logical_wal_cache();

이 함수는 다음과 같은 출력을 반환합니다.

name | active_pid | cache_hit | cache_miss | blks_read | hit_rate | last_reset_timestamp -----------+------------+-----------+------------+-----------+----------+-------------- test_slot1 | 79183 | 24 | 0 | 24 | 100.00% | 2022-08-05 17:39... test_slot2 | | 1 | 0 | 1 | 100.00% | 2022-08-05 17:34... (2 rows)

가독성을 위해 last_reset_timestamp 값을 줄였습니다. 이 함수에 대한 자세한 내용은 aurora_stat_logical_wal_cache 단원을 참조하세요.

Aurora PostgreSQL는 라이트-스루 캐시를 모니터링하는 다음 두 가지 함수를 제공합니다.

자동으로 조정된 WAL 캐시 크기가 워크로드에 충분하지 않은 경우, 사용자 지정 DB 클러스터 파라미터 그룹의 파라미터를 수정하여 rds.logical_wal_cache 값을 수동으로 변경할 수 있습니다. 32kB 미만의 모든 양수 값은 32kB로 처리됩니다. wal_buffers에 대한 자세한 내용은 PostgreSQL 설명서에서 Write Ahead Log를 참조하세요.

Aurora PostgreSQL 논리적 슬롯 관리

스트리밍 활동이 pg_replication_origin_status 보기에 캡처됩니다. 이 보기의 내용을 보려면 다음과 같이 pg_show_replication_origin_status() 함수를 사용하면 됩니다.

SELECT * FROM pg_show_replication_origin_status();

다음 SQL 쿼리를 사용하여 논리적 슬롯 목록을 가져올 수 있습니다.

SELECT * FROM pg_replication_slots;

논리적 슬롯을 삭제하려면 다음 명령에서처럼 pg_drop_replication_slot를 슬롯 이름과 함께 사용합니다.

SELECT pg_drop_replication_slot('test_slot');

예: Aurora PostgreSQL DB 클러스터에서 논리적 복제 사용

다음 절차는 두 Aurora PostgreSQL DB 클러스터 간에 논리적 복제를 시작하는 방법을 보여줍니다. 게시자와 구독자 모두 Aurora PostgreSQL DB 클러스터의 논리적 복제 설정에 설명된 대로 논리적 복제를 구성해야 합니다.

지정된 게시자인 Aurora PostgreSQL DB 클러스터도 복제 슬롯에 대한 액세스를 허용해야 합니다. 그러려면 Aurora PostgreSQL DB 클러스터의 Amazon VPC 서비스를 기반으로 Virtual Public Cloud(VPC)와 연결된 보안 그룹을 수정합니다. 구독자의 VPC와 연결된 보안 그룹을 게시자의 보안 그룹에 추가하여 인바운드 액세스를 허용합니다. 자세한 내용을 알아보려면 Amazon VPC 사용 설명서의 보안 그룹을 사용하여 리소스에 대한 트래픽 제어를 참조하세요.

이러한 예비 단계가 완료되면 다음 절차에 설명된 대로 게시자에는 CREATE PUBLICATION, 구독자에는 CREATE SUBSCRIPTION PostgreSQL 명령을 사용할 수 있습니다.

두 Aurora PostgreSQL DB 클러스터 간에 논리적 복제를 시작하는 방법

이 단계에서는 Aurora PostgreSQL DB 클러스터에 예시 테이블을 생성할 데이터베이스가 있는 라이터 인스턴스가 있다고 가정합니다.

  1. 게시자 Aurora PostgreSQL DB 클러스터에서

    1. 다음 SQL 문을 사용하여 테이블을 생성합니다.

      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
    2. 다음 SQL 문을 사용해 게시자 데이터베이스에 데이터를 삽입합니다.

      INSERT INTO LogicalReplicationTest VALUES (generate_series(1,10000));
    3. 다음 SQL 문을 사용하여 테이블에 데이터가 있는지 확인합니다.

      SELECT count(*) FROM LogicalReplicationTest;
    4. 다음과 같이 CREATE PUBLICATION 문을 사용하여 이 테이블에 대한 게시를 생성합니다.

      CREATE PUBLICATION testpub FOR TABLE LogicalReplicationTest;
  2. 구독자 Aurora PostgreSQL DB 클러스터에서

    1. 다음과 같이 게시자에서 생성한 것과 동일한 LogicalReplicationTest 테이블을 구독자에 생성합니다.

      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
    2. 이 테이블이 비어 있는지 확인합니다.

      SELECT count(*) FROM LogicalReplicationTest;
    3. 구독을 만들어 게시자로부터 변경 사항을 받습니다. 게시자 Aurora PostgreSQL DB 클러스터에 다음 세부 정보를 사용해야 합니다.

      • host - 게시자 Aurora PostgreSQL DB 클러스터의 라이터 DB 인스턴스입니다.

      • 포트 - 라이터 DB 인스턴스가 수신 대기하는 포트입니다. PostgreSQL의 기본값은 5432입니다.

      • dbname - 데이터베이스의 이름입니다.

      CREATE SUBSCRIPTION testsub CONNECTION 'host=publisher-cluster-writer-endpoint port=5432 dbname=db-name user=user password=password' PUBLICATION testpub;
      참고

      보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

      구독이 생성된 후 논리적 복제 슬롯이 게시자 측에 생성됩니다.

    4. 이 예시에서 초기 데이터가 구독자 측에서 복제된다는 것을 확인하려면 구독자 데이터베이스에서 다음 SQL 문을 사용하십시오.

      SELECT count(*) FROM LogicalReplicationTest;

게시자에 대한 추가 변경 사항은 구독자에게로 복제됩니다.

논리적 복제는 성능에 영향을 미칩니다. 복제 작업이 완료된 후에는 논리적 복제를 해제하는 것이 좋습니다.

예: Aurora PostgreSQL 및 AWS Database Migration Service를 사용하는 논리적 복제

AWS Database Migration Service(AWS DMS)를 사용해 데이터베이스 또는 데이터베이스의 일부를 복제할 수 있습니다. AWS DMS를 사용해 데이터를 Aurora PostgreSQL 데이터베이스에서 다른 오픈 소스 또는 상용 데이터베이스로 마이그레이션합니다. AWS DMS에 대한 자세한 내용은 AWS Database Migration Service 사용 설명서를 참조하십시오.

다음 예에서는 게시자인 Aurora PostgreSQL 데이터베이스에서 논리적 복제를 설정한 다음 마이그레이션을 위해 AWS DMS를 사용하는 방법을 보여줍니다. 이 예시에서는 예: Aurora PostgreSQL DB 클러스터에서 논리적 복제 사용에서 생성된 동일한 게시자 및 구독자를 사용합니다.

AWS DMS를 이용해 논리적 복제를 설정하려면 Amazon RDS에서 게시자 및 구독자에 대한 세부 정보를 얻어야 합니다. 특히 게시자의 라이터 DB 인스턴스와 구독자의 DB 인스턴스에 대한 세부 정보가 필요합니다.

게시자의 라이터 DB 인스턴스에 대해 다음 정보를 얻으십시오.

  • Virtual Private Cloud(VPC) 식별자

  • 서브넷 그룹

  • 가용 영역(AZ)

  • VPC 보안 그룹

  • DB 인스턴스 ID

구독자의 DB 인스턴스에 대해 다음 정보를 얻으십시오.

  • DB 인스턴스 ID

  • 소스 엔진

Aurora PostgreSQL에서 논리적 복제를 위해 AWS DMS를 사용하려면
  1. AWS DMS 작업을 할 게시자 데이터베이스를 준비합니다.

    이를 위해 PostgreSQL 10.x 이상 데이터베이스에서는 AWS DMS 래퍼 함수를 게시자 데이터베이스에 적용해야 합니다. 이와 관련된 사항과 후속 단계에 대한 자세한 내용은 AWS Database Migration Service 사용 설명서PostgreSQL 버전 10.x 이상을 AWS DMS의 소스로 사용을 참조하세요.

  2. AWS Management Console에 로그인한 다음 AWS DMS에서 https://console.aws.amazon.com/dms/v2 콘솔을 엽니다. 상단 오른쪽에서 게시자와 구독자가 위치한 리전과 동일한 AWS 리전을 선택합니다.

  3. AWS DMS 복제 인스턴스를 생성합니다.

    게시자의 라이터 DB 인스턴스에 대한 값과 동일한 값을 선택합니다. 여기에는 다음 설정이 포함합니다.

    • VPC에서 라이터 DB 인스턴스의 VPC와 동일한 VPC를 선택합니다.

    • 복제 서브넷 그룹에서 라이터 DB 인스턴스의 서브넷 그룹과 동일한 서브넷 그룹을 선택합니다. 필요한 경우 새 것을 만듭니다.

    • 가용 영역에서 라이터 DB 인스턴스의 영역과 동일한 영역을 선택합니다.

    • VPC 보안 그룹에서 라이터 DB 인스턴스의 그룹과 동일한 그룹을 선택합니다.

  4. 원본에 대해 AWS DMS 엔드포인트를 생성합니다.

    다음 설정을 사용해 게시자를 원본 엔드포인트로 지정합니다.

    • Endpoint type(엔드포인트 유형)에서 Source endpoint(원본 엔드포인트)를 선택합니다.

    • Select RDS DB Instance(RDS DB 인스턴스 선택)을 선택합니다.

    • RDS Instance(RDS 인스턴스)에서 게시자의 라이터 DB 인스턴스의 DB 식별자를 선택합니다.

    • 소스 엔진에서 postgres를 선택합니다.

  5. 대상에 대해 AWS DMS 엔드포인트를 생성합니다.

    다음 설정을 사용해 구독자를 대상 엔드포인트로 지정합니다.

    • Endpoint type(엔드포인트 유형)에서 Target endpoint(대상 엔드포인트)를 선택합니다.

    • Select RDS DB Instance(RDS DB 인스턴스 선택)을 선택합니다.

    • RDS Instance(RDS 인스턴스)에서 구독자 DB 인스턴스의 DB 식별자를 선택합니다.

    • 소스 엔진의 값을 선택합니다. 예를 들어 구독자가 RDS PostgreSQL 데이터베이스인 경우 postgres를 선택합니다. 구독자가 Aurora PostgreSQL 데이터베이스인 경우 aurora-postgresql을 선택합니다.

  6. AWS DMS 데이터베이스 마이그레이션 작업을 생성합니다.

    데이터베이스 마이그레이션 작업을 사용하여 마이그레이션할 데이터베이스 테이블을 지정하고, 대상 스키마를 사용해 데이터를 매핑하고, 대상 데이터베이스에 새 테이블을 생성합니다. 최소한 Task configuration(작업 구성)에 대해 다음 설정을 사용하십시오.

    • Replication instance(복제 인스턴스)에서 이전 단계에서 생성한 복제 인스턴스를 선택합니다.

    • Source database endpoint(원본 데이터베이스 엔드포인트)에서 이전 단계에서 생성한 게시자 원본을 선택합니다.

    • Target database endpoint(대상 데이터베이스 엔드포인트)에서 이전 단계에서 생성한 구독자 대상을 선택합니다.

    작업에 관한 나머지 세부 정보는 마이그레이션 프로젝트에 따라 다릅니다. DMS 태스크의 모든 세부 정보 지정에 대한 자세한 내용은 AWS Database Migration Service 사용 설명서에서 AWS DMS 태스크 사용을 참조하세요.

작업이 생성되고 나면 AWS DMS에서 게시자에서 구독자로 데이터가 마이그레이션되기 시작합니다.