PostgreSQL replication 설정: 스트리밍 복제 및 고가용성 구현
PostgreSQL 스트리밍 복제 설정과 고가용성 아키텍처 구현 방법을 설명합니다.
PostgreSQL replication 설정
Introduction
PostgreSQL의 복제(Replication)는 데이터의 고가용성과 재해 복구를 위한 핵심 기술입니다. 스트리밍 복제는 실시간으로 마스터 서버의 변경 사항을 슬레이브 서버에 전달하여 데이터 일관성을 유지합니다. 이 글에서는 스트리밍 복제 설정부터 장애 조치(failover)까지 전체 프로세스를 다루겠습니다.
Environment
# PostgreSQL 버전 확인
psql --version
# 마스터/슬레이브 서버 정보
# 마스터: 192.168.1.100:5432
# 슬레이브: 192.168.1.101:5432# postgresql.conf (공통 설정)
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1024
hot_standby = onProblem
복제 설정 과정에서 발생하는 문제들:
# 슬레이브에서 복제 상태 확인
psql -U replicator -h 192.168.1.101 -d postgres -c "SELECT * FROM pg_stat_replication;"
# ERROR: relation "pg_stat_replication" does not exist
# LINE 1: SELECT * FROM pg_stat_replication;
# 복제 지연 확인
psql -U replicator -h 192.168.1.101 -d postgres -c "SELECT now() - pg_last_xact_replay_timestamp() AS replication_lag;"
# replication_lag
# ----------------
# 00:15:23.456789 <-- 15분 지연!# WAL 파일 경로 문제
tail -f /var/log/postgresql/postgresql-14-main.log
# [ERROR]: could not open file "pg_wal/xlogtemp/12345": No such file or directory
# [LOG]: starting archive recovery
# [ERROR]: requested WAL segment 000000010000000000000001 has already been removedAnalysis
복제 문제의 원인을 분석했습니다:
-- 마스터 서버 설정 확인
SHOW wal_level;
-- replica
SHOW max_wal_senders;
-- 10
SHOW wal_keep_size;
-- 1024
-- 복제 사용자 확인
SELECT usename, userepl FROM pg_user WHERE userepl = true;
-- replicator | t
-- pg_hba.conf 복제 권한 확인
-- host replication replicator 192.168.1.0/24 md5# 슬레이브 복제 상태 상세 확인
psql -U postgres -h 192.168.1.101 -c "
SELECT
status,
received_lsn,
latest_end_lsn,
last_msg_send_time,
last_msg_receipt_time
FROM pg_stat_wal_receiver;
"
# 결과
# status | received_lsn | latest_end_lsn | last_msg_send_time | last_msg_receipt_time
# streaming | 0/12345678 | 0/12345678 | ... | ...Solution
1단계: 마스터 서버 설정
# postgresql.conf 수정
cat >> /etc/postgresql/14/main/postgresql.conf << 'EOF'
# 복제 설정
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1024
hot_standby = on
synchronous_commit = on
# WAL 아카이브 설정
archive_mode = on
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
EOF# pg_hba.conf에 복제 권한 추가
echo "host replication replicator 192.168.1.0/24 md5" >> /etc/postgresql/14/main/pg_hba.conf
# 복제 사용자 생성
sudo -u postgres psql -c "
CREATE USER replicator WITH REPLICATION LOGIN PASSWORD 'secure_password';
"
# PostgreSQL 재시작
sudo systemctl restart postgresql2단계: 기본 백업 수행
# pg_basebackup로 기본 백업 수행
sudo -u postgres pg_basebackup \
-h 192.168.1.100 \
-U replicator \
-D /var/lib/postgresql/14/main \
-Fp -Xs -P -R
# 백업 상태 확인
ls -la /var/lib/postgresql/14/main/
# postgresql.auto.conf에 복제 설정 자동 추가됨
# standby.signal 파일 생성됨3단계: 슬레이브 서버 설정
# 슬레이브 서버 postgresql.conf
cat >> /etc/postgresql/14/main/postgresql.conf << 'EOF'
# 슬레이브 설정
hot_standby = on
primary_conninfo = 'host=192.168.1.100 port=5432 user=replicator password=secure_password'
# 복제 지연 모니터링
hot_standby_feedback = on
max_standby_streaming_delay = 30s
EOF# standby.signal 파일 확인 (pg_basebackup가 자동 생성)
cat /var/lib/postgresql/14/main/standby.signal
# 이 파일이 존재하면 슬레이브 모드로 시작됨
# 슬레이브 PostgreSQL 시작
sudo systemctl start postgresql
# 복제 상태 확인
psql -U postgres -c "SELECT * FROM pg_stat_wal_receiver;"4단계: 복제 모니터링 스크립트
#!/bin/bash
# replication_monitor.sh
MASTER_HOST="192.168.1.100"
SLAVE_HOST="192.168.1.101"
ALERT_THRESHOLD=60 # 60초
# 복제 지연 확인
LAG=$(psql -U postgres -h $SLAVE_HOST -t -c "
SELECT EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::int;
")
if [ $LAG -gt $ALERT_THRESHOLD ]; then
echo "ALERT: Replication lag is ${LAG} seconds"
# 알림 발송 로직
fi
# 슬레이브 상태 확인
STATUS=$(psql -U postgres -h $SLAVE_HOST -t -c "
SELECT status FROM pg_stat_wal_receiver;
")
if [ "$STATUS" != "streaming" ]; then
echo "ALERT: Slave is not in streaming mode"
fi# 크론에 등록
# */5 * * * * /opt/scripts/replication_monitor.sh >> /var/log/replication.log 2>&1Lessons Learned
- 네트워크 안정성: 복제 연결의 안정성을 위해 안정적인 네트워크 환경이 필수적입니다
- WAL 보존 설정:
wal_keep_size를 적절히 설정하여 슬레이브가 필요한 WAL 파일을 유지해야 합니다 - 동기/비동기 선택:
synchronous_commit설정으로 데이터 유실 위험과 성능 간의 트레이드오프를 고려해야 합니다 - 자동 장애 조치: PostgreSQL 12 이상에서는
pg_promote()를 사용하여 자동 승격이 가능합니다 - 정기적 백업: 복제와 별도로 정기적인 백업을 수행하는 것이 중요합니다
이 블로그는 외부 스폰서십, 제휴 마케팅 또는 광고 수익을 받지 않습니다.