PostgreSQL 스트리밍 복제(Streaming Replication)는 마스터(Primary) 노드에서 생성되는 WAL(Write-Ahead Log) 데이터를 슬레이브(Standby) 노드에 실시간으로 전송하는 기술입니다. 이를 통해 거의 실시간에 가까운 데이터베이스 복제본을 유지할 수 있으며, 장애 발생 시 빠른 복구와 고가용성(HA), 무중단 서비스 운영이 가능해집니다.
기본 아키텍처는 다음과 같습니다.
- Master 노드: 읽기/쓰기(Read/Write) 처리, WAL 생성 및 전송
- Slave 1, Slave 2 노드: 읽기 전용(Read-only)으로 동작하며 WAL을 수신해 데이터 동기화
1. 마스터 노드 설정
1-1. WAL 아카이빙 활성화
마스터 노드의 postgresql.conf 파일을 열어 다음 설정을 추가하거나 수정합니다.
archive_mode = on archive_command = 'cp %p /var/lib/pgsql/12/archive/%f' wal_level = replica max_wal_senders = 3
wal_level = replica: 복제에 필요한 최소한의 WAL 정보를 기록합니다.max_wal_senders = 3: 동시에 접속할 수 있는 복제 슬레이브의 최대 수를 지정합니다.
1-2. 복제 연결 허용
pg_hba.conf 파일에 슬레이브 노드가 복제 계정으로 접속할 수 있도록 규칙을 추가합니다.
# TYPE DATABASE USER ADDRESS METHOD host replication repluser 192.168.1.20/32 md5
1-3. 복제 전용 사용자 생성
psql 또는 SQL 클라이언트에서 복제 전용 역할(Role)을 생성합니다.
CREATE ROLE repluser WITH REPLICATION LOGIN PASSWORD 'securepass';
위 설정을 모두 마쳤다면 변경 사항을 적용하기 위해 마스터 노드에서 PostgreSQL 서비스를 재시작합니다.
sudo systemctl restart postgresql-12
2. 슬레이브 노드 설정
2-1. 마스터로부터 베이스 백업 수행
슬레이브 노드에서 pg_basebackup 유틸리티를 사용해 마스터의 데이터 디렉터리를 복제합니다.
sudo -u postgres pg_basebackup -h master_ip -D /var/lib/pgsql/12/data -U repluser -P -R
-P: 백업 진행 상황을 표시합니다.-R: 복제 관련 설정 파일을 자동으로 생성합니다.
2-2. 스탠바이 모드 설정
PostgreSQL 11 이전 버전에서는 /var/lib/pgsql/12/data/recovery.conf 파일을 직접 작성했지만, PostgreSQL 12부터는 recovery.conf가 폐지되고 대신 standby.signal 파일과 postgresql.conf 설정을 사용합니다. 참고로 위의 pg_basebackup -R 옵션을 사용하면 이 과정이 자동으로 처리됩니다.
수동으로 설정할 경우의 예시는 다음과 같습니다.
# standby.signal 파일 생성 touch /var/lib/pgsql/12/data/standby.signal # postgresql.conf에 추가 primary_conninfo = 'host=master_ip port=5432 user=repluser password=securepass' restore_command = 'cp /var/lib/pgsql/12/archive/%f "%p"'
2-3. 슬레이브 노드 시작
설정이 완료되면 슬레이브 노드에서 PostgreSQL을 시작하고 부팅 시 자동 실행되도록 등록합니다.
sudo systemctl start postgresql-12 sudo systemctl enable postgresql-12
3. 복제 상태 확인
마스터 노드에서 다음 쿼리를 실행하면 현재 접속 중인 복제 슬레이브 목록을 확인할 수 있습니다.
SELECT client_addr, state, sync_state FROM pg_stat_replication;
정상적으로 복제가 설정되었다면 다음과 같은 결과가 출력됩니다.
client_addr | state | sync_state ---------------+-----------+------------ 192.168.1.20 | streaming | async
state 값이 streaming이면 WAL이 실시간으로 전송되고 있는 것입니다.
4. 수동 페일오버(Failover)
마스터 노드에 장애가 발생한 경우 다음 순서로 슬레이브를 새 마스터로 승격(Promote)할 수 있습니다.
- 장애가 발생한 기존 마스터와의 복제 연결을 해제합니다.
- 승격할 슬레이브에서
recovery_target_timeline = 'latest'설정을 확인합니다(PostgreSQL 12에서는postgresql.conf에 설정). - 해당 슬레이브에서 PostgreSQL을 재시작하여 새 마스터로 승격시킵니다.
- 나머지 슬레이브들이
pg_stat_replication을 통해 새 마스터에 정상 접속하는지 확인합니다.
결론
CentOS 8 환경에서 PostgreSQL 12 스트리밍 복제를 구축하는 핵심 절차는 다음과 같습니다. 먼저 마스터 노드에서 WAL 아카이빙과 복제 접근 권한을 설정하고, 슬레이브 노드에서는 베이스 백업과 스탠바이 모드 설정을 진행합니다. 이후 pg_stat_replication 뷰로 복제 상태를 검증하고, 필요 시 수동 페일오버를 통해 슬레이브를 새 마스터로 승격하면 됩니다. 이러한 구성은 데이터 손실을 최소화하면서 서비스 가용성을 크게 향상시키는 안정적인 고가용성 아키텍처의 기반이 됩니다.