개발 D/Postgresql

[Postgresql] postgresql 이중화 Master-Slave 설정 (2)

마음닝 2023. 12. 8. 17:26
Postgresql 설치 후 Postgresql.conf 설정 및 Master - Slave 구축

 

 

 

지난 글에 이어서 postgresql Master - Slave를 구축해보겟다.

 

지난 글 : https://0409kdk.tistory.com/2

 

Postgresql-15 Master - Slave 설정 및 구축- (1)

이번 프로젝트에서 DB 가용성을 위해 이중화를 해야한다고 해서 Postgresql의 Master - Slave 기능을 이용하여 이중화 구성을 해보려고 한다. OS : Redhat8 DB : Postgresql-15 Server : 2대 OS는 프로젝트 하는곳이

0409kdk.tistory.com

 

 

SMALL

 

 

※ Master 서버

data 경로로 들어간다

cd /database/postgres/data

# default로 하신 분
cd /var/lib/pgsql/15/data

 

archive 폴더 생성

mkdir archive

 

 

postgresql.conf 파일을 연다.

vi postgresql.conf

 

 

수정 부분

listen_addresses = '*'
port = 5433           # Default = 5432 
unix_socket_directories = '/var/run/postgresql'
wal_level = replica
archive_mode = on

# Default 경로 이신분은 /database/postgres/data 대신 /var/lib/pgsql/15/data
archive_command = 'test ! -f /database/postgres/data/archive/%f && cp %p /database/postgres/data/archive/%f'

max_wal_senders = 10
hot_standby = on

# Where to Log
logging_collector = on
log_directory = 'pg_log'
log_filename = ' postgresql-%Y-%m-%d.log '
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB

# When to Log
log_min_messages = warning
log_min_error_statement = error

# What to Log
log_line_prefix = '%m [%p] %q%u@%d ' 
log_statement = 'none'

 

 

/usr/pgsql-15/bin/pg_ctl -D /database/postgres/data restart

#default 경로로 하신 분
/usr/pgsql-15/bin/pg_ctl -D /var/lib/pgsql/15/data restart

 

이제 Database에 접속해보겠다.

#-p 는 위에서 설정한 port
psql -p 5433

 

정상 적으로 접속이 되었다 !!!

 

이제 Slave에 복제를 해주기 위한 DB user를 생성 한다.

CREATE USER replication WITH REPLICATION LOGIN PASSWORD 'replica' CONNECTION LIMIT -1;

 

\du 커맨드 입력시 생성된 유저를 확인 할 수 있다. (\q 는 psql 종료)

replication user가 생성되었으니

pg_hba.conf 파일을 수정

 

vi pg_hba.conf

 

 

맨 밑줄에 Slave 서버의 IP 를 허용해준다.

host	replication		replication		Slave서버IP/32	trust

 

나는 추후 추가하기 싫어서 (귀찮음 ..) 전체 허용을 해주었다.

host	all	all	0.0.0.0/0	trust

 

 

postgres 를 다시 재시작한다.

/usr/pgsql-15/bin/pg_ctl -D /database/postgres/data restart

 

이제 다 되었다 Slave 서버에서 Master 서버의 정보를 가져오자.

 

※ Slave Server

 

pg_basebackup -h 'MasterIP' -D 'data경로' -U replication -p 'MasterPort' -v -R -P -X stream

Pg_basebackup 의 옵션 설명

 

-h : 접속 할 DB 서버 주소 (Master Node의 address)

-D : PGDATA 경로 (관리의 용이성을 위해 Master Node와 동일하게 부여)

-U : Master Node에 접속할 사용자 (Replication 유저를 사용)

-p : 접속 할 DB 서버 포트 (Master Node의 port)

-v : 복제 과정을 자세히(verbose) 출력합니다.

-P : 작업 진행과정을 출력합니다.

-X : basebackup 진행 중 필요한 WAL파일을 백업하는 방법을 명시합니다.

     -> 복제 중 생성된 WAL 파일 포함

     -> 여기서 -X stream의 의미는, 복제 중 Master Node에 추가로 연결하여 병렬로 WAL 파일을 Streaming 한다는 의미

-R : postgresql.auto.conf 파일 생성 여부

     -> PostgreSQL 12 이전 버전에서는 recovery.conf 파일이 생성됨

     -> PostgreSQL 12 이후 버전에서는 recovery.conf 파일이 사라지고 postgresql.auto.conf 파일로 대체됨

 

정확히 입력했지만 TCP/IP connections 허용이 안된거 같다 . Master 서버에서 5433 포트를 방화벽 허용을 해줘야 연결이 될꺼같다.

 

# root 계정으로 실행 해야함

sudo firewall-cmd --zone=public --add-port=5433/tcp --permanent
sudo firewall-cmd --reload

 

다시 backup을 받아보겠다.

 

복사가 완료되었다.

(VM ware에 네트워크 문제가 발생해서 master ip가 변경되었고 ph_hba.conf 에도 허용하는 IP 도 바뀌었다...)

 

Postgresql-12 이상 부터 recovery.conf 파일 대신 postgresql.auto.conf 파일로 대체 되었다.

postgresql.auto.conf는 최대한 건드리지 말것! ( Master Server의 정보가 담겨있다.)

 

 

이제 Slave DB를 시작한다.

/usr/pgsql-15/bin/pg_ctl -D /database/postgres/data start

 

이제 Master DB와 Slave DB에 각각 접속해서 test를 해볼것이다.

psql -h localhost -p 5433

 

Master DB 에서 TEST 테이블을 생성 및 데이터를 insert 해보자

CREATE TABLE TEST (test1 varchar(20));

INSERT INTO TEST VALUES(1234);

 

이제 Slave DB 에서 생성한 table을 SELECT 해보자

 

SELECT * FROM TEST;

Master DB

 

 

 

Slave DB

 

Slave DB 에서 insert 한 사진

 

Slave DB는 read-only mode 이기 때문에 insert가 안된다.

 

 

이제 PostgreSQL의 기능을 이용해서 이중화 구축을 완료하였다.

하지만 Master DB가 다운되면 Read-Only 밖에 되지 않기 때문에 PGPOOL-II 을 이용해 이 단점을 없애려고 한다.

 

PGPOOL은 다음글에서 Failover 기능으로 Master DB가 다운 되었을 때 Slave DB가 Master DB로 승격시켜 Slave DB에서도 Insert 가 가능하게 만들어 보겠다.

 


 

300x250
LIST