사용자 도구

사이트 도구


postgresql:replication

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
postgresql:replication [2024/07/29 06:55] – [Log Shipping] taekgupostgresql:replication [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +======= 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 버전 간의 복제만 가능합니다.
 +
 +아래와 같은 순서로 진행한다.
 +  - scp를 위한 key준비 ( Main Server에서 Standby Server로 )
 +  - WAL파일을 위한 Archive파일 전송하기 위한 path 구성
 +  - Main Server 설정
 +  - Data Backup 및 Restore
 +  - Standby Server 설정
 +
 +==== 1.scp 준비 ====
 +public key 생성
 +
 +<code bash>
 +# 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를 복사
 +</code>
 +
 +<code bash>
 +# Standby Server에서
 +postgres@standby-server:~$ mkdir .ssh
 +postgres@standby-server:~/.ssh$ vi authorized_keys
 +# 복사한 main server의 public key를 authorized_keys에 붙여넣기를 한다.
 +</code>
 +
 +==== 2.WAL파일을 위한 Archive파일 전송하기 위한 path 구성 ====
 +Standby Server의 Archive파일를 받기위한 Directory생성
 +
 +<code bash>
 +# Standby Server
 +postgres@standby-server:~$ mkdir Archive
 +</code>
 +
 +==== 3.Main Server 설정 ====
 +
 +postgresql.conf 파일수정
 +postgresql 16버전기준 설정파일위치
 +/etc/postgresql/16/main/postgresql.conf
 +<code>
 +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
 +</code>
 +  * archive_timeout : sec / WAL File(16MB)이 가득 차지 않아도 30초마다 WAL File을 Switching)
 +
 +==== 4.Data Backup 및 Restore ====
 +
 +Main Server를 stop & start
 +
 +data backup
 +<code bash>
 +# dibian인 경우 /var/lib/postgresql/16/main
 +cd /var/lib/postgresql/16
 +tar -cvf Data.tar main
 +</code>
 +
 +Data.tar를 Standby Server로 복사하고 압축해제
 +
 +<code bash>
 +tar -xvf Data.tar
 +</code>
 +
 +<code bash>
 +touch standby.signal
 +</code>
 +
 +Standby Server에는 standby.signal 파일이 존재해야한다.
 +
 +==== 3.Standby Server 설정 ====
 +
 +<code>
 +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
 +</code>
 +
 +DB가 Standby 상태로 스트리밍 복제가 이루어지는 Slave노드에는 반드시 on으로 설정되어 있어야 한다.
 +===== Stream Replication =====
 +
 +====== Logical Replication ======
 +
 +Logical은 DDL문장이 아닌 것들에 대해서 지정이 가능하고, 당연히 유연성이 있으나, Interface대용으로 사용하기에 적당할 것같다.
 +
 +<code >
 +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'
 +
 +</code>