PostgreSQL 10 GA. 가장 기대했던 기능이 드디어 제대로 된 logical replication. 기존 9.x는 streaming replication (물리적 WAL) 뿐이라 테이블 단위 선택 복제가 안 됐음.
10부터는 publication / subscription 개념으로 테이블 단위로 구독 가능.
Publisher (source):
-- postgresql.conf
-- wal_level = logical
-- max_replication_slots = 4
-- max_wal_senders = 4
CREATE PUBLICATION my_pub FOR TABLE orders, order_items;
Subscriber (target):
-- 동일 스키마 먼저 CREATE TABLE
CREATE SUBSCRIPTION my_sub
CONNECTION 'host=db-master.internal dbname=app user=repl password=...'
PUBLICATION my_pub;
기본 동작: 구독 생성 시점에 initial data copy → 이후 변경사항 실시간 스트리밍.
쓰임새:
- 특정 테이블만 분석 DB로 스트리밍 — OLTP 부하 없이 DW 구축 가능
- 메이저 버전 업그레이드 시 다운타임 최소화. 기존 9.6 → 10 이관 시 physical replica는 버전 달라서 못 쓰는데 logical은 가능
- 멀티 테넌트 DB에서 특정 테넌트만 뽑아서 별도 DB로
제약:
- DDL은 복제 안됨. ALTER TABLE 하면 양쪽에 수동 적용해야 함
- TRUNCATE 도 10.0에선 복제 안됨 (11에서 개선 예정이라 함)
- sequence 값은 복제 안됨 — ID 충돌 주의. 구독 쪽에서 INSERT 금지 원칙
- 테이블 PK 있어야 UPDATE/DELETE 복제됨. 없으면 replica identity full 설정 필요 (느림)
간단 테스트 결과: 수초 이내 delay로 동기화. WAL 레벨이라 네트워크 비용은 row 기반보다 큼.
예전 pglogical 플러그인으로 비슷한거 했었는데, 이제 코어 기능이라 운영 부담이 확 줌. DW 파이프라인 개편 예정이고, 여기에 쓸 생각. 10.0은 갓 나와서 아직 prod 전환은 보수적으로 검토 중.