brunch

You can make anything
by writing

C.S.Lewis

by Daniel Lim Sep 11. 2017

PostgreSQL Replication

PostgreSQL 복제 스탠바이 서버 구축

PostgreSQL 내장 기능을 이용한 복제 스탠바이 서버 구축


사전 지식


WAL-Write Ahead Log 

마스터 서버에서 발생하는 모든 작업 로그 생성

생성된 로그를 슬레이브 서버로 전달

슬레이브 서버에서 받은 로그의 복원(재실행)



위와 같은 동작으로 마스터 서버와 같은 스키마/데이터를 가지는 복제 서버를 생성한다. 이 마스터 서버의 로그를 WAL이라고 하며, 로그 위치는 $PG_SQL/data/pg_xlog 에 쌓인다.


WAL 전달 방식


Log-Shipping 방식 : pg_xlog 안의 WAL 파일 자체를 슬레이브 서버로 전달(File Copy)

Streaming 방식 : WAL 파일 저장 여부와 관계없이 로그의 내용을 슬레이브 서버로 전달(Streaming)


Log-Shipping


마스터 서버에서 저장된 WAL 파일의 크기를 지정된 사이즈 만큼 채워야 슬레이브 서버로 전송, 채워지는 시간 동안 마스터/슬레이브 서버의 데이터가 어긋남
마스터 서버의 장애 발생 시, WAL 파일을 다 채우지 못하여 전달되지 않을 경우 데이터의 유실 있음


Streaming

Streaming 방식은 PostgreSQL 9.0 이상에서 사용이 가능하다.

두 서버 간의 네트워크 문제가 없다는 가정하에, 거의 실시간으로 동작(1초 미만의 작은 지연 발생 가능)
슬레이브 서버의 긴 장애가 발생하여 문제가 생길 경우, 유실된 데이터 복구 방법은 슬레이브 서버를 처음부터 다시 구축해야 한다.
따라서 Streaming 방식을 사용하더라도, 이와 같은 문제를 피하기 위해서 Log-Shipping 방식을 적용해 놓는 것이 좋다.


Streaming Replication 적용

PostgreSQL 설치는 기존에 작성된 게시글 참조


마스터슬레이브 2대의 서버가 존재하는 상태에서 진행된다.
실행 계정은 설치할 때 생성한 postgres이다.


복제 전용 유저 생성

Streaming 방식 적용을 위해 슬레이브 서버에서 마스터 서버에 접근할 Replication 전용 유저를 생성한다.


마스터 서버 설정  

# CREATE ROLE repluser WITH REPLICATION PASSWORD '' LOGIN;


방금 생성한 계정의 접근 권한을 설정하기 위해 $PG_SQL/data/pg_hba.conf 파일에 다음을 추가한다.
원본 문서에서는 md5로 되어 있으나 단순하게 trust로 변경  

host    replication     repluser     192.168.0.0/32      trust


복제를 위한 $PG_SQL/data/postgresql.conf 설정 변경
  

listen_addresses = '*'  # 인증/권한 관리는 pg_hba.conf 파일에서 진행
wal_level = hot_standby  # 대기 서버에 읽기 전용 작업 가능
max_wal_senders = 2  # WAL 파일을 전송할 수 있는 최대 서버 수
wal_keep_segments = 32  # 마스터 서버 디렉터리에 보관할 최근 WAL 파일의 수

서버 기동 명령어 
  

# 기동
$PG_SQL/bin/pg_ctl -D $PG_SQL/data -l logfile start
# 재시작
$PG_SQL/bin/pg_ctl -D $PG_SQL/data -l logfile restart
# 종료
$PG_SQL/bin/pg_ctl -D $PG_SQL/data -l logfile stop


슬레이브 서버 설정


1. 마스터 서버 basebackup


pg_basebackup 명령어를 이용하여 최초 백업을 진행한다.
이 명령은 마스터 서버의 $PG_SQL/data 디렉터리를 통째로 슬레이브 서버의 $PG_SQL/data 디렉터리로 복제/복원하는 명령이다.
명령을 실행하기 전에 슬레이브 서버에 $PG_SQL/data는 비어 있어야 한다.  


$PG_SQL/bin/pg_basebackup -h $MASTER_IP -D $PG_SQL/data -U repluser -v -P --xlog-method=stream

2. 설정 변경

$PG_SQL/data/postgresql.conf 설정 변경  

listen_addresses = '*'  # 인증/권한 관리는 pg_hba.conf 파일에서 진행
hot_standby = on  # 대기 서버에 읽기 전용 작업 가능


$PG_SQL/data/recovery.conf 파일을 추가하고 다음의 내용을 작성한다.  


standby_mode = on
primary_conninfo = 'host=MASTER_IP port=5432 user=repluser password=password'
trigger_file = '/path/of/triggerfile' # failover시 마스터 승격을 위한 트리거 파일

primary_conninfo 옵션 정보로 마스터 서버에 접속해 실시간 WAL 파일을 전달받는다. 

슬레이브 서버를 마스터 서버로 전환하는 방법은 두 가지가 있는데, pg_ctl promote 명령어를 이용하는 방법과 recovery.conf파일의 trigger_file 옵션을 이용하는 방법이다.
단순하게 해당 경로에 파일이 생성되었을 때, (touch 등으로) 스텐바이 서버가 새로운 마스터로 승격된다.
슬레이브 서버를 마스터로 변경할 때는 기존 마스터가 확실히가 다운된 상태인지 확인해야 한다.


서버 기동 명령어 
  

# -p PORT
# -D 데이터 파일 위치
# & 백그라운드 실행
$PG_SQL/postmaster -p 5433 -D $PG_SQL/data &


Failback

마스터 서버 장애가 복구되면 이 서버를 슬레이브 서버로 구축

이외의 방법은 PostgreSQL Wiki-Replication, Clustering, and Connection Pooling에서 볼 수 있다.


참고 자료

PostgreSQL Replication 구축하기 
PostgreSQL Replication – Log Shipping
Postgresql 9.x Replication – Streaming Log


작가의 이전글 VirtualBox PORT Forward
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari