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 클러스터에 논리 복제를 설정하려면
- RDS for PostgreSQL Multi-AZ DB 클러스터와 연결된 사용자 지정 DB 클러스터 파라미터 그룹을 엽니다.
- Parameters 검색 필드에서
rds.logical_replication정적 파라미터를 찾아 값을1로 설정합니다. 이 파라미터 변경은 WAL 생성을 늘릴 수 있으므로, 논리 슬롯을 사용할 때만 활성화하세요. - 이 변경의 일부로 다음 DB 클러스터 파라미터를 구성합니다.
max_wal_sendersmax_replication_slotsmax_connections
- 예상 사용량에 따라 다음 파라미터의 값을 변경해야 할 수도 있어요. 그러나 많은 경우 기본값으로 충분해요.
max_logical_replication_workersmax_sync_workers_per_subscription
- 파라미터 값이 적용되도록 Multi-AZ DB 클러스터를 재부팅합니다. 지침은 Amazon RDS용 Multi-AZ DB 클러스터 및 reader DB 인스턴스 재부팅을 참고하세요.
- 논리 복제 슬롯 사용에 설명된 대로 Multi-AZ DB 클러스터의 writer DB 인스턴스에 논리 복제 슬롯을 만듭니다. 이 과정에서는 디코딩 플러그인을 지정해야 해요. 현재 RDS for PostgreSQL은 PostgreSQL에 포함된
test_decoding,wal2json,pgoutput플러그인을 지원해요.- 슬롯은 클러스터의 각 reader DB 인스턴스로 비동기 복사돼요.
- 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)
- 복제 작업을 완료한 후에는 복제 프로세스를 중지하고, 복제 슬롯을 삭제하고, 논리 복제를 끕니다. 논리 복제를 끄려면 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) 파일을 보존해 디스크 공간 문제를 일으킬 수 있어요.