본문 바로가기
PostgreSQL

PostgreSQL14 논리적 복제 | Logical Replication

by 울라불라오미짱 2023. 6. 8.
반응형

PostgreSQL의 고가용성을 높이기 위한 방법 중에 하나인 Logical replication에 대해 알아보자!

Logical Replication 이란?

ID(보통 기본 키(primary key))를 기반으로 데이터 오브젝트 및 해당 변경 내용을 복제하는 방법입니다.

Logical Replication의 특징

  • N:N의 subscribers(구독자)와 publisher(게시자) 모델을 사용합니다.
  • 테이블 단위로 publisher 데이터의 스냅샷을 만들어 subscriber 의 데이터베이스에 복제합니다.
  • publisher의 wal sender를 통해 logical message가 subscriber에 전달되고, logical replication launcher가 생성하는 logical replication worker를 통해 변경 사항을 반영합니다.

Logical Replication 구축

  1. 우선 publisher 와 subscribaer 서버로 각각 설정할 서버 2개가 필요합니다!
  2. 그리고 두 개의 서버가 다 PostgreSQL이 설치된 상태여야 합니다! 둘 다 initdb 커맨드를 실행하여 데이터베이스 클러스터를 생성한 상태에서 진행해보도록 하겠습니다!
  publish  subscribe
IP 192.168.40.133 192.168.40.134

publish 서버 구성

  • wal_level 파라미터 수정

Logical Replication 을 사용하기 위해서는 wal_level 파라미터가 logical 이어야합니다.

wal_level = logical
  • 소스 데이터베이스 및 테이블을 생성
postgres=# CREATE DATABASE logical;
\\c logical
logical=> CREATE TABLE test_table(x int primary key, y int);
  • 유저 생성 및 권한 부여

두 서버간에 데이터를 전송하려면 replication 권한이 있는 역할을 생성하고 테이블 test_table 에 대한 모든 권한을 부여합니다.

logical=> CREATE USER repluser WITH REPLICATION PASSWORD 'password' LOGIN;
logical=> GRANT ALL ON test_table TO repluser;
  • pg_hba.conf 수정

subscribe 노드가 publish 노드에 접속하는 것을 pg_hba.conf 파일을 수정하여 허용합니다. 수정 후, reload 하여 적용시켜 줍니다.

host    replication     repluser 	192.168.40.134/32      trust

적용이 잘 되었는지 psql로 접속을 시도해봅니다.

psql -h 192.168.40.133 -U repluser -d logical
psql (14.2)
Type "help" for help.

logical=>
  • publication 생성

접속이 잘 되는것을 확인했으면 publication을 생성합니다.

logical=> CREATE PUBLICATION logical_pub FOR TABLE test_table;

publish 서버 구성

  • 대상 데이터베이스 및 테이블 생성
postgres=# CREATE DATABASE logical;
postgres=# \\c logical
logical=# CREATE TABLE test_table(x int primary key, y int);
  • subscription 생성
postgres=# CREATE SUBSCRIPTION logical_sub CONNECTION 'host= 192.168.40.133 port=5432 password=password user=repluser dbname=logical' PUBLICATION logical_pub;

Logical Replication 확인

INSERT 테스트

logical=# INSERT INTO test_table VALUES(30,20);

publish 서버

logical=# SELECT * FROM test_table;
 x  | y
----+----
 30 | 20
(1 row)

subscribe 서버

logical=# SELECT * FROM test_table;
 x  | y
----+----
 30 | 20
(1 row)

UPDATE 테스트

logical=# UPDATE test_table SET x=10 WHERE y=20;

publish 서버

logical=# SELECT * FROM test_table;
 x  | y
----+----
 10 | 20
(1 row)

subscribe 서버

logical=# SELECT * FROM test_table;
 x  | y
----+----
 10 | 20
(1 row)
반응형