Amazon RDS용 Multi-AZ DB 클러스터에서 PostgreSQL 논리 복제 설정하기

Amazon RDS용 Multi-AZ DB 클러스터에서 PostgreSQL 논리 복제 설정하기

PostgreSQL 논리 복제를 Multi-AZ DB 클러스터에 활용하면, 전체 데이터베이스 인스턴스가 아니라 개별 테이블 단위로 복제하고 동기화할 수 있어요. 게시/구독(publish and subscribe) 모델을 사용해 소스에서 수신자로 변경 사항을 복제하는 방식이에요.

출처: 문서

본문

Multi-AZ DB 클러스터에 PostgreSQL 논리 복제를 사용하면 전체 데이터베이스 인스턴스가 아니라 개별 테이블을 복제하고 동기화할 수 있어요. 논리 복제는 게시 및 구독 모델을 사용해 소스에서 하나 이상의 수신자로 변경 사항을 복제해요. PostgreSQL WAL(write-ahead log)의 변경 레코드를 사용해 작동해요. 자세한 내용은 Amazon RDS for PostgreSQL 논리 복제 수행을 참고하세요.

Multi-AZ DB 클러스터의 writer DB 인스턴스에 새 논리 복제 슬롯을 만들면, 이 슬롯은 클러스터의 각 reader DB 인스턴스로 비동기 복사돼요. reader DB 인스턴스의 슬롯은 writer DB 인스턴스의 슬롯과 지속적으로 동기화돼요.

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

참고

기본 PostgreSQL 논리 복제 기능 외에도, RDS for PostgreSQL을 실행하는 Multi-AZ DB 클러스터는 pglogical 확장도 지원해요.

PostgreSQL 논리 복제에 대한 자세한 내용은 PostgreSQL 문서의 Logical replication을 참고하세요.

주제

  • 사전 준비
  • 논리 복제 설정
  • 제한 사항 및 권장 사항

사전 준비

Multi-AZ DB 클러스터용 PostgreSQL 논리 복제를 구성하려면 다음 사전 준비 사항을 충족해야 해요.

  • 사용자 계정이 rds_superuser 그룹의 멤버이고 rds_superuser 권한이 있어야 해요. 자세한 내용은 PostgreSQL 역할 및 권한 이해를 참고하세요.
  • Multi-AZ DB 클러스터가 사용자 지정 DB 클러스터 파라미터 그룹과 연결되어 다음 절차에 설명된 파라미터 값을 구성할 수 있어야 해요. 자세한 내용은 Multi-AZ DB 클러스터용 DB 클러스터 파라미터 그룹 사용을 참고하세요.

논리 복제 설정

Multi-AZ DB 클러스터에 논리 복제를 설정하려면 연결된 DB 클러스터 파라미터 그룹에서 특정 파라미터를 활성화한 다음 논리 복제 슬롯을 만들어요.

참고

PostgreSQL 버전 16부터는 Multi-AZ DB 클러스터의 reader DB 인스턴스를 논리 복제에 사용할 수 있어요.

RDS for PostgreSQL Multi-AZ DB 클러스터에 논리 복제를 설정하려면

  1. RDS for PostgreSQL Multi-AZ DB 클러스터와 연결된 사용자 지정 DB 클러스터 파라미터 그룹을 엽니다.
  2. Parameters 검색 필드에서 rds.logical_replication 정적 파라미터를 찾아 값을 1로 설정합니다. 이 파라미터 변경은 WAL 생성을 늘릴 수 있으므로, 논리 슬롯을 사용할 때만 활성화하세요.
  3. 이 변경의 일부로 다음 DB 클러스터 파라미터를 구성합니다.
    • max_wal_senders
    • max_replication_slots
    • max_connections
  4. 예상 사용량에 따라 다음 파라미터의 값을 변경해야 할 수도 있어요. 그러나 많은 경우 기본값으로 충분해요.
    • max_logical_replication_workers
    • max_sync_workers_per_subscription
  5. 파라미터 값이 적용되도록 Multi-AZ DB 클러스터를 재부팅합니다. 지침은 Amazon RDS용 Multi-AZ DB 클러스터 및 reader DB 인스턴스 재부팅을 참고하세요.
  6. 논리 복제 슬롯 사용에 설명된 대로 Multi-AZ DB 클러스터의 writer DB 인스턴스에 논리 복제 슬롯을 만듭니다. 이 과정에서는 디코딩 플러그인을 지정해야 해요. 현재 RDS for PostgreSQL은 PostgreSQL에 포함된 test_decoding, wal2json, pgoutput 플러그인을 지원해요.
    • 슬롯은 클러스터의 각 reader DB 인스턴스로 비동기 복사돼요.
  7. Multi-AZ DB 클러스터의 모든 reader DB 인스턴스에서 슬롯 상태를 확인합니다. 이렇게 하려면 모든 reader DB 인스턴스에서 pg_replication_slots 뷰를 검사하고, 애플리케이션이 논리 변경 사항을 적극적으로 소비하는 동안 confirmed_flush_lsn 상태가 진행되고 있는지 확인하세요.

다음 명령은 reader 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)
  1. 복제 작업을 완료한 후에는 복제 프로세스를 중지하고, 복제 슬롯을 삭제하고, 논리 복제를 끕니다. 논리 복제를 끄려면 DB 클러스터 파라미터 그룹을 수정하고 rds.logical_replication 값을 0으로 다시 설정합니다. 파라미터 변경이 적용되도록 클러스터를 재부팅합니다.

제한 사항 및 권장 사항

PostgreSQL 버전 16을 실행하는 Multi-AZ DB 클러스터에서 논리 복제를 사용할 때는 다음 제한 사항과 권장 사항이 적용돼요.

  • 논리 복제 슬롯을 만들거나 삭제할 때는 writer DB 인스턴스만 사용할 수 있어요. 예를 들어 CREATE SUBSCRIPTION 명령은 호스트 연결 문자열에서 클러스터 writer 엔드포인트를 사용해야 해요.
  • 테이블 동기화나 재동기화 중에는 클러스터 writer 엔드포인트를 사용해야 해요. 예를 들어 다음 명령으로 새로 추가된 테이블을 재동기화할 수 있어요.
Postgres=>ALTER SUBSCRIPTION subscription-name CONNECTION host=writer-endpoint
Postgres=>ALTER SUBSCRIPTION subscription-name REFRESH PUBLICATION
  • 테이블 동기화가 완료될 때까지 기다린 후 reader DB 인스턴스를 논리 복제에 사용해야 해요. pg_subscription_rel 카탈로그 테이블로 테이블 동기화를 모니터링할 수 있어요. srsubstate 열이 ready(r)로 설정되면 테이블 동기화가 완료된 것이에요.
  • 초기 테이블 동기화가 완료되면 논리 복제 연결에 인스턴스 엔드포인트를 사용할 것을 권장해요. 다음 명령은 복제를 reader DB 인스턴스 중 하나로 오프로드해 writer 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 확장을 사용할 때는 클러스터 writer 엔드포인트만 사용할 수 있어요. 이 확장에는 테이블 동기화 중 사용되지 않는 논리 복제 슬롯을 만들 수 있는 알려진 제한 사항이 있어요. 오래된 복제 슬롯은 WAL(write-ahead log) 파일을 보존해 디스크 공간 문제를 일으킬 수 있어요.

더 알아보기 (Learn more)