안녕하세요.
오픈소스컨설팅에서 Atlassian 솔루션 기술 지원을 담당하고 있는 김세환입니다.
다양한 고객 환경에서 Jira, Confluence, Bitbucket, Crowd 등을 지원하다 보면 서비스의 안정성과 가용성(High Availability) 에 대한 요구가 점점 더 커지고 있음을 느낍니다.
특히 데이터베이스는 단 한 번의 장애로도 전체 서비스가 중단될 수 있는 핵심 요소입니다.
이번 글에서는 이러한 문제를 예방하기 위해 PostgreSQL의 이중화(HA) 환경을 직접 설치하고 구성하는 방법을 정리했습니다. 실제 테스트 환경을 기반으로 Streaming Replication과 Pgpool-II를 이용해 자동 장애 조치(Failover) 가 가능한 구조를 구축하는 과정을 단계별로 보여드리겠습니다.
이 문서는 Rocky Linux 8 환경에서 PostgreSQL 16을 설치하고, Streaming Replication 및 Pgpool-II를 이용하여 자동 Failover 환경을 구축하는 방법을 안내드립니다.
아래 명령어를 실행하여 PostgreSQL 16 저장소를 등록하고 패키지를 설치합니다.
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -qy module disable postgresql
dnf install -y postgresql16 postgresql16-server
/usr/pgsql-16/bin/postgresql-16-setup initdb
systemctl enable --now postgresql-16
위 명령으로 데이터 디렉터리를 초기화하고 PostgreSQL 서비스를 자동 시작하도록 설정합니다.

파일 경로: /var/lib/pgsql/16/data/postgresql.conf
listen_addresses = '*'               # 모든 IP에서 접속 허용
wal_level = replica                  # 복제 로그 활성화
archive_mode = on                    # WAL 아카이브 활성화
archive_command = 'cp %p /var/lib/pgsql/16/archive/%f'  # WAL 파일 복사 명령
max_wal_senders = 10                 # WAL 송신 프로세스 수
wal_keep_size = 128MB                # WAL 보존 크기
hot_standby = on                     # 스탠바이 서버에서 읽기 허용

파일 경로: /var/lib/pgsql/16/data/pg_hba.conf
host    replication     replicator      0.0.0.0/0      md5  # 복제용 사용자 접근 허용
host    all             all             0.0.0.0/0      md5  # 모든 클라이언트 접근 허용

systemctl restart postgresql-16
설정을 수정하신 후 PostgreSQL 서비스를 재시작하시면 적용됩니다
sudo -u postgres psql
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'replicatorpass';
\q
위 사용자는 Standby 서버에서 Primary로 WAL 로그를 받아오는 데 사용됩니다.

systemctl stop postgresql-16
rm -rf /var/lib/pgsql/16/data/*
Primary 서버 데이터를 복제합니다.
PGPASSWORD=replicatorpass \
sudo -u postgres pg_basebackup -h <Master-IP> -D /var/lib/pgsql/16/data -U replicator -Fp -Xs -P -R
systemctl start postgresql-16
sudo -u postgres psql
SELECT pg_is_in_recovery();            -- true면 Standby 상태입니다.
SELECT * FROM pg_stat_wal_receiver;    -- WAL 수신 상태 확인
\q

dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf install -y pgpool-II-pg16
listen_addresses = '*'                # 외부 접속 허용
port = 9999                           # Pgpool 포트
backend_hostname0 = 'Master-IP' # Primary
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/16/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'Stamdby-IP' # Standby
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/16/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
enable_pool_hba = on                  # 자체 인증 사용
master_slave_mode = on                # Master/Slave 모드 활성화
sr_check_period = 10                  # 복제 점검 주기
sr_check_user = 'replicator'
sr_check_password = 'replicatorpass'
health_check_period = 10              # 헬스체크 주기
health_check_user = 'replicator'
health_check_password = 'replicatorpass'
host    all         all         0.0.0.0/0       md5

systemctl enable --now pgpool-II
pg_md5 'admin'
echo "confluenceuser:707ac8a55959c9e404cc3e827c0f343e" > /etc/pgpool-II/pool_passwd
chmod 600 /etc/pgpool-II/pool_passwd
chown postgres:postgres /etc/pgpool-II/pool_passwd
systemctl restart pgpool-II

psql -h 127.0.0.1 -p 9999 -U confluenceuser -d confluencedb -c "show pool_nodes;"

cp /etc/pgpool-II/sample_scripts/failover.sh.sample /etc/pgpool-II/failover.sh
chmod +x /etc/pgpool-II/failover.sh
pgpool.conf에 아래 항목을 추가합니다.
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@Master-IP
ssh-copy-id -i id_rsa_pgpool.pub postgres@slave-IP
ssh-copy-id -i id_rsa_pgpool.pub root@slave-IP
ssh-copy-id -i id_rsa_pgpool.pub root@Master-IP
각 서버의 postgres 및 root 계정 모두 설정하셔야 합니다.
systemctl stop postgresql-16 #Master DB 중지 
psql -U postgres -p 9999 -h 127.0.0.1 -c "show pool_nodes;"

Standby 서버가 자동으로 Master로 승격되면 정상입니다.
Primary 복구 후 Pgpool을 재시작하면 원래 상태로 되돌아갑니다.
systemctl restart pgpool-II
이상으로 PostgreSQL 16과 Pgpool-II 기반의 Streaming Replication 및 자동 Failover 구성을 완료했습니다.
이번 구성을 통해 장애 상황에서도 중단 없는 안정적인 DB 운영이 가능해집니다.
읽어주셔서 감사합니다.
다음에 또 유익한 주제로 찾아뵙겠습니다.
👉테크 블로그 글 더 읽어보기