자! 서버복제를 구성하여 보자! 어떻게 되는지 하나 하나 알아 보자고요.
여러가지 방법이 있습니다. 분석을 해야하나 장단점이 있는데 좀 알아보고 맞는 것 찾아봐야 겠습니다.
WAL을 넘겨서 Standby Server가 Active Server의 자료와 동기화하는방법이 있고, 로지컬로 변경분을 전송하는 방법이 있다.
PostgreSQL에서 제공하는 복제 서버 구축 방식을 요약하면 다음과 같다.
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 버전 간의 복제만 가능합니다.
아래와 같은 순서로 진행한다.
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에 붙여넣기를 한다.
Standby Server의 Archive파일를 받기위한 Directory생성
# Standby Server postgres@standby-server:~$ mkdir Archive
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
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 파일이 존재해야한다.
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으로 설정되어 있어야 한다.
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'