Amazon RDS for PostgreSQL의 읽기 전용 복제본 작업 - Amazon Relational Database Service

Amazon RDS for PostgreSQL의 읽기 전용 복제본 작업

인스턴스에 읽기 복제본을 추가하여 Amazon RDS for PostgreSQL DB 인스턴스에 대한 읽기를 조정할 수 있습니다. 다른 Amazon RDS 데이터베이스 엔진과 마찬가지로 RDS for PostgreSQL은 PostgreSQL의 기본 복제 메커니즘을 사용하여 소스 DB에 대한 변경 사항이 반영되도록 읽기 복제본을 최신 상태로 유지합니다. 읽기 전용 복제본 및 Amazon RDS에 대한 일반적인 정보는 DB 인스턴스 읽기 전용 복제본 작업 섹션을 참조하세요.

다음으로, RDS for PostgreSQL에서의 읽기 전용 복제본 작업 관련 정보를 찾을 수 있습니다.

읽기 복제본의 논리적 디코딩

PostgreSQL용 RDS는 PostgreSQL 16.1을 사용하여 스탠바이 상태에서의 논리적 복제를 지원합니다. 이를 통해 읽기 전용 예비 복제본에서 논리적 디코딩을 생성하여 기본 DB 인스턴스의 부하를 줄일 수 있습니다. 여러 시스템에서 데이터를 동기화해야 하는 애플리케이션의 가용성을 높일 수 있습니다. 이 기능은 데이터 웨어하우스 및 데이터 분석의 성능을 향상합니다.

또한 지정된 예비 복제본의 복제 슬롯은 해당 예비 복제본을 기본 스탠바이로 계속 승격시킵니다. 즉, 기본 DB 인스턴스가 장애 조치 처리되거나 예비 복제본을 새 기본 인스턴스로 승격하는 경우 복제 슬롯은 유지되며 이전 예비 복제본 구독자는 영향을 받지 않습니다.

읽기 전용 복제본에 논리적 디코딩을 생성하려면
  1. 논리적 복제 활성화 - 예비 복제본에서 논리적 디코딩을 생성하려면 소스 DB 인스턴스와 물리적 복제본에서 논리적 복제를 활성화해야 합니다. 자세한 내용은 PostgreSQL을 사용한 읽기 전용 복제본 구성 단원을 참조하십시오.

    • 새로 만든 RDS for PostgreSQL DB 인스턴스의 논리적 복제를 활성화하려면 새 DB 사용자 지정 파라미터 그룹을 만들고 정적 파라미터 rds.logical_replication1로 설정합니다. 그런 다음 이 DB 파라미터 그룹을 소스 DB 인스턴스 및 물리적 읽기 복제본과 연결합니다. 자세한 내용은 DB 파라미터 그룹과 DB 인스턴스 연결 단원을 참조하십시오.

    • PostgreSQL DB 인스턴스용 기존 RDS의 논리적 복제를 활성화하려면 소스 DB 인스턴스의 DB 사용자 지정 파라미터 그룹과 물리적 읽기 복제본을 수정하여 정적 파라미터 rds.logical_replication1로 설정합니다. 자세한 내용은 DB 파라미터 그룹의 파라미터 수정 단원을 참조하십시오.

    참고

    이러한 파라미터 변경 사항을 적용하려면 DB 인스턴스를 재부팅해야만 합니다.

    다음 쿼리를 사용하여 소스 DB 인스턴스의 rds.logical_replication와 물리적 읽기 전용 복제본의 값과 wal_level 값을 확인할 수 있습니다.

    Postgres=>SELECT name,setting FROM pg_settings WHERE name IN ('wal_level','rds.logical_replication'); name | setting -------------------------+--------- rds.logical_replication | on wal_level | logical (2 rows)
  2. 소스 데이터베이스에 테이블 생성 - 소스 DB 인스턴스의 데이터베이스에 연결합니다. 자세한 내용은 PostgreSQL 데이터베이스 엔진을 실행하는 DB 인스턴스에 연결 단원을 참조하십시오.

    다음 쿼리를 사용하여 소스 데이터베이스에 테이블을 만들고 값을 삽입할 수 있습니다.

    Postgres=>CREATE TABLE LR_test (a int PRIMARY KEY); CREATE TABLE
    Postgres=>INSERT INTO LR_test VALUES (generate_series(1,10000)); INSERT 0 10000
  3. 소스 테이블에 대한 발행물 생성 - 다음 쿼리를 사용하여 소스 DB 인스턴스의 테이블에 대한 발행물을 만들 수 있습니다.

    Postgres=>CREATE PUBLICATION testpub FOR TABLE LR_test; CREATE PUBLICATION

    SELECT 쿼리를 사용하여 소스 DB 인스턴스와 물리적 읽기 복제본 인스턴스 모두에서 생성된 발행의 세부 정보를 확인할 수 있습니다.

    Postgres=>SELECT * from pg_publication; oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot -------+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ 16429 | testpub | 16413 | f | t | t | t | t | f (1 row)
  4. 논리적 복제 인스턴스에서 구독 생성 - RDS for PostgreSQL DB 인스턴스를 논리적 복제 인스턴스로 하나 더 생성합니다. 이 논리적 복제본 인스턴스가 물리적 읽기 복제본 인스턴스에 액세스할 수 있도록 VPC가 올바르게 설정되어 있는지 확인하세요. 자세한 내용은 Amazon VPC 및Amazon RDS 단원을 참조하십시오. 소스 DB 인스턴스가 유휴 상태인 경우 연결 문제가 발생할 수 있으며 기본 인스턴스는 데이터를 스탠바이 인스턴스로 전송하지 않습니다.

    Postgres=>CREATE SUBSCRIPTION testsub CONNECTION 'host=Physical replica host name port=port dbname=source_db_name user=user password=password PUBLICATION testpub; NOTICE: created replication slot "testsub" on publisher CREATE SUBSCRIPTION
    Postgres=>CREATE TABLE LR_test (a int PRIMARY KEY); CREATE TABLE

    SELECT 쿼리를 사용하여 논리적 복제본 인스턴스의 구독 세부 정보를 확인할 수 있습니다.

    Postgres=>SELECT oid,subname,subenabled,subslotname,subpublications FROM pg_subscription; oid | subname | subenabled | subslotname | subpublications -------+---------+------------+-------------+----------------- 16429 | testsub | t | testsub | {testpub} (1 row) postgres=> select count(*) from LR_test; count ------- 10000 (1 row)
  5. 논리적 복제 슬롯 상태 검사 - 소스 DB 인스턴스의 물리적 복제 슬롯만 볼 수 있습니다.

    Postgres=>select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn ---------------------------------------------+-----------+--------------------- rds_us_west_2_db_dhqfsmo5wbbjqrn3m6b6ivdhu4 | physical | (1 row)

    하지만 읽기 복제본 인스턴스에서는 애플리케이션이 논리적 변경을 적극적으로 소비함에 따라 논리적 복제 슬롯과 confirmed_flush_lsn 값이 변경되는 것을 확인할 수 있습니다.

    Postgres=>select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn -----------+-----------+--------------------- testsub | logical | 0/500002F0 (1 row)
    Postgres=>select slot_name, slot_type, confirmed_flush_lsn from pg_replication_slots; slot_name | slot_type | confirmed_flush_lsn -----------+-----------+--------------------- testsub | logical | 0/5413F5C0 (1 row)

PostgreSQL을 사용한 읽기 전용 복제본 제한

PostgreSQL 읽기 전용 복제본에 대한 제한 사항은 다음과 같습니다.

참고

PostgreSQL 버전 12 및 이전 버전을 실행하는 PostgreSQL 다중 AZ 및 단일 AZ DB 인스턴스용 RDS의 읽기 전용 복제본은 60~90일의 유지 관리 기간 동안 암호 교체를 적용하기 위해 자동으로 재부팅됩니다.

  • PostgreSQL 읽기 전용 복제본은 읽기 전용입니다. 읽기 전용 복제본은 쓰기 가능한 DB 인스턴스가 아니지만, 독립 실행형 RDS for PostgreSQL DB 인스턴스로 승격할 수 있습니다. 그러나 이 프로세스는 되돌릴 수 없습니다.

  • RDS for PostgreSQL DB 인스턴스에서 14.1 이전 버전의 PostgreSQL을 실행하는 경우에는 다른 읽기 전용 복제본에서 읽기 전용 복제본을 생성할 수 없습니다. RDS for PostgreSQL은 RDS for PostgreSQL 버전 14.1 이상 릴리스에서만 계단식 읽기 전용 복제를 지원합니다. 자세한 내용은 RDS for PostgreSQL에서의 계단식 읽기 전용 복제본 사용을 참조하세요.

  • PostgreSQL 읽기 전용 복제본을 승격하면 읽기 전용 복제본이 쓰기 가능한 DB 인스턴스가 됩니다. 소스 DB 인스턴스에서 미리 쓰기 로그(WAL) 파일 수신이 중단되며, 더 이상 읽기 전용 인스턴스가 아니게 됩니다. RDS for PostgreSQL DB 인스턴스와 마찬가지로 승격된 DB 인스턴스에서 새 읽기 전용 복제본을 생성할 수 있습니다. 자세한 내용은 읽기 전용 복제본을 독립 DB 인스턴스로 승격 단원을 참조하십시오.

  • 복제 체인(일련의 계단식 읽기 전용 복제본) 내에서 PostgreSQL 읽기 전용 복제본을 승격하면 기존의 다운스트림 읽기 전용 복제본은 승격된 인스턴스에서 자동으로 WAL 파일을 계속 수신합니다. 자세한 내용은 RDS for PostgreSQL에서의 계단식 읽기 전용 복제본 사용 단원을 참조하십시오.

  • 원본 DB 인스턴스에서 사용자 트랜잭션이 발생하지 않는 경우 PostgreSQL 읽기 전용 복제본은 최대 5분까지 복제 지연을 보고합니다. 복제 지연은 currentTime - lastCommitedTransactionTimestamp로 계산되며, 이는 처리 중인 트랜잭션이 없을 때 Write-Ahead Log(WAL) 세그먼트가 발생할 때까지 일정 기간 동안 복제 지연 값이 증가함을 의미합니다. 기본적으로 RDS for PostgreSQL는 WAL 세그먼트를 5분마다 전환하므로 트랜잭션 레코드가 생성되고 보고된 지연이 감소합니다.

  • RDS for PostgreSQL 14.1 이전 버전의 PostgreSQL 읽기 전용 복제본에 대해서는 자동 백업을 설정할 수 없습니다. 읽기 전용 복제본에 대한 자동 백업은 RDS for PostgreSQL 14.1 이상 버전에서만 지원됩니다. RDS for PostgreSQL 13 이전 버전의 경우 백업하려면 읽기 전용 복제본에서 스냅샷을 생성하면 됩니다.

  • 시점 복구(PITR)는 읽기 전용 복제본에 지원되지 않습니다. PITR은 읽기 전용 복제본을 제외한 프라이머리(라이터) 인스턴스에서만 사용할 수 있습니다. 자세한 내용은 DB 인스턴스를 지정된 시간으로 복원을 참조하십시오.

PostgreSQL을 사용한 읽기 전용 복제본 구성

RDS for PostgreSQL은 PostgreSQL의 기본 스트리밍 복제 기능을 사용하여 소스 DB 인스턴스의 읽기 전용 복제본을 생성합니다. 이 읽기 전용 복제본 DB 인스턴스는 비동기식으로 생성된 소스 DB 인스턴스의 물리적 복제본입니다. 이는 소스 DB 인스턴스와 읽기 전용 복제본 간에 미리 쓰기 로그(WAL) 데이터를 전송하는 특수 연결에 의해 생성됩니다. 자세한 내용은 PostgreSQL 설명서에서 스트리밍 복제를 참조하세요.

PostgreSQL은 소스 DB 인스턴스에서 이루어지는 대로 이 보안 연결에 대한 데이터베이스 변경 사항을 비동기식으로 스트리밍합니다. ssl 파라미터를 1로 설정하여 클라이언트 애플리케이션에서 소스 DB 인스턴스 또는 읽기 전용 복제본으로의 통신을 암호화할 수 있습니다. 자세한 내용은 PostgreSQL DB 인스턴스와 함께 SSL 사용을 참조하세요.

PostgreSQL은 복제 역할을 사용하여 스트리밍 복제를 실행합니다. 이 역할에는 권한이 부여되지만, 데이터까지 수정하지는 못합니다. PostgreSQL은 단일 프로세스를 통해 복제를 처리합니다.

소스 DB 인스턴스의 작업 또는 사용자에게 영향을 주지 않고 PostgreSQL 읽기 전용 복제본을 생성할 수 있습니다. Amazon RDS는 서비스에 영향을 미치지 않고 소스 DB 인스턴스와 읽기 전용 복제본에 필요한 파라미터와 권한을 설정합니다. 소스 DB 인스턴스의 스냅샷이 생성되고, 이 스냅샷이 읽기 전용 복제본을 생성하는 데 사용됩니다. 향후 언제든지 읽기 전용 복제본을 삭제해도 중단이 발생하지 않습니다.

동일 리전 내의 소스 DB 인스턴스 하나에서 최대 15개까지 읽기 전용 복제본을 생성할 수 있습니다. RDS for PostgreSQL 14.1부터는 소스 DB 인스턴스에서 체인(계단식)에 최대 3가지 수준의 읽기 전용 복제본을 생성할 수도 있습니다. 자세한 내용은 RDS for PostgreSQL에서의 계단식 읽기 전용 복제본 사용을 참조하세요. 모든 경우에 소스 DB 인스턴스에는 자동 백업이 구성되어야 합니다. 이 작업을 수행하려면 DB 인스턴스의 백업 보존 기간을 0이 아닌 값으로 설정하면 됩니다. 자세한 내용은 읽기 전용 복제본 생성을 참조하세요.

소스 DB 인스턴스와 동일한 AWS 리전에 RDS for PostgreSQL DB 인스턴스의 읽기 전용 복제본을 생성할 수 있습니다. 이를 리전 내 복제라고도 합니다. 소스 DB 인스턴스와 다른 AWS 리전에서 읽기 전용 복제본을 생성할 수도 있습니다. 이를 교차 리전 복제라고도 합니다. 교차 리전 읽기 전용 복제본 설정에 대한 자세한 내용은 다른 AWS 리전에서 읽기 전용 복제본 생성 섹션을 참조하세요. 리전 내 및 교차 리전에 대한 복제 프로세스를 지원하는 다양한 메커니즘은 서로 다른 RDS for PostgreSQL 버전에서 스트리밍 복제가 작동하는 방식에 설명된 대로 RDS for PostgreSQL 버전에 따라 약간 다릅니다.

효과적인 복제를 위해서는 읽기 전용 복제본도 각각 원본 DB 인스턴스와 동일한 양의 컴퓨팅 및 스토리지 리소스를 가져야 합니다. 소스 DB 인스턴스 크기를 조정하는 경우 읽기 전용 복제본 크기도 조정됩니다.

Amazon RDS는 파라미터가 읽기 전용 복제본의 시작을 방해하는 경우 읽기 전용 복제본의 호환되지 않는 파라미터를 재정의합니다. 예를 들어 max_connections 파라미터 값이 읽기 전용 복제본보다 원본 DB 인스턴스에서 더 크다고 가정하겠습니다. 이 경우 Amazon RDS가 원본 DB 인스턴스의 파라미터 값이 동일하도록 읽기 전용 복제본의 파라미터를 업데이트합니다.

RDS for PostgreSQL 읽기 전용 복제본은 소스 DB 인스턴스의 외부 데이터 래퍼(FDW)를 통해 사용 가능한 외부 데이터베이스에 액세스할 수 있습니다. 예를 들어 RDS for PostgreSQL DB 인스턴스에서 mysql_fdw 래퍼를 사용하여 RDS for MySQL의 데이터에 액세스한다고 가정해봅니다. 이 경우 읽기 전용 복제본도 해당 데이터에 액세스할 수 있습니다. 기타 지원되는 FDW는 oracle_fdw, postgres_fdw, tds_fdw입니다. 자세한 내용은 Amazon RDS for PostgreSQL용 지원되는 외부 데이터 래퍼 작업을 참조하세요.

다중 AZ 구성을 통한 RDS for PostgreSQL 읽기 전용 복제본 사용

단일 AZ 또는 다중 AZ DB 인스턴스를 통해 읽기 전용 복제본을 생성할 수 있습니다. 다중 AZ 배포는 대기 복제본을 통해 중요 데이터의 내구성과 가용성을 개선하는 데 사용할 수 있습니다. 대기 본제본은 소스 DB가 장애 조치될 경우 워크로드를 가정할 수 있는 전담 읽기 전용 복제본입니다. 대기 복제본을 사용하여 읽기 트래픽을 처리할 수 없습니다. 단, 트래픽이 많은 다중 AZ DB 인스턴스에서 읽기 전용 쿼리를 오프로드할 목적으로 읽기 전용 복제본을 생성할 수는 있습니다. 다중 AZ 배포에 대한 자세한 내용은 다중 AZ DB 인스턴스 배포 섹션을 참조하세요.

다중 AZ 배포의 소스 DB 인스턴스가 대기로 장애 조치되는 경우 연결된 읽기 전용 복제본이 전환되어 대기(이제는 프라이머리)를 복제 소스로 사용합니다. RDS for PostgreSQL 버전에 따라 다음과 같이 읽기 전용 복제본을 다시 시작해야 할 수 있습니다.

  • PostgreSQL 13 이상 버전 - 재시작이 필요하지 않습니다. 읽기 전용 복제본이 새 프라이머리 복제본과 자동으로 동기화됩니다. 그러나 경우에 따라 클라이언트 애플리케이션이 읽기 전용 복제본에 대한 도메인 이름 서비스(DNS) 세부 정보를 캐시할 수 있습니다. 이 경우에는 Time-to-Live(TTL) 값을 30초 미만으로 설정합니다. 이렇게 하면 읽기 전용 복제본이 오래된 IP 주소를 보유하지 못하게 되므로 새 프라이머리 복제본과 동기화되지 않습니다. 이 방법과 기타 모범 사례에 대해 자세히 알아보려면 Amazon RDS 기본 운영 지침 섹션을 참조하세요.

  • PostgreSQL 12 및 모든 이전 버전 - 대기 복제본(현재 프라이머리)의 IP 주소와 인스턴스 이름이 다르기 때문에 대기 복제본으로 장애 조치 후 읽기 전용 복제본이 자동으로 다시 시작됩니다. 다시 시작하면 읽기 전용 복제본이 새 프라이머리 복제본과 동기화됩니다.

장애 조치에 대해 자세히 알아보려면 Amazon RDS 장애 조치 프로세스 섹션을 참조하세요. 다중 AZ 배포에서 읽기 전용 복제본이 작동하는 방식에 대한 자세한 내용은 DB 인스턴스 읽기 전용 복제본 작업 섹션을 참조하세요.

읽기 전용 복제본이 장애 조치를 지원하도록 하려면 Amazon RDS가 다른 가용 영역에 복제본의 대기 복제본을 만들 수 있게 읽기 전용 복제본을 다중 AZ DB 인스턴스로 생성하면 됩니다. 읽기 전용 복제본을 다중 AZ DB 인스턴스로 생성하는 작업은 원본 데이터베이스가 다중 AZ DB 인스턴스인지 여부와는 무관합니다.

RDS for PostgreSQL에서의 계단식 읽기 전용 복제본 사용

버전 14.1부터 RDS for PostgreSQL에서 계단식 읽기 전용 복제본을 지원합니다. 계단식 읽기 전용 복제본을 사용하면 소스 RDS for PostgreSQL DB 인스턴스에 오버헤드를 추가하지 않고도 읽기 전용 복제본 크기를 조정할 수 있습니다. 소스 DB 인스턴스에서는 WAL 로그에 업데이트된 내용을 각 읽기 전용 복제본으로 전송하지 않습니다. 대신 각 계단식 읽기 전용 복제본에서 WAL 로그 업데이트를 함께 구성된 다음 읽기 전용 복제본으로 보냅니다. 이렇게 하면 소스 DB 인스턴스에 가해지는 부담이 줄어듭니다.

계단식 읽기 전용 복제본을 사용하면 RDS for PostgreSQL DB 인스턴스가 WAL 데이터를 체인의 첫 번째 읽기 전용 복제본으로 전송합니다. 뒤이어 해당 읽기 전용 복제본이 WAL 데이터를 체인의 두 번째 복제본으로 전송하는 식으로 이루어집니다. 결과적으로 체인의 모든 읽기 전용 복제본이 소스 DB 인스턴스에만 오버헤드가 발생하는 일 없이 RDS for PostgreSQL DB 인스턴스에서 변경됩니다.

소스 RDS for PostgreSQL DB 인스턴스에서 체인에 최대 3개의 읽기 전용 복제본을 생성할 수 있습니다. 예를 들어 RDS for PostgreSQL 14.1 DB 인스턴스, rpg-db-main이 있다고 가정해봅니다. 다음을 수행할 수 있습니다.

  • rpg-db-main부터 시작해서 체인에 첫 번째 읽기 전용 복제본 read-replica-1을 생성합니다.

  • 다음으로 read-replica-1에서 체인에 다음 읽기 전용 복제본 read-replica-2를 생성합니다.

  • 마지막으로 read-replica-2에서 체인에 세 번째 읽기 전용 복제본 read-replica-3을 생성합니다.

체인에서 rpg-db-main에 대한 세 번째 계단식 읽기 전용 복제본 다음으로 또 다른 읽기 전용 복제본을 생성할 수 없습니다. RDS for PostgreSQL 소스 DB 인스턴스부터 계단식 읽기 전용 복제본 체인의 마지막에 이르는 전체 인스턴스는 최대 4개의 DB 인스턴스로 구성될 수 있습니다.

읽기 전용 복제본을 계단식으로 실행하려면 RDS for PostgreSQL에서 자동 백업을 설정합니다. 먼저 읽기 전용 복제본을 생성한 다음 RDS for PostgreSQL DB 인스턴스에서 자동 백업을 켜면 됩니다. 이 프로세스는 다른 Amazon RDS DB 엔진에서와 동일합니다. 자세한 내용은 읽기 전용 복제본 생성을 참조하세요.

모든 읽기 전용 복제본과 마찬가지로 계단식 구성에 포함된 읽기 전용 복제본을 승격할 수 있습니다. 읽기 전용 복제본 체인의 한 읽기 전용 복제본을 승격하면 체인에서 해당 복제본이 제거됩니다. 예를 들어 rpg-db-main DB 인스턴스의 일부 워크로드를 회계 부서에서만 사용할 수 있도록 새 인스턴스로 옮기려고 합니다. 이 예제에서 3개의 읽기 전용 복제본 체인이 있다고 가정하고 read-replica-2를 승격하기로 결정합니다. 체인은 다음과 같이 변화합니다.

  • read-replica-2를 승격하면 복제 체인에서 제거됩니다.

    • 이제 전체 읽기/쓰기 DB 인스턴스가 됩니다.

    • 승격 전과 마찬가지로 read-replica-3으로 계속 복제합니다.

  • rpg-db-mainread-replica-1로 계속 복제를 진행합니다.

읽기 전용 복제본 승격에 대한 자세한 내용은 읽기 전용 복제본을 독립 DB 인스턴스로 승격 섹션을 참조하세요.

참고

계단식 읽기 전용 복제본의 경우 RDS for PostgreSQL은 첫 번째 복제 수준에서 각 소스 DB 인스턴스에 대해 15개의 읽기 전용 복제본을 지원하고, 두 번째 및 세 번째 복제 수준에서 각 소스 DB 인스턴스에 대해 5개의 읽기 전용 복제본을 지원합니다.

서로 다른 RDS for PostgreSQL 버전에서 스트리밍 복제가 작동하는 방식

PostgreSQL을 사용한 읽기 전용 복제본 구성에서 설명한 바와 같이, RDS for PostgreSQL은 PostgreSQL의 기본 스트리밍 복제 프로토콜을 사용하여 소스 DB 인스턴스에서 WAL 데이터를 전송합니다. 소스 WAL 데이터를 리전 내 읽기 전용 복제본과 교차 리전 읽기 전용 복제본으로 전송합니다. 버전 9.4에서는 PostgreSQL에 복제 프로세스를 위한 지원 메커니즘으로 물리적 복제 슬롯이 도입되었습니다.

물리적 복제 슬롯은 소스 DB 인스턴스가 모든 읽기 전용 복제본에서 WAL 데이터를 사용하기 전에 WAL 데이터를 제거하지 못하도록 합니다. 각 읽기 전용 복제본은 소스 DB 인스턴스에 자체 물리적 슬롯이 있습니다. 슬롯은 복제본에 필요할 수 있는 가장 오래된 WAL(논리 시퀀스 번호(LSN)별)을 추적합니다. 모든 슬롯과 DB 연결이 지정된 WAL(LSN) 이상으로 진행된 후에는 해당 LSN이 다음 체크포인트에서 제거할 수 있는 후보가 됩니다.

Amazon RDS는 Amazon S3를 사용하여 WAL 데이터를 아카이브합니다. 리전 내 읽기 전용 복제본의 경우 필요하다면 아카이브된 데이터를 사용하여 읽기 전용 복제본을 복구할 수 있습니다. 소스 DB와 읽기 전용 복제본 간의 연결이 어떤 이유로든 중단되는 경우에 복구가 필요할 수 있습니다.

다음 테이블에서는 PostgreSQL 버전과 RDS for PostgreSQL에서 사용하는 리전 내 및 교차 리전에 대한 지원 메커니즘 간의 차이점을 간략히 확인할 수 있습니다.

리전 내 교차 리전
PostgreSQL 14.1 and higher versions
  • 복제 슬롯

  • Amazon S3 아카이브

  • 복제 슬롯

PostgreSQL 13 and lower versions
  • Amazon S3 아카이브

  • 복제 슬롯

자세한 내용은 복제 프로세스 모니터링 및 튜닝을 참조하세요.

PostgreSQL 복제를 제어하는 파라미터 이해

다음 파라미터는 복제 프로세스에 영향을 미치며, 읽기 전용 복제본이 소스 DB 인스턴스의 최신 상태를 유지하는 정도를 결정합니다.

max_wal_senders

max_wal_senders 파라미터는 스트리밍 복제 프로토콜을 통해 소스 DB 인스턴스가 동시에 지원할 수 있는 최대 연결 수를 지정합니다. RDS for PostgreSQL 13 이상 릴리스의 경우 기본값은 20입니다. 이 파라미터는 실제 읽기 전용 복제본 수보다 약간 더 높게 설정되어야 합니다. 이 파라미터를 읽기 전용 복제본의 수에 비해 너무 낮게 설정하면 복제가 중지됩니다.

자세한 내용은 PostgreSQL 설명서에서 max_wal_senders 섹션을 참조하세요.

wal_keep_segments

wal_keep_segments 파라미터는 소스 DB 인스턴스에서 pg_wal 디렉터리에 보관하는 미리 쓰기 로그(WAL) 파일의 수를 지정합니다. 기본 설정은 32입니다.

wal_keep_segments가 배포에 대해 충분히 큰 값으로 설정되지 않으면 읽기 전용 복제본이 따라잡지 못하면서 스트리밍 복제가 중지될 수 있습니다. 이 경우에는 Amazon RDS가 복제 오류를 생성하고 읽기 전용 복제본의 복구를 시작합니다. 이렇게 하려면 Amazon S3에서 소스 DB 인스턴스의 아카이브된 WAL 데이터를 재실행하면 됩니다. 이 복구 프로세스는 읽기 전용 복제본이 스트리밍 복제를 이어갈 만큼 충분히 따라잡을 때까지 계속됩니다. 예: 복제 중단에서 읽기 전용 복제본을 복구하는 방법에서 이 프로세스가 PostgreSQL 로그에서 캡처된 대로 실행 중임을 확인할 수 있습니다.

참고

PostgreSQL 버전 13에서 wal_keep_segments 파라미터 이름은 wal_keep_size입니다. wal_keep_segments와 동일한 목적을 수행하지만, 기본값은 파일 수가 아닌 메가바이트(MB)(2,048MB)입니다. 자세한 내용은 PostgreSQL 설명서에서 wal_keep_segmentswal_keep_size를 참조하세요.

max_slot_wal_keep_size

max_slot_wal_keep_size 파라미터는 RDS for PostgreSQL DB 인스턴스가 슬롯을 제공하기 위해 pg_wal 디렉터리에 유지하는 WAL 데이터의 양을 제어합니다. 이 파라미터는 복제 슬롯을 사용하는 구성에 사용됩니다. 이 파라미터의 기본값은 -1입니다. 즉, 소스 DB 인스턴스에 보관되는 WAL 데이터의 양에는 제한이 없습니다. 복제 슬롯 모니터링에 대한 자세한 내용은 RDS for PostgreSQL DB 인스턴스에 대한 복제 슬롯 모니터링 섹션을 참조하세요.

이 파라미터에 대한 자세한 내용은 PostgreSQL 설명서에서 max_slot_wal_keep_size를 참조하세요.

읽기 전용 복제본에 WAL 데이터를 제공하는 스트림이 중단될 때마다 PostgreSQL은 복구 모드로 전환됩니다. Amazon S3의 아카이브된 WAL 데이터를 사용하거나 복제 슬롯과 연결된 WAL 데이터를 사용하여 읽기 전용 복제본을 복원합니다. 프로세스가 완료되면 PostgreSQL이 스트리밍 복제를 다시 구성합니다.

예: 복제 중단에서 읽기 전용 복제본을 복구하는 방법

다음 예제에서는 읽기 전용 복제본에 대한 복구 프로세스를 보여 주는 로그 세부 정보를 찾아볼 수 있습니다. 이 예제는 소스 DB와 같은 AWS 리전에서 PostgreSQL 버전 12.9를 실행하는 RDS for PostgreSQL DB 인스턴스에서 비롯되었으므로, 복제 슬롯이 사용되지 않습니다. 복구 프로세스는 리전 내 읽기 전용 복제본이 있는 14.1 이전 버전의 PostgreSQL을 실행하는 다른 RDS for PostgreSQL DB 인스턴스와 동일합니다.

읽기 전용 복제본과 소스 DB 인스턴스의 연결이 끊어졌을 때 Amazon RDS는 ERROR: requested WAL segment ... has already been removed와 함께 FATAL: could not receive data from WAL stream 메시지로 로그에 문제를 기록합니다. 굵은 줄에 나와 있는 것처럼 Amazon RDS는 아카이브된 WAL 파일을 재생하여 복제본을 복구합니다.

2014-11-07 19:01:10 UTC::@:[23180]:DEBUG:  switched WAL source from archive to stream after failure 2014-11-07 19:01:10 UTC::@:[11575]:LOG: started streaming WAL from primary at 1A/D3000000 on timeline 1 2014-11-07 19:01:10 UTC::@:[11575]:FATAL: could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000001A000000D3 has already been removed 2014-11-07 19:01:10 UTC::@:[23180]:DEBUG: could not restore file "00000002.history" from archive: return code 0 2014-11-07 19:01:15 UTC::@:[23180]:DEBUG: switched WAL source from stream to archive after failure recovering 000000010000001A000000D3 2014-11-07 19:01:16 UTC::@:[23180]:LOG:  restored log file "000000010000001A000000D3" from archive

Amazon RDS가 복제본에서 아카이빙된 WAL 데이터를 따라잡을 수 있을 만큼 충분히 재생하면 읽기 전용 복제본으로의 스트리밍이 다시 시작됩니다. Amazon RDS는 스트리밍이 재개돠면 다음과 유사한 로그 파일에 항목을 씁니다.

2014-11-07 19:41:36 UTC::@:[24714]:LOG:started streaming WAL from primary at 1B/B6000000 on timeline 1

공유 메모리를 제어하는 파라미터 설정

설정한 파라미터에 따라 트랜잭션 ID, 잠금 및 준비된 트랜잭션을 추적하기 위한 공유 메모리 크기가 결정됩니다. 대기 인스턴스의 공유 메모리 구조는 기본 인스턴스의 공유 메모리 구조와 같거나 커야 합니다. 이렇게 하면 복구 중에 전자의 공유 메모리가 부족해지는 경우를 방지할 수 있습니다. 복제본의 파라미터 값이 기본 복제본의 파라미터 값보다 작으면 Amazon RDS에서는 자동으로 복제본 파라미터를 조정하고 엔진을 다시 시작합니다.

영향을 받는 파라미터는 다음과 같습니다.

  • max_connections

  • max_worker_processes

  • max_wal_senders

  • max_prepared_transactions

  • max_locks_per_transaction

메모리 부족으로 인한 복제본의 RDS 재부팅을 방지하려면 각 복제본에 파라미터 변경 사항을 롤링 재부팅으로 적용하는 것이 좋습니다. 파라미터를 설정할 때 다음 규칙을 적용해야 합니다.

  • 파라미터 값 늘리기:

    • 항상 먼저 모든 읽기 전용 복제본의 파라미터 값을 늘리고 모든 복제본을 롤링 재부팅해야 합니다. 그런 다음 기본 인스턴스에 파라미터 변경 사항을 적용하고 재부팅합니다.

  • 파라미터 값 줄이기:

    • 먼저 기본 인스턴스의 파라미터 값을 줄이고 재부팅을 수행해야 합니다. 그런 다음 모든 관련 읽기 전용 복제본에 파라미터 변경 사항을 적용하고 롤링 재부팅해야 합니다.

복제 프로세스 모니터링 및 튜닝

RDS for PostgreSQL DB 인스턴스와 읽기 전용 복제본을 정기적으로 모니터링하는 것이 좋습니다. 읽기 전용 복제본이 소스 DB 인스턴스의 변경 사항을 따르도록 해야 합니다. Amazon RDS는 복제 프로세스가 중단될 때 읽기 전용 복제본을 명료하게 복구합니다. 그러나 복구할 필요가 아예 없도록 하는 것이 가장 좋습니다. 복제 슬롯을 사용하여 복구하는 것이 Amazon S3 아카이브를 사용하는 것보다 빠르지만, 복구 프로세스는 읽기 성능에 영향을 줄 수 있습니다.

다음을 수행하여 읽기 전용 복제본이 소스 DB 인스턴스를 얼마나 잘 따라잡는지 확인할 수 있습니다.

  • 소스 DB 인스턴스와 복제본 간 ReplicaLag의 양을 확인합니다 복제본 지연은 읽기 전용 복제본이 소스 DB 인스턴스보다 지연되는 시간(초)입니다. 이 지표는 다음 쿼리 결과를 보고합니다.

    SELECT extract(epoch from now() - pg_last_xact_replay_timestamp()) AS "ReplicaLag";

    복제본 지연은 읽기 전용 복제본이 소스 DB 인스턴스를 얼마나 잘 따라잡는지 나타냅니다. 이는 소스 DB 인스턴스와 특정 읽기 전용 인스턴스 간의 지연 시간입니다. 복제본 지연 값이 높으면 소스 DB 인스턴스와 해당 읽기 전용 복제본이 사용하는 DB 인스턴스 클래스나 스토리지 유형(또는 둘 다) 간에 불일치가 있다는 의미일 수 있습니다. DB 소스 인스턴스와 모든 읽기 전용 복제본의 DB 인스턴스 클래스 및 스토리지 유형은 동일해야 합니다.

    복제본 지연은 간헐적인 연결 문제의 결과로 나타날 수도 있습니다. Amazon CloudWatch에서 Amazon RDS ReplicaLag 지표를 보고 복제 지연을 모니터링할 수 있습니다. Amazon RDS의 ReplicaLag 및 기타 지표에 대한 자세한 내용은 Amazon RDS에 대한 Amazon CloudWatch 지표 섹션을 참조하세요.

  • 설정을 조절하는 데 사용할 수 있는 정보는 PostgreSQL 로그를 확인하세요. 모든 체크포인트에서 PostgreSQL 로그는 다음 예제와 같이 재사용된 트랜잭션 로그 파일 수를 캡처합니다.

    2014-11-07 19:59:35 UTC::@:[26820]:LOG:  checkpoint complete: wrote 376 buffers (0.2%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=35.681 s, sync=0.013 s, total=35.703 s; sync files=10, longest=0.013 s, average=0.001 s

    이 정보를 사용하여 지정된 기간 동안 얼마나 많은 트랜잭션 파일이 재사용되는지 파악할 수 있습니다. 필요할 경우 wal_keep_segments 설정을 변경할 수 있습니다. 예를 들어 checkpoint complete 시 PostgreSQL 로그에 5분 간격으로 35 recycled가 표시된다고 가정합니다. 이 경우 wal_keep_segments 기본값인 32는 스트리밍 활동에 보조를 맞추기에 충분하지 않으므로 이 파라미터의 값을 높여야 합니다.

  • Amazon CloudWatch를 사용하여 복제 문제를 예측할 수 있는 지표를 모니터링합니다. PostgreSQL 로그를 직접 분석하는 대신 Amazon CloudWatch를 사용하여 수집된 지표를 확인할 수 있습니다. 예를 들어 TransactionLogsGeneration 지표의 값을 확인하여 소스 DB 인스턴스에서 얼마나 많은 WAL 데이터를 생성 중인지 확인 가능합니다. DB 인스턴스의 워크로드로 인해 많은 양의 WAL 데이터가 생성되는 경우가 있습니다. 그렇다면 소스 DB 인스턴스와 읽기 전용 복제본의 DB 인스턴스 클래스를 변경해야 할 수 있습니다. 네트워크 성능이 높은(10Gbps) 인스턴스 클래스를 사용하면 복제본 지연이 줄어들 수 있습니다.

RDS for PostgreSQL DB 인스턴스에 대한 복제 슬롯 모니터링

모든 RDS for PostgreSQL 버전은 교차 리전 읽기 전용 복제본의 복제 슬롯을 사용합니다. RDS for PostgreSQL 14.1 이상 버전은 리전 내 읽기 전용 복제본의 복제 슬롯을 사용합니다. 또한 리전 내 읽기 전용 복제본은 Amazon S3를 사용하여 WAL 데이터를 아카이브합니다. 즉, DB 인스턴스와 읽기 전용 복제본이 PostgreSQL 14.1 이상을 실행하는 경우 복제 슬롯과 Amazon S3 아카이브를 모두 사용하여 읽기 전용 복제본을 복구할 수 있습니다. 복제 슬롯을 사용하여 읽기 전용 복제본을 복구하는 것이 Amazon S3 아카이브에서 복구하는 것보다 빠릅니다. 따라서 복제 슬롯 및 관련 지표를 모니터링하는 것이 좋습니다.

다음과 같이 pg_replication_slots 보기를 쿼리하여 RDS for PostgreSQL DB 인스턴스의 복제 슬롯을 볼 수 있습니다.

postgres=> SELECT * FROM pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size | two_phase ---------------------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+---------------+----------- rds_us_west_1_db_555555555 | | physical | | | f | t | 13194 | | | 23/D8000060 | | reserved | | f (1 row)

reserved 값의 wal_status는 슬롯이 보유한 WAL 데이터의 양이 max_wal_size 파라미터의 범위 안에 있음을 나타냅니다. 즉, 복제 슬롯의 크기가 적절하다는 뜻입니다. 지원되는 다른 상태 값은 다음과 같습니다.

  • extended - 슬롯이 max_wal_size 설정을 초과하지만, WAL 데이터는 유지됩니다.

  • unreserved - 슬롯에 더 이상 어떤 필수 WAL 데이터도 없습니다. 이중 일부는 다음 체크포인트에서 제거됩니다.

  • lost - 일부 필수 WAL 데이터가 제거되었습니다. 슬롯을 더 이상 사용할 수 없습니다.

wal_statusunreservedlost 상태는 max_slot_wal_keep_size가 음수가 아닌 경우에만 표시됩니다.

pg_replication_slots 보기에는 복제 슬롯의 현재 상태가 표시됩니다. Amazon CloudWatch를 통해 다음 지표를 모니터링하여 복제 슬롯의 성능을 평가할 수 있습니다.

  • OldestReplicationSlotLag - 지연 시간이 가장 긴 슬롯, 즉 프라이머리에 비해 가장 뒤처진 슬롯을 나열합니다. 이 지연은 읽기 전용 복제본뿐만 아니라 연결에도 관련될 수 있습니다.

  • TransactionLogsDiskUsage - WAL 데이터에 얼마나 많은 스토리지가 사용되고 있는지 보여줍니다. 읽기 전용 복제본이 크게 지연되면 이 지표의 값이 크게 증가할 수 있습니다.

Amazon CloudWatch와 RDS for PostgreSQL에 대한 해당 지표 사용에 대해 자세히 알아보려면 Amazon CloudWatch로 Amazon RDS 지표 모니터링 섹션을 참조하세요. RDS for PostgreSQL DB 인스턴스의 스트리밍 복제 모니터링에 대한 자세한 내용은 AWS 데이터베이스 블로그에서 Amazon RDS PostgreSQL 복제의 모범 사례를 참조하세요.