다중 AZ DB 클러스터에서 PostgreSQL 논리적 복제 사용 - Amazon Relational Database Service

다중 AZ DB 클러스터에서 PostgreSQL 논리적 복제 사용

PostgreSQL의 논리적 복제 기능을 다중 AZ DB 클러스터와 함께 사용하면 전체 데이터베이스 인스턴스가 아닌 개별 테이블을 복제하고 동기화할 수 있습니다. 논리적 복제에서는 게시 및 구독 모델을 사용하여 원본에서 한 명 이상의 수신자에게 변경 내용을 복제합니다. 이 작업은 PostgreSQL 미리 쓰기 로그(WAL)의 변경 레코드를 사용하여 작동합니다. 자세한 내용은 Amazon RDS for PostgreSQL에 대한 논리적 복제 수행 단원을 참조하십시오.

다중 AZ DB 클러스터의 라이터 DB 인스턴스에 새 논리적 복제 슬롯을 만들면 해당 슬롯이 클러스터의 각 리더 DB 인스턴스에 비동기적으로 복사됩니다. 리더 DB 인스턴스의 슬롯은 라이터 DB 인스턴스의 슬롯과 지속적으로 동기화됩니다.

논리적 복제는 RDS for PostgreSQL 버전 14.8-R2 이상 및 15.3-R2 이상을 실행하는 다중 AZ DB 클러스터에서 지원됩니다.

참고

기본 PostgreSQL 논리적 복제 기능 외에 RDS for PostgreSQL을 실행하는 다중 AZ DB 클러스터도 pglogical 확장을 지원합니다.

PostgreSQL 논리적 복제에 대한 자세한 내용은 PostgreSQL 설명서의 논리적 복제를 참조하세요.

필수 조건

다중 AZ DB 클러스터를 위한 PostgreSQL 논리적 복제를 구성하려면 다음 사전 조건을 충족해야 합니다.

논리적 복제 설정

다중 AZ DB 클러스터의 논리적 복제를 설정하려면 연결된 DB 클러스터 파라미터 그룹 내에서 특정 파라미터를 활성화한 후 논리적 복제 슬롯을 생성해야 합니다.

참고

PostgreSQL 버전 16부터는 다중 AZ DB 클러스터의 리더 DB 인스턴스를 논리적 복제에 사용할 수 있습니다.

RDS for PostgreSQL 다중 AZ DB 클러스터의 논리적 복제를 설정하려면
  1. RDS for PostgreSQL 다중 AZ DB 클러스터와 연결된 사용자 지정 DB 클러스터 파라미터 그룹을 엽니다.

  2. 파라미터 검색 필드에서 rds.logical_replication 정적 파라미터를 찾고 값을 1로 설정합니다. 이 파라미터 변경은 WAL 생성을 증가시킬 수 있으므로, 논리적 슬롯을 사용하는 경우에만 활성화해야 합니다.

  3. 이러한 변경의 하나로 다음과 같은 DB 클러스터 파라미터를 구성합니다.

    • max_wal_senders

    • max_replication_slots

    • max_connections

    예상 사용량에 따라 다음 파라미터의 값을 변경해야 할 수도 있습니다. 하지만 대부분의 경우 기본값이면 충분합니다.

    • max_logical_replication_workers

    • max_sync_workers_per_subscription

  4. 파라미터 값을 적용하려면 다중 AZ DB 클러스터를 재부팅합니다. 지침은 다중 AZ DB 클러스터 및 리더 DB 인스턴스 재부팅 섹션을 참조하세요.

  5. 논리적 복제 슬롯 작업에 설명된 대로 다중 AZ DB 클러스터의 라이터 DB 인스턴스에 논리적 복제 슬롯을 생성합니다. 이 프로세스에서는 디코딩 플러그인을 지정해야 합니다. 현재 RDS for PostgreSQL은 PostgreSQL과 함께 전송되는 test_decoding, wal2json, pgoutput 플러그인을 지원합니다.

    슬롯은 클러스터의 각 리더 DB 인스턴스에 비동기적으로 복사됩니다.

  6. 다중 AZ DB 클러스터의 모든 리더 DB 인스턴스에 있는 슬롯의 상태를 확인합니다. 이렇게 하려면 모든 리더 DB 인스턴스의 pg_replication_slots 보기를 검사하고 애플리케이션이 논리적 변경 사항을 적극적으로 소비하는 동안 confirmed_flush_lsn 상태가 진행되고 있는지 확인해야 합니다.

    다음 명령은 리더 DB 인스턴스의 복제 상태를 검사하는 방법을 보여줍니다.

    % psql -h test-postgres-instance-2.abcdefabcdef.us-west-2.rds.amazonaws.com postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D0001700 (1 row) postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D8003628 (1 row) % psql -h test-postgres-instance-3.abcdefabcdef.us-west-2.rds.amazonaws.com postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D0001700 (1 row) postgres=> select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn --------------+-----------+--------------------- logical_slot | logical | 32/D8003628 (1 row)

복제 작업을 완료한 후에는 복제 프로세스를 중지하고 복제 슬롯을 삭제한 다음 논리적 복제를 비활성화합니다. 논리적 복제를 비활성화하려면 DB 클러스터 파라미터 그룹을 수정하고 rds.logical_replication 값을 다시 0으로 설정합니다. 파라미터 변경 사항을 적용하려면 클러스터를 재부팅하세요.

제한 및 권장 사항

PostgreSQL 버전 16을 실행하는 다중 AZ DB 클러스터에서 논리적 복제를 사용하는 경우 다음과 같은 제한 및 권장 사항이 적용됩니다.

  • 라이터 DB 인스턴스만 사용하여 논리적 복제 슬롯을 만들거나 삭제할 수 있습니다. 예를 들어, CREATE SUBSCRIPTION 명령은 호스트 연결 문자열에서 클러스터 라이터 엔드포인트를 사용해야 합니다.

  • 테이블 동기화 또는 재동기화 중에는 클러스터 라이터 엔드포인트를 사용해야 합니다. 예를 들어, 다음 명령을 사용하여 새로 추가된 테이블을 다시 동기화할 수 있습니다.

    Postgres=>ALTER SUBSCRIPTION subscription-name CONNECTION host=writer-endpoint Postgres=>ALTER SUBSCRIPTION subscription-name REFRESH PUBLICATION
  • 논리적 복제에 리더 DB 인스턴스를 사용하기 전에 테이블 동기화가 완료될 때까지 기다려야 합니다. pg_subscription_rel 카탈로그 테이블을 사용하여 테이블 동기화를 모니터링할 수 있습니다. srsubstate 열이 준비 상태(r)로 설정되면 테이블 동기화가 완료됩니다.

  • 초기 테이블 동기화가 완료되면 논리적 복제 연결에 인스턴스 엔드포인트를 사용하는 것이 좋습니다. 다음 명령은 리더 DB 인스턴스 중 하나로 복제를 오프로드하여 라이터 DB 인스턴스의 부하를 줄여줍니다.

    Postgres=>ALTER SUBSCRITPION subscription-name CONNECTION host=reader-instance-endpoint

    한 번에 둘 이상의 DB 인스턴스에서 동일한 슬롯을 사용할 수 없습니다. 둘 이상의 애플리케이션이 클러스터의 서로 다른 DB 인스턴스에서 논리적 변경 사항을 복제하는 경우 클러스터 장애 조치 또는 네트워크 문제로 인해 일부 변경 사항이 손실될 수 있습니다. 이러한 상황에서는 호스트 연결 문자열의 논리적 복제에 인스턴스 엔드포인트를 사용할 수 있습니다. 동일한 구성을 사용하는 다른 애플리케이션은 다음과 같은 오류 메시지를 표시합니다.

    replication slot slot_name is already active for PID x providing immediate feedback.
  • pglogical 확장을 사용하는 동안에는 클러스터 라이터 엔드포인트만 사용할 수 있습니다. 확장에는 테이블 동기화 중에 사용되지 않는 논리적 복제 슬롯을 생성할 수 있는 알려진 제한 사항이 있습니다. 오래된 복제 슬롯은 미리 쓰기 로그(WAL) 파일을 예약하므로, 디스크 공간 문제가 발생할 수 있습니다.