CentOS 7 환경에서 PostgreSQL 11.6를 소스 컴파일 방식으로 설치하고, 1대의 마스터와 1대의 스탠바이로 구성된 스트리밍 복제 환경을 구축하는 방법을 설명합니다.
디렉터리 준비 및 소스 다운로드
설치 경로와 데이터 저장 경로를 분리하여 생성합니다.
mkdir -p /opt/pgsql /opt/pgsql/data /opt/pgsql/archive
소스 코드를 내려받아 해제합니다.
wget https://ftp.postgresql.org/pub/source/v11.6/postgresql-11.6.tar.gz
tar -xzf postgresql-11.6.tar.gz -C /opt
필수 패키지 설치
컴파일에 필요한 개발 라이브러리를 설치합니다.
yum install -y gcc make bison flex
yum install -y zlib-devel readline-devel ncurses-devel
소스 컴파일 및 설치
설치 경로를 지정하여 빌드합니다. 컨트리브 모듈도 함께 설치합니다.
cd /opt/postgresql-11.6
./configure --prefix=/opt/pgsql --with-pgport=5432
make -j$(nproc)
make install
cd /opt/postgresql-11.6/contrib
make -j$(nproc)
make install
계정 및 권한 설정
PostgreSQL 전용 계정을 만들고, 디터리 소유권을 변경합니다.
groupadd pgsql
useradd -g pgsql -s /bin/bash -m pgsql
chown -R pgsql:pgsql /opt/pgsql
환경 변수 구성
pgsql 계정으로 전환 후 환경 변수를 설정합니다.
su - pgsql
cat >> ~/.bash_profile <<'EOF'
export PGHOME=/opt/pgsql
export PGDATA=/opt/pgsql/data
export PATH=$PGHOME/bin:$PATH
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export MANPATH=$PGHOME/share/man:$MANPATH
export LANG=en_US.UTF-8
EOF
source ~/.bash_profile
클러스터 초기화 및 서비스 기동
initdb -D $PGDATA -E UTF8 --locale=en_US.UTF-8
pg_ctl -D $PGDATA -l $PGHOME/log/startup.log start
pg_ctl -D $PGDATA status
시스템 부팅 시 자동 시작 설정
cp /opt/postgresql-11.6/contrib/start-scripts/linux /etc/init.d/postgresql
chmod +x /etc/init.d/postgresql
sed -i 's|prefix=/usr/local/pgsql|prefix=/opt/pgsql|' /etc/init.d/postgresql
sed -i 's|PGDATA="/usr/local/pgsql/data"|PGDATA="/opt/pgsql/data"|' /etc/init.d/postgresql
sed -i 's|# Who to run the postmaster as|# ' /etc/init.d/postgresql
chkconfig --add postgresql
chkconfig postgresql on
관리자 비밀번호 설정
초기화 후 postgres 계정의 인증 방식을 변경하고 비밀번호를 설정합니다.
psql -c "ALTER USER postgres WITH PASSWORD 'SecureP@ssw0rd';"
참고: 마스터와 스탠바이 서버 모두 위 과정까지 동일하게 수행합니다.
마스터 노드 복제 설정
접근 제어 설정 (pg_hba.conf)
vi $PGDATA/pg_hba.conf
파일 하단에 다음 내용을 추가합니다.
# 일반 연결 허용
host all all 0.0.0.0/0 md5
# 복제 전용 연결 (스탠바이 IP 지정)
host replication all 192.168.1.0/24 trust
핵심 파라미터 설정 (postgresql.conf)
listen_addresses = '*'
wal_level = replica
max_connections = 500
archive_mode = on
archive_command = 'test ! -f /opt/pgsql/archive/%f && cp %p /opt/pgsql/archive/%f'
max_wal_senders = 8
wal_keep_segments = 64
wal_sender_timeout = 60s
hot_standby = on
설정 반영을 위해 마스터를 재시작합니다.
pg_ctl -D $PGDATA restart -m fast
스탠바이 노드 구성
기존 데이터 백업 및 기준 복제
스탠바이 서버에서 기존 데이터 디렉터리를 임시로 이동시키고, 마스터의 데이터를 기반으로 복제를 수행합니다.
# root 계정으로 전환 후 임시 백업
cd /opt/pgsql
mv data data_backup
# pgsql 계정으로 전환
su - pgsql
# 마스터의 전체 데이터를 스트리밍 방식으로 복제
pg_basebackup -h 192.168.1.10 -p 5432 -U postgres -D $PGDATA -P -X stream -R
pg_basebackup 실행 시 -R 플래그를 사용하면 자동으로 standby.signal 파일과 postgresql.auto.conf의 복제 설정이 생성됩니다.
복제 슬롯 관련 파일 복원
기존 postmaster.pid와 postmaster.opts가 있다면 새로 생성된 데이터로 대체되므로, 해당 파일들은 복원할 필요가 없습니다. 다만 아카이브 디렉터리 등 추가 구성이 필요한 경우 수동으로 생성합니다.
mkdir -p /opt/pgsql/archive
스탠바이 서비스 기동
pg_ctl -D $PGDATA -l $PGHOME/log/standby.log start
마스터에서 복제 상태를 확인합니다.
psql -x -d postgres -c "SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn FROM pg_stat_replication;"
복제 동기화 검증
마스터에서 데이터베이스를 생성합니다.
-- 마스터
CREATE DATABASE sync_verify;
\l
스탠바이에서 목록을 조회하여 동기화 여부를 확인합니다.
-- 스탠바이
\l
스탠바이는 읽기 전용 모드이므로, 쓰기 작업은 차단됩니다.
CREATE DATABASE should_fail;
-- ERROR: cannot execute CREATE DATABASE in a read-only transaction
수동 장애 전환 (Failover)
마스터 장애를 시뮬레이션합니다.
# 마스터 서버
pg_ctl -D $PGDATA stop -m immediate
스탠바이를 새로운 마스터로 승격시킵니다.
# 스탠바이 서버
psql -c "SELECT pg_is_in_recovery();" -- t (복구 모드 확인)
pg_ctl -D $PGDATA promote
psql -c "SELECT pg_is_in_recovery();" -- f (마스터 모드로 전환됨)
승격 후 스탠바이는 독립적인 마스터로 운영되며, 기존 마스터를 다시 스탠바이로 편입시키려면 pg_rewind를 사용하거나 pg_basebackup으로 재구성해야 합니다.