본문 바로가기
Database2025년 4월 14일7분 읽기

PostgreSQL 복제 구성 — Streaming Replication 실전

YS
김영삼
조회 319

Streaming Replication 개요

PostgreSQL Streaming Replication은 Primary 서버의 WAL(Write-Ahead Log)을 실시간으로 Standby 서버에 전송하여 복제하는 물리적 복제 방식입니다. 읽기 부하 분산과 장애 시 빠른 페일오버를 위한 가장 보편적인 HA 구성입니다.

아키텍처 구성

# 구성 예시
# Primary: 192.168.1.10 (읽기/쓰기)
# Standby: 192.168.1.11 (읽기 전용, 핫 스탠바이)

# Primary postgresql.conf 설정
wal_level = replica
max_wal_senders = 5
wal_keep_size = 1GB
synchronous_commit = on
synchronous_standby_names = 'standby1'

# Primary pg_hba.conf - 복제 접속 허용
# TYPE  DATABASE        USER            ADDRESS          METHOD
host    replication     replicator      192.168.1.11/32  scram-sha-256

Primary 서버 설정

# 복제 전용 사용자 생성
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'secure_password';

# 복제 슬롯 생성 (WAL 유실 방지)
SELECT pg_create_physical_replication_slot('standby1_slot');

# 슬롯 확인
SELECT slot_name, slot_type, active, restart_lsn
FROM pg_replication_slots;

Standby 서버 구성

# 1. Standby 서버에서 베이스 백업 수행
pg_basebackup -h 192.168.1.10 -U replicator -D /var/lib/postgresql/16/main \
  --checkpoint=fast --slot=standby1_slot --write-recovery-conf -P

# 자동 생성되는 standby.signal 확인
ls -la /var/lib/postgresql/16/main/standby.signal

# 2. Standby postgresql.conf 추가 설정
primary_conninfo = 'host=192.168.1.10 port=5432 user=replicator password=secure_password application_name=standby1'
primary_slot_name = 'standby1_slot'
hot_standby = on
hot_standby_feedback = on

# 3. Standby 시작
systemctl start postgresql

복제 상태 모니터링

-- Primary에서 복제 상태 확인
SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn,
       replay_lsn, sync_state,
       pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_lag_bytes
FROM pg_stat_replication;

-- Standby에서 복제 지연 확인
SELECT now() - pg_last_xact_replay_timestamp() AS replay_lag;

-- WAL 수신 상태
SELECT status, receive_start_lsn, received_lsn, last_msg_send_time
FROM pg_stat_wal_receiver;

-- 복제 슬롯 상태
SELECT slot_name, active,
       pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS retained_bytes
FROM pg_replication_slots;

수동 페일오버

# Standby를 Primary로 승격
pg_ctl promote -D /var/lib/postgresql/16/main
# 또는
SELECT pg_promote(wait_seconds => 60);

# 승격 후 확인
SELECT pg_is_in_recovery();  -- false면 Primary

자동 페일오버 — Patroni

# patroni.yml 설정
scope: pg-cluster
name: node1

etcd3:
  hosts: 192.168.1.20:2379

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    synchronous_mode: true
    postgresql:
      parameters:
        max_connections: 200
        shared_buffers: 4GB
        wal_level: replica

  initdb:
    - encoding: UTF8
    - data-checksums

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.1.10:5432
  authentication:
    replication:
      username: replicator
      password: secure_password

동기 vs 비동기 복제

항목동기 (Synchronous)비동기 (Asynchronous)
데이터 손실제로 데이터 손실최근 트랜잭션 유실 가능
쓰기 지연네트워크 RTT만큼 증가영향 없음
가용성Standby 장애 시 Primary도 대기독립적
용도금융, 결제 등 데이터 무결성 중요일반 웹 서비스
  • 동기 복제 사용 시 synchronous_standby_names = 'ANY 1 (standby1, standby2)'로 다중 Standby를 구성하면 단일 장애점을 제거할 수 있습니다
  • 복제 슬롯은 Standby가 오래 다운되면 WAL이 쌓여 Primary 디스크를 소진할 수 있으므로 max_slot_wal_keep_size를 설정하세요
  • 프로덕션에서는 Patroni + etcd 조합으로 자동 페일오버를 구성하는 것을 강력히 권장합니다

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록