PostgreSQL 소스 빌드 기반 스트리밍 복제 구축 가이드

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.pidpostmaster.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으로 재구성해야 합니다.

태그: PostgreSQL Streaming Replication pg_basebackup pg_ctl Failover

5월 29일 03:52에 게시됨