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

서로 다른 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 이상 버전
  • 복제 슬롯

  • Amazon S3 아카이브

  • 복제 슬롯

PostgreSQL 13 이하 버전
  • Amazon S3 아카이브

  • 복제 슬롯

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

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

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

max_wal_senders

max_wal_senders 파라미터는 스트리밍 복제 프로토콜을 통해 소스 DB 인스턴스가 동시에 지원할 수 있는 최대 연결 수를 지정합니다.

기본값은 다음과 같이 RDS for PostgreSQL 버전에 따라 다릅니다.

  • 버전 13, 14 및 15의 경우 기본값은 20입니다.

  • 버전 16 이상의 경우 기본값은 35입니다.

이 파라미터는 실제 읽기 전용 복제본 수보다 약간 더 높게 설정되어야 합니다. 이 파라미터를 읽기 전용 복제본의 수에 비해 너무 낮게 설정하면 복제가 중지됩니다.

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

참고

max_wal_senders는 변경 사항을 적용하려면 DB 인스턴스 재부팅이 필요한 정적 파라미터입니다.

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 재부팅을 방지하려면 각 복제본에 파라미터 변경 사항을 롤링 재부팅으로 적용하는 것이 좋습니다. 파라미터를 설정할 때 다음 규칙을 적용해야 합니다.

  • 파라미터 값 늘리기:

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

  • 파라미터 값 줄이기:

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