PostgreSQL 스트리밍 복제 설정 단계별 가이드
스트리밍 복제는 PostgreSQL 환경에서 고가용성(HA) 및 읽기 확장성(read scalability)을 달성하기 위한 기본적인 메커니즘입니다. 주(master) 서버가 하나 이상의 대기(replica) 서버로 쓰기 선행 로그(WAL) 레코드를 지속적으로 스트리밍하도록 구성함으로써, 최소한의 지연으로 데이터 동기화를 보장합니다.
이 포괄적인 가이드는 강력하고 비동기적인 스트리밍 복제를 구축하는 데 필요한 필수 단계를 안내합니다. 우리는 Primary 및 Standby 서버 모두에 필요한 구성 변경 사항을 다루며, 간소화된 설정을 위해 pg_basebackup 및 시그널 파일과 같은 최신 PostgreSQL 기능을 활용합니다. 이 튜토리얼을 따르면 견고한 PostgreSQL 운영을 위한 신뢰할 수 있는 기반을 갖추게 될 것입니다.
사전 요구 사항 및 환경 설정
시작하기 전에 다음 사전 요구 사항이 충족되었는지 확인하십시오. 이 가이드는 동일한 주 버전의 PostgreSQL(버전 12 이상 권장)을 실행하는 두 개의 서버(Primary 및 Standby)를 가정합니다.
| 서버 | 역할 | IP 주소 (예시) |
|---|---|---|
| Primary | 데이터 원본 (Source of truth) | 192.168.1.10 |
| Standby | 복제본 (Replica) | 192.168.1.11 |
- 사용자: 두 서버 모두에 관리자 액세스 권한(예:
sudo또는postgres시스템 사용자)이 있어야 합니다. - 네트워크: Standby 서버는 PostgreSQL 포트(기본값 5432)를 통해 Primary 서버에 연결할 수 있어야 합니다.
1단계: Primary 서버 구성
Primary 서버는 복제를 위해 WAL 파일을 생성하고 제공하도록 구성되어야 합니다.
1.1 postgresql.conf 수정
일반적으로 데이터 디렉터리(예: /etc/postgresql/14/main/postgresql.conf)에 있는 기본 구성 파일을 편집하고 다음 매개변수를 설정하십시오:
# 다른 호스트로부터의 연결 허용
listen_addresses = '*'
# WAL 수준을 'replica' 이상으로 설정
wal_level = replica
# 대기 서버로부터의 최대 동시 연결 수
max_wal_senders = 5
# 동시에 활성화될 수 있는 대기 연결 수를 제어
max_replication_slots = 5
# 대기 서버에서의 읽기 전용 쿼리(Hot Standby)에 필요
hot_standby = on
1.2 전용 복제 사용자 생성
보안을 위해 REPLICATION 속성을 가진 특정 사용자를 생성합니다. 이 사용자는 대기 서버가 WAL 레코드를 가져오는 데만 사용됩니다.
# PostgreSQL에 연결
psql -c "CREATE USER replica_user REPLICATION ENCRYPTED PASSWORD 'SuperSecurePassword123';"
1.3 클라이언트 인증 업데이트 (pg_hba.conf)
Standby 서버의 IP 주소에서 복제 사용자가 특수 replication 의사 데이터베이스에 연결할 수 있도록 허용합니다.
# TYPE DATABASE USER ADDRESS METHOD
host replication replica_user 192.168.1.11/32 md5
1.4 Primary 서버 재시작
PostgreSQL 서비스를 재시작하여 변경 사항을 적용합니다:
sudo systemctl restart postgresql
2단계: Standby 서버 준비
데이터를 복제하기 전에 Standby의 PostgreSQL 서비스가 중지되었는지, 기존 데이터 디렉터리가 비워졌는지 확인하십시오.
2.1 Standby PostgreSQL 서비스 중지
sudo systemctl stop postgresql
2.2 데이터 디렉터리 정리
경고: 이 단계는 현재 Standby의 데이터 디렉터리에 있는 모든 데이터를 영구적으로 삭제합니다. 실행하기 전에 경로를 확인하십시오.
# PG 14의 예시 경로
PG_DATA=/var/lib/postgresql/14/main
sudo rm -rf $PG_DATA/*
2.3 pg_basebackup을 사용하여 데이터 복제
pg_basebackup을 사용하여 Primary의 데이터 디렉터리 사본을 정확히 생성합니다. -R 플래그는 스트리밍 복제에 필요한 구성 파일(standby.signal 및 primary_conninfo)을 자동으로 생성하므로 매우 중요합니다(PostgreSQL 12+).
이 명령을 Standby 서버에서 실행하십시오:
PG_DATA=/var/lib/postgresql/14/main
sudo -u postgres pg_basebackup -h 192.168.1.10 -D $PG_DATA -U replica_user -P -v -R
| 옵션 | 설명 |
|---|---|
-h |
Primary 서버 호스트 이름/IP 주소. |
-D |
로컬 데이터 디렉터리 경로. |
-U |
복제 사용자 이름 (replica_user). |
-P |
진행률 표시. |
-v |
상세 출력. |
-R |
복제 구성 파일을 자동으로 생성. |
3단계: Standby 구성 및 시작
3.1 Standby 구성 확인
2.3단계에서 -R 플래그를 사용했다면, pg_basebackup은 standby.signal 파일을 생성하고, 일반적으로 데이터 디렉터리 내에 생성된 postgresql.auto.conf 파일에 primary_conninfo 설정을 채워 넣습니다.
primary_conninfo 문자열의 내용을 확인하십시오. ( $PG_DATA/postgresql.auto.conf 내부를 확인) 다음과 유사해야 합니다:
primary_conninfo = 'host=192.168.1.10 user=replica_user password=SuperSecurePassword123 application_name=standby_node'
팁: 암호가
primary_conninfo에 포함되어 있는지 또는 인증서 기반 인증을 사용하고 있는지 확인하십시오.trust또는cert로pg_hba.conf를 사용하는 경우 암호는 생략될 수 있습니다.
3.2 Standby 서비스 시작
필수 시그널 파일(standby.signal)이 데이터 디렉터리에 있으므로, 서비스는 읽기 전용 Standby 모드로 시작되며 즉시 Primary에 연결을 시도합니다.
sudo systemctl start postgresql
4단계: 스트리밍 복제 확인
Standby를 시작한 후, 연결이 활성화되어 있고 데이터 동기화가 진행 중인지 확인해야 합니다.
4.1 Primary 서버에서 확인
Primary 서버에 연결하고 pg_stat_replication 뷰를 쿼리합니다. Standby 서버의 연결을 나타내는 행이 표시되어야 합니다.
psql -c "SELECT client_addr, state, sync_state, sent_lsn, write_lsn, flush_lsn FROM pg_stat_replication;"
예상 출력 (핵심 필드):
client_addr: Standby 서버의 IP와 일치해야 합니다(예:192.168.1.11).state:streaming이어야 합니다.startup또는catching up이 표시되면 잠시 기다리십시오.walsender가 시작 중이면 곧 연결될 것입니다.sync_state:async여야 합니다(표준 비동기 복제의 경우).
4.2 데이터 동기화 테스트
데이터 흐름을 확인하려면 Primary에서 변경 사항을 실행하고 즉시 Standby에서 그 존재를 확인하십시오.
Primary에서:
CREATE TABLE replication_test (id serial primary key, message text);
INSERT INTO replication_test (message) VALUES ('Data synchronized successfully');
Standby에서 (읽기 전용):
-- 오류 없이 성공해야 합니다
psql -c "SELECT * FROM replication_test;"
Standby에서 데이터가 확인되면 스트리밍 복제가 성공적으로 구성되고 활성화된 것입니다.
모범 사례 및 문제 해결
지속적인 연결: 복제 슬롯
선택 사항이지만, 복제 슬롯(replication slots)은 강력히 권장됩니다. 복제 슬롯은 Standby가 일시적으로 연결을 끊더라도 Primary 서버가 Standby에 필요한 WAL 세그먼트를 시기상조로 폐기하지 않도록 보장합니다.
Primary에서:
SELECT * FROM pg_create_physical_replication_slot('standby_slot_name');
그런 다음, Standby의 primary_conninfo를 업데이트하여 이 슬롯을 사용하도록 합니다:
primary_conninfo = 'host=192.168.1.10 user=replica_user ... application_name=standby_node **slotname=standby_slot_name**'
경고: 복제 슬롯은 주의 깊게 모니터링해야 합니다. Standby가 장기간 실패하면 슬롯에 의해 보호되는 누적된 WAL 파일이 Primary 서버의 디스크 공간을 빠르게 채울 수 있습니다.
일반적인 문제 해결
| 문제 | 잠재적 원인 | 해결책 |
|---|---|---|
Standby가 starting에 멈춤 |
Primary의 네트워크 방화벽 또는 잘못된 pg_hba.conf. |
포트 5432가 열려 있는지 확인하고; pg_hba.conf 항목이 Standby IP 및 사용자와 일치하는지 확인합니다. |
인증 오류로 pg_basebackup 실패 |
암호 오류 또는 pg_hba.conf에 호스트 항목 누락. |
replica_user의 암호를 다시 확인하고; pg_hba.conf를 수정한 후 Primary 데이터베이스가 재시작되었는지 확인합니다. |
| Standby가 읽기 전용임 | 이는 예상된 동작입니다. | standby.signal 파일의 존재는 서버를 복구 모드로 강제 진입시킵니다. |
결론
스트리밍 복제 설정은 복원력 있는 PostgreSQL 아키텍처를 구축하는 데 있어 중요한 단계입니다. 이 단계를 따르면 지속적인 데이터 동기화를 보장하는 Primary-Standby 쌍을 성공적으로 구성했으며, 이는 시스템의 고가용성 기능을 크게 향상시킵니다. 다음 논리적인 단계는 HA 설정을 완전히 자동화하기 위해 모니터링 솔루션 및 페일오버 메커니즘(Patroni 또는 Repmgr와 같은)을 통합하는 것입니다.