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 적용
마스터와 슬레이브 2대의 서버가 존재 하는 상테에서 진행 된다.
실행 계정은 설치 할때 생성한 postgres 이다.
복제 전용 유저 생성
Streaming 방식 적용을 위해 슬레이브 서버에서 마스터 서버에 접근할 Replication 전용 유저를 생성한다.
마스터 서버 설정
# CREATE ROLE repluser WITH REPLICATION PASSWORD 'PASS' 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
슬레이브 서버 설정
- 마스터 서버 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
- 설정 변경
$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
기본적으로 Failback을 위한 특별한 기능이 제공되지 않는다. 따라서 다음과 같은 단계를 거쳐야 한다.
- 마스터 서버 장애가 복구 되면 이 서버를 슬레이브 서버로 구축
- 새 마스터 서버(기존 슬레이브)를 강제로 다운
- 새로 구축된 슬레이브(구 마스터)를 마스터 서버로 승격
- 슬레이브 서버 재 구축
이외의 방법은 PostgreSQL Wiki-Replication, Clustering, and Connection Pooling에서 볼 수 있다.
참고 자료
PostgreSQL Replication 구축하기
PostgreSQL Replication – Log Shipping
Postgresql 9.x Replication – Streaming Log