사용자 도구

사이트 도구


postgresql:replication

PostgreSQL Replication

자! 서버복제를 구성하여 보자! 어떻게 되는지 하나 하나 알아 보자고요.

여러가지 방법이 있습니다. 분석을 해야하나 장단점이 있는데 좀 알아보고 맞는 것 찾아봐야 겠습니다.

WAL을 넘겨서 Standby Server가 Active Server의 자료와 동기화하는방법이 있고, 로지컬로 변경분을 전송하는 방법이 있다.

WAL

PostgreSQL에서 제공하는 복제 서버 구축 방식을 요약하면 다음과 같다.

  • 마스터 서버에서 발생하는 모든 작업을 로그로 만든다.
  • 이 로그를 스탠바이 서버(들)로 전달한다.
  • 스탠바이 서버(들)에서 받은 로그를 복원(재실행)한다.
  • 이렇게 하면 마스터 서버와 같은 스키마/데이터를 가지는 복제 서버가 탄생하게 된다. 이 때, 마스터 서버의 로그를 WAL(Write Ahead Log)이라고 하며, 이 로그는 CentOS 기준 /var/lib/pgsql/9.x/data/pg_xlog 디렉토리에 쌓이게 된다. 어디에 쌓이든 postgresql.conf파일에서 설정된다.

Log Shipping

WAL파일을 전송하면 Standby Server에서 복구방식으로 Database를 동기화 한다.

Stream 방식도 별도의 설명이 있는 것같은데 archive_timeout시간을 main서버에서 조절가능하다.(초단위) Main Server의 부담이 있다고 한다. Standby Server가 다운되었을 경우 오버헤드가 있을 수 있다.

본 설정은 Ubuntu에서 postgresql-16으로 하였다. {다른 OS(Debian)과 묶어 보려하였으나 postgresql의 빌드버전차이로 Debian과는 연결을 못 하였다.}

PostgreSQL이 설치된 Platform이 다르다면 Replication 불가능합니다. 또한 Major Version은 동일해야 합니다.

클러스터의 물리적인 복제이기 때문에 동일한 pg 버전 간의 복제만 가능합니다.

아래와 같은 순서로 진행한다.

  1. scp를 위한 key준비 ( Main Server에서 Standby Server로 )
  2. WAL파일을 위한 Archive파일 전송하기 위한 path 구성
  3. Main Server 설정
  4. Data Backup 및 Restore
  5. Standby Server 설정

1.scp 준비

public key 생성

# Main Server에서
postgres@main-server:~$ ssh-keygen
 
# .ssh/id_rsa.pub파일 내용을 Standby Server의 .ssh/authorized_keys에 내용을 추가 하여 넣음
postgres@main-server:~$ cat .ssh/id_rsa.pub
# public key를 복사
# Standby Server에서
postgres@standby-server:~$ mkdir .ssh
postgres@standby-server:~/.ssh$ vi authorized_keys
# 복사한 main server의 public key를 authorized_keys에 붙여넣기를 한다.

2.WAL파일을 위한 Archive파일 전송하기 위한 path 구성

Standby Server의 Archive파일를 받기위한 Directory생성

# Standby Server
postgres@standby-server:~$ mkdir Archive

3.Main Server 설정

postgresql.conf 파일수정 postgresql 16버전기준 설정파일위치 /etc/postgresql/16/main/postgresql.conf

wal_level = replica
archive_mode = on
archive_command = 'scp %p postgres@standby-server:/var/lib/postgresql/Archive/%f'
archive_timeout = 30 # force a WAL file switch after this
max_wal_senders = 10 # max number of walsender process
  • archive_timeout : sec / WAL File(16MB)이 가득 차지 않아도 30초마다 WAL File을 Switching)

4.Data Backup 및 Restore

Main Server를 stop & start

data backup

# dibian인 경우 /var/lib/postgresql/16/main
cd /var/lib/postgresql/16
tar -cvf Data.tar main

Data.tar를 Standby Server로 복사하고 압축해제

tar -xvf Data.tar
touch standby.signal

Standby Server에는 standby.signal 파일이 존재해야한다.

3.Standby Server 설정

restore_command = 'test -f /var/lib/postgresql/Archive/%f && cp /var/lib/postgresql/Archive/%f %p'
archive_cleanup_command = 'pg_archivecleanup /var/lib/postgresql/Archive %r'
hot_standby = on # "off" disallows queries during recovery

DB가 Standby 상태로 스트리밍 복제가 이루어지는 Slave노드에는 반드시 on으로 설정되어 있어야 한다.

Stream Replication

Logical Replication

Logical은 DDL문장이 아닌 것들에 대해서 지정이 가능하고, 당연히 유연성이 있으나, Interface대용으로 사용하기에 적당할 것같다.

CREATE ROLE repluser REPLICATION LOGIN PASSWORD 'pingxxxx';

mama계정으로 접속해야죠

CREATE PUBLICATION maro_publication FOR ALL TABLES;

GRANT USAGE ON SCHEMA maro_schema TO repluser;

REVOKE USAGE ON SCHEMA maro_schema FROM repluser;

GRANT SELECT ON ALL TABLES IN SCHEMA maro_schema TO repluser;

REVOKE SELECT ON ALL TABLES IN SCHEMA maro_schema FROM repluser;

CREATE SUBSCRIPTION maro_subscription CONNECTION 'dbname=marodb host=garam port=55432 user=repluser password=ping5433' PUBLICATION maro_publication ;

DROP SUBSCRIPTION maro_subscription;

\dRp, \dRs

alias padm='psql -p 55432 -d marodb'
postgresql/replication.txt · 마지막으로 수정됨: 2025/04/15 10:05 저자 127.0.0.1