PostgreSQL의 고가용성(High Availability, HA) 환경을 구축하기 위해 repmgr
데몬을 사용하는 방법을 소개합니다.
해당 글에서는 Primary/Standby 복제 설정부터 자동 장애 조치(Failover), VIP 연동까지의 전 과정을 다룹니다.
1. 환경 구성
-
PostgreSQL 12.2
-
repmgr 5.3.3
-
CentOS 7 / Ubuntu 20.04
-
서버 구성:
-
postgresql-01
: Primary -
postgresql-02
: Standby -
VIP:
192.168.10.100
-
2. repmgr 설치
PostgreSQL이 설치된 상태에서 repmgr
을 소스에서 빌드합니다.
git clone https://github.com/EnterpriseDB/repmgr.git cd repmgr make && make install
PostgreSQL 라이브러리가 필요하므로 pg_config
가 PATH에 있어야 합니다.
3. repmgr 사용자 및 데이터베이스 생성
Primary 노드에서 진행
CREATE USER repmgr WITH SUPERUSER LOGIN PASSWORD 'PASSWORD'; CREATE DATABASE repmgr OWNER repmgr;
4. repmgr 설정
각 노드에 repmgr.conf 생성
/etc/repmgr.conf
(원하는 경로에 해당 파일 직접 생성)
Primary (postgresql-01
)
node_id=1 node_name='postgresql-01' conninfo='host=[postgresql-01-IP] user=repmgr dbname=repmgr' data_directory='/usr/local/pgsql/12.2/data' log_level=INFO log_facility=FILE log_file='/var/log/repmgr/repmgr.log' use_replication_slots=yes failover=automatic pg_bindir='/usr/local/pgsql/12.2/bin' promote_command='/usr/local/pgsql/12.2/bin/repmgr standby promote' follow_command='/usr/local/pgsql/12.2/bin/repmgr standby follow -W -f /etc/repmgr.conf'
Standby (postgresql-02
)
node_id=2 node_name='postgresql-02' conninfo='host=[postgresql-02-IP] user=repmgr dbname=repmgr' data_directory='/usr/local/pgsql/12.2/data' log_level=INFO log_facility=FILE log_file='/var/log/repmgr/repmgr.log' use_replication_slots=yes failover=automatic pg_bindir='/usr/local/pgsql/12.2/bin' promote_command='/usr/local/pgsql/12.2/bin/repmgr standby promote' follow_command='/usr/local/pgsql/12.2/bin/repmgr standby follow -W -f /etc/repmgr.conf'
5. PostgreSQL 설정 변경
Primary (postgresql-01
)
postgresql.conf 설정
listen_addresses = '*' wal_level = replica max_wal_senders = 10 hot_standby = on archive_mode = on archive_command = 'cp %p /usr/local/pgsql/12.2/archive/%f'
/usr/local/pgsql/12.2/archive 디렉터리는 PostgreSQL에서 WAL 파일(Write-Ahead Log)을 아카이브하는 저장소로 사용됩니다. archive_mode=on
상태에서 archive_command
에 의해 생성된 로그 파일이 이 경로에 복사됩니다.
즉, Primary 노드에서 생성된 WAL 파일을 복제 동기화를 위해 Standby가 요청할 때 읽을 수 있도록 저장하는 공간입니다.
반드시 해당 디렉터리가 존재해야 하며, PostgreSQL이 접근 가능하도록 소유권 및 권한 설정이 올바르게 되어 있어야 합니다.
pg_hba.conf 설정
host replication repmgr [postgresql-02-IP]/32 trust host repmgr repmgr [postgresql-02-IP]/32 trust
Primary (postgresql-02
)
postgresql.conf 설정
listen_addresses = '*' hot_standby = on
postgresql.auto.conf 설정
primary_conninfo = 'host=[postgresql-01-IP] user=repmgr application_name=''postgresql-02''' primary_slot_name = 'repmgr_slot_2'
6. Primary 등록
Primary (postgresql-01
)에서 진행합니다.
repmgr primary register
정상 등록 여부 확인
repmgr cluster show
7. Standby 클론 및 등록
Primary (postgresql-02
)에서 진행합니다.
Standby 노드에서 Primary로부터 클론 작업 진행
repmgr standby clone --host=[postgresql-01-IP] --user=repmgr --dbname=repmgr -f /etc/repmgr.conf
클론 완료 후 PostgreSQL 재시작
/usr/local/pgsql/12.2/bin/pg_ctl -D /usr/local/pgsql/12.2/data restart
8. repmgr 데몬 실행
각 노드에서 repmgrd
데몬 실행
repmgrd -f /etc/repmgr.conf --daemonize systemctl enable repmgrd
정상적으로 HA 구성이 완료되면 아래와 같이 이중화 구성이 완료된 것을 확인할 수 있습니다.
9. 자동 장애 조치 테스트
Primary 노드를 강제로 종료해봅니다.
/usr/local/pgsql/12.2/bin/pg_ctl -D /usr/local/pgsql/12.2/data stop
Standby 노드에서 로그 확인
tail -f /var/log/repmgr/repmgrd.log
정상 작동 시 Standby가 자동으로 Primary로 승격됩니다.
10. VIP 구성 (Keepalived 사용)
서비스 무중단을 위한 VIP 구성은 선택 사항이지만 고가용성을 실현하려면 권장됩니다.
/etc/keepalived/keepalived.conf
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.10.100 } track_script { chk_pg } }
VIP는 승격 노드에 할당되며, 클라이언트는 항상 VIP로 접속합니다.
이 글에서는repmgr
데몬을 이용하여 PostgreSQL 고가용성(HA) 환경을 구축하는 방법을 안내했습니다.
repmgr
은 비교적 단순한 설정으로도 복제, 장애 감지, 자동 승격 등을 지원하며, VIP 연동으로 완성도 높은 HA 구성이 가능합니다.
[참고 링크]