IT study

[PostgreSQL] 논리 복제(1) - 단방향 복제 구성 본문

DATABASE/Postgresql

[PostgreSQL] 논리 복제(1) - 단방향 복제 구성

DBnA 2025. 12. 19. 11:03

 

 

논리복제 : WAL 파일의 내용을 분석해 DML 쿼리를 생성하여 전달. Logical decoding

Pg 버전이 달라도 복제를 수행할 있는 장점이 있다.

특성을 활용하여 메이저 버전 업그레이드시에 활용 가능

서비스별로 DB분리된 환경에서 배치 업무를 위한 필요 테이블만 한곳에 모아 작업 가능

 

ㅇ논리 복제 구성 절차

  1. 발생(Publication) 서버의 파라미터 설정 변경
  2. Publication 생성
  3. Publication 전용 유저 생성
  4. 구독(Subscription) 서버에 스키마 테이블 생성
  5. Subscription 생성

 

0. 테스트 환경 구성 

svcdb=# grant usage, create on schema svc to svc;
GRANT
svcdb=# set role svc;
SET
svcdb=> create table svc.t1 (c1 integer, c2 integer, constraint t1_pk primary key(c1));
CREATE TABLE
svcdb=> create table svc.t2 (c1 integer, c2 integer, constraint t2_pk primary key(c1));
CREATE TABLE
svcdb=> insert into svc.t1 select i,i from generate_series(1,10) i;
INSERT 0 10
svcdb=> insert into svc.t2 select i,i from generate_series(1,10) i;
INSERT 0 10

 

 

1. 발행 서버의 파라미터 설정 변경

Wal_level = logical

Max_wal_senders = 10

Max_replication_slots = 10

Logical_decoding_work_mem=64mb (클수록 좋긴하나, 물리 고려해서 가능한크게)

 

2. Publication 생성

슈퍼유저 권한 가진 postgres 유저로 수행

DB 전체 테이블, 특정 스키마 전체 테이블, 특정 테이블만 선택하여 범위 지정 가능

특정 조건 만족하는 레코드만 발행도 가능 .

svcdb=# set role postgres;
SET
svcdb=# create publication pub_svc_tbl for table svc.t1, svc.t2;
CREATE PUBLICATION

#확인
svcdb=# select pubname from pg_publication;
   pubname
-------------
 pub_svc_tbl
(1 row)

#publication에 포함된 테이블 목록 조회
svcdb=# select * from pg_publication_tables;
   pubname   | schemaname | tablename | attnames | rowfilter
-------------+------------+-----------+----------+-----------
 pub_svc_tbl | svc        | t1        | {c1,c2}  |
 pub_svc_tbl | svc        | t2        | {c1,c2}  |
(2 rows)

 

 

 

3. Publication 전용 유저 생성

발행 서버에 publication 전담 전용 유저 생성

svcdb=# create user lglrep with password 'reppass' replication;
CREATE ROLE
svcdb=# grant svc_rs to lglrep;
GRANT ROLE
  • 복제 작업 수행위해 replication 권한 부여, 해당 권한이 있어야 구독 요청시 walsender 프로세스 기동 가능
  • 해당 유저가 publication 대상 테이블을 조회할 있도록 권한 부여

(스키마내 모든 테이블 조회 가능한 role 부여하거나 특정 테이블만 부여)

 

 

 

** 논리복제의 경우 pg_hba.conf 파일에 replication 항목을 추가할 필요는 없다. 논리 복제가 특정 DB접속해서 복제를 수행하는 방식이기 때문이다.

 

4. 구독(subscription) 서버에 스키마 테이블 생성

(이전 물리복제때 내용도 포함되어있음)

svcdb=# grant usage, create on schema svc to svc;
GRANT
svcdb=# set role svc;
SET
svcdb=> create table svc.t1 (c1 integer, c2 integer, constraint t1_pk primary key(c1));
CREATE TABLE
svcdb=> create table svc.t2 (c1 integer, c2 integer, constraint t2_pk primary key(c1));
CREATE TABLE

 

5. Subscription 생성 

svcdb=# create subscription sub_svc_tbl connection 'host=172.17.0.2 port=5432 dbname = svcdb user=lglrep password=reppass' publication pub_svc_tbl;
NOTICE:  created replication slot "sub_svc_tbl" on publisher
CREATE SUBSCRIPTION

svcdb=# select subname from pg_subscription;
   subname
-------------
 sub_svc_tbl

svcdb=# select count(1) from svc.t1;
 count
-------
    10
(1 row)

 

논리복제는 replication 슬롯 기반으로 동작하므로,

발행서버에서 pg_replication_slots 뷰를 조회하면논리복제용 슬롯 확인 가능하다.

svcdb=> select slot_name, slot_type from pg_replication_slots;
  slot_name  | slot_type
-------------+-----------
 sub_svc_tbl | logical
(1 row)