

# Amazon RDS의 다중 AZ DB 클러스터에 PostgreSQL 논리적 복제 설정
<a name="USER_MultiAZDBCluster_LogicalRepl"></a>

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

다중 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 설명서의 [논리적 복제](https://www.postgresql.org/docs/current/logical-replication.html)를 참조하세요.

**Topics**
+ [사전 조건](#multi-az-db-clusters-logical-replication-prereqs)
+ [논리적 복제 설정](#multi-az-db-clusters-logical-replication)
+ [제한 및 권장 사항](#multi-az-db-clusters-logical-replication-limitations)

## 사전 조건
<a name="multi-az-db-clusters-logical-replication-prereqs"></a>

다중 AZ DB 클러스터를 위한 PostgreSQL 논리적 복제를 구성하려면 다음 사전 조건을 충족해야 합니다.
+ 사용자 계정이 `rds_superuser` 그룹의 구성원이어야 하며 `rds_superuser` 권한을 보유해야 합니다. 자세한 내용은 [PostgreSQL 역할 및 권한 이해](Appendix.PostgreSQL.CommonDBATasks.Roles.md) 섹션을 참조하세요.
+ 다중 AZ DB 클러스터를 사용자 지정 DB 클러스터 파라미터 그룹과 연결해야 다음 절차에 설명된 파라미터 값을 구성할 수 있습니다. 자세한 내용은 [다중 AZ DB 클러스터용 DB 클러스터 파라미터 그룹 작업](USER_WorkingWithDBClusterParamGroups.md) 섹션을 참조하세요.

## 논리적 복제 설정
<a name="multi-az-db-clusters-logical-replication"></a>

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

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

**RDS for PostgreSQL 다중 AZ DB 클러스터의 논리적 복제를 설정하려면**

1. RDS for PostgreSQL 다중 AZ DB 클러스터와 연결된 사용자 지정 DB 클러스터 파라미터 그룹을 엽니다.

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

1. 이러한 변경의 하나로 다음과 같은 DB 클러스터 파라미터를 구성합니다.
   + `max_wal_senders`
   + `max_replication_slots`
   + `max_connections`

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

1. 파라미터 값을 적용하려면 다중 AZ DB 클러스터를 재부팅합니다. 지침은 [Amazon RDS에서 다중 AZ DB 클러스터 및 리더 DB 인스턴스 재부팅](multi-az-db-clusters-concepts-rebooting.md) 섹션을 참조하세요.

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

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

1. 다중 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`으로 설정합니다. 파라미터 변경 사항을 적용하려면 클러스터를 재부팅하세요.

## 제한 및 권장 사항
<a name="multi-az-db-clusters-logical-replication-limitations"></a>

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\$1subscription\$1rel](https://www.postgresql.org/docs/current/catalog-pg-subscription-rel.html)` 카탈로그 테이블을 사용하여 테이블 동기화를 모니터링할 수 있습니다. `srsubstate` 열이 준비 상태(`r`)로 설정되면 테이블 동기화가 완료됩니다.
+ 초기 테이블 동기화가 완료되면 논리적 복제 연결에 인스턴스 엔드포인트를 사용하는 것이 좋습니다. 다음 명령은 리더 DB 인스턴스 중 하나로 복제를 오프로드하여 라이터 DB 인스턴스의 부하를 줄여줍니다.

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

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

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