이번 문서에서는 PostgreSQL 16 Release New Feature 중 Replication에 대한 내용을 다룹니다.
Logical Replication From Standby Server
PostgreSQL 15 버전까지는 Primary Server에서만 Logical Replication의 게시(Publication)을 구성할 수 있었습니다. Replication이 다중으로 구성되어 있다면 그 만큼 Primary Server의 부하도 증가합니다.

PostgreSQL 16 버전부터는 Standby Server에서 게시(Publication)을 구성할 수 있습니다. 이 기능을 통해 Primary Server의 Replication 부하를 감소 시킬 수 있습니다.
📢 Primary →
Physical Replication → Standby → Logical Replication → Standby 구성은 PostgreSQL 16 버전부터 구성 가능합니다.
📢 Primary →
Logical Replication → Standby → Logical Replication → Standby 구성은 PostgreSQL 16 버전 이하에서도 구성 가능합니다.
📢 설명의 용이성을 위하여 Primary, Standby, Slave로 서버 구분을 하였습니다.
Standby Server에 Logical Replication 구성
PostgreSQL 16 버전부터는 Standby Server에서 Logical Replication 구성이 가능 합니다. 이러한 구성을 위해서는 Primary Server는
wal_level = logical로 설정 되어 있어야 합니다.Primary Server Replication 설정
📢 Standby Server Read-Only로 DDL 수행이 불가 하기 때문에 Primary Server에서 Logical Replication Role과 게시(Publication)을 생성합니다. 생성된 Role과 게시(Publication)는 Streaming Replication을 통해 Standby Server에 적용됩니다.
Standby Server Physical Replication 구성 및 Logical Replication 구성
Slave Server Logical Replication 구성
PostgreSQL 15 버전에서는 Slave Server에 구독(Subscription) 생성이 불가능 합니다.
PostgreSQL 16 버전부터는 Slave Server에 구독(Subscription) 생성이 가능합니다.
📢 pg_log_standby_snapshot() Function
bgwriter나 Checkpointer가 WAL에 기록을 기다릴 필요 없이 실행 중인 트랜잭션의 Snapshot을 찍어 WAL에 기록합니다. 즉, Logical Replication Slot 생성 속도를 높이기 위해 이 함수를 사용할 수 있습니다.
Logical Replication Parallel
PostgreSQL 16 버전에서 Parallel Apply Worker에 의한 Logical Replication이 가능합니다. 구독(Subscription) 생성 시
streming = parallel 옵션이 추가 되었습니다. 이로 인해 pg_subscription Catalog의 컬럼의 변화도 있습니다.구분 | Column | Description |
수정 | substream | Data Type이 boolean → char로 변경f : 진행중인 트랜잭션의 Streming을 허용하지 않음t : 진행중인 트랜잭션의 Streming을 허용p : 사용 가능한 경우 Parallel Apply Worker를 통해 직접 변경사항 적용(사용 가능한 Parallel Apply Worker가 없는 경우 t와 동일) |
추가 | subpasswordrequired | 인증을 위한 비밀번호 필요 여부 |
추가 | subrunasowner | Subscription Owner의 권한으로 Subscription 사용 여부 |
추가 | suborigin | none : Local에서만 생성된 데이터 전송any : Local + Replication으로 생성된 데이터 전송 |
양방향 Logical Replication
PostgreSQL 16 버전 부터 양방향 Logical Replication이 가능합니다. 즉, Node 1은 Node 2에서 변경된 내용을 수신하여 적용하고 Node 1에서 변경된 내용을 Node 2로 전송하여 적용 시킬 수 있습니다. 반대로 Node 2는 Node 1에서 변경된 내용을 수신하여 적용하고 Node 2에서 변경된 내용을 Node 1으로 전송하여 적용 시킬 수 있습니다. 양방향 Logical Replication을 통해 두 Node 중 하나에서 수행된 모든 수정 사항을 두 Node 모두에 미러링되어 동기화 할 수 있습니다.

PostgreSQL 15 버전 까지는 이 기능을 지원하지 않기 때문에 Apply Worker는 데이터가 Local에서 생성되었는지 Replication을 통해 생성되었는지 알지 못합니다. 따라서 아래와 같은 무한 루프 상태가 됩니다.
- Node 1에서 변경된 내용을 Node2로 전송 → Node2 데이터 적용
- Node 2에서 변경된 내용을 Node1으로 전송 → Node1 데이터 적용
- 1 → 2 → 1 → 2 → 1 → 2 → ... 무한 루프 발생

PostgreSQL 16에서 Subscription 생성 Syntax에
origin 파라미터가 도입되어 Apply Worker는 데이터가 Local에서 생성되었는지 Replication을 통해 생성되었는지 알 수 있게 되어 무한 루프 상태가 발생하지 않습니다.origin 파라미터는 두 개의 값을 지원합니다.
none: Local에서만 생성된 데이터만 전송하도록 요청 (무한 루프 방지)
any: Local + Replication으로 생성된 데이터 전송 (무한 루프 발생)
양방향 Logical Replication Test
Node 1 : Logical Replication 설정 후 재기동
Node 2 : Logical Replication 설정 후 재기동
Node 1 : Subscription 설정
Node 2 : Subscription 설정
양방향 Logical Replication 확인
📢 PostgreSQL 15에서는 무한 루프가 발생합니다.
PostgreSQL 15 양방향 Logical Replication 확인
WAL Sender 프로세스 이름 변경
PostgreSQL 16 버전 부터 WAL Sender 프로세스의 이름이 변경되었습니다. 기존에는 Logical Replication에 대한 정보만 표시 되었지만, dbname이 추가되어 표시됩니다.
함께 보면 좋은 아티클
