PostgreSQL 데이터베이스 복제(Replication)와 고가용성(HA) 구성 가이드
PostgreSQL의 복제(Replication) 방식과 이를 활용한 고가용성(HA) 구성 방법을 이해하고 실제 환경에 적용하는 데 필요한 개념과 단계를 안내합니다.
PostgreSQL 데이터베이스 복제(Replication)와 고가용성(HA) 구성
PostgreSQL의 복제는 데이터베이스의 가용성과 내구성을 향상시키는 핵심 기술입니다. 복제를 통해 여러 PostgreSQL 서버 간에 데이터를 동기화하여 장애 발생 시 서비스 중단 시간을 최소화하고, 읽기 부하를 분산할 수 있습니다.
1. 복제의 종류
PostgreSQL은 크게 두 가지 복제 방식을 지원합니다.
-
물리 복제 (Physical Replication):
- 개념: WAL(Write-Ahead Logging) 세그먼트를 복제하는 방식으로, 마스터 서버에서 발생하는 모든 변경 사항을 로그 스트림을 통해 복제 대상 서버(스탠바이)로 전송합니다.
- 특징: 디스크 블록 수준에서 복제되므로 설정이 비교적 간단하고, 복제 지연이 적습니다. 마스터와 스탠바이 서버의 PostgreSQL 버전, OS, 하드웨어 구성이 동일해야 합니다.
- 주요 사용 사례: 장애 복구(Failover), 재해 복구(Disaster Recovery), 읽기 전용(Read-only) 워크로드 분산.
-
논리 복제 (Logical Replication):
- 개념: 데이터 변경 사항을 SQL 문이 아닌 논리적 변경(INSERT, UPDATE, DELETE 등)으로 변환하여 복제합니다. 복제 대상 테이블의 컬럼, 데이터 타입, 제약 조건 등이 마스터와 달라도 됩니다.
- 특징: 특정 테이블이나 데이터만 선택적으로 복제할 수 있으며, 마스터와 스탠바이 간의 구조적 차이를 허용합니다. 데이터 변환, 필터링 등 유연한 복제 구성이 가능합니다.
- 주요 사용 사례: 이기종 데이터베이스 간 복제, 데이터 웨어하우징, 점진적인 업그레이드.
2. 복제 구성 단계 (물리 복제 예시)
물리 복제를 구성하는 일반적인 단계는 다음과 같습니다.
-
마스터 서버 설정:
postgresql.conf파일 수정:wal_level = replica(또는logical)max_wal_senders = 5(동시에 보낼 WAL 송신자의 최대 개수)wal_keep_segments = 100(스탠바이가 따라잡을 때까지 보관할 WAL 파일 수)archive_mode = on(선택 사항, WAL 아카이빙을 설정하면 복구 유연성 증가)archive_command = 'cp %p /path/to/archive/%f'(WAL 아카이빙 명령)
pg_hba.conf파일 수정:- 복제 연결을 허용할 스탠바이 서버의 IP 주소 또는 서브넷을 추가합니다.
host replication replication_user <standby_ip>/32 md5
-
복제 사용자 생성:
- 마스터 서버에서 복제 전용 사용자를 생성하고 복제 권한을 부여합니다.
CREATE USER replication_user REPLICATION LOGIN PASSWORD 'your_password';
-
스탠바이 서버 준비:
- 마스터 서버의 데이터를 백업합니다.
pg_basebackup도구를 사용하는 것이 일반적입니다. pg_basebackup -h <master_ip> -U replication_user -D /var/lib/postgresql/data -Fp -Xs -P- 스탠바이 서버의
postgresql.conf파일 수정:hot_standby = on(읽기 전용 쿼리를 허용하려면)primary_conninfo = 'host=<master_ip> port=5432 user=replication_user password=your_password'
- 스탠바이 서버의
recovery.conf파일 생성 (PostgreSQL 9.6 이하) 또는postgresql.conf내primary_conninfo설정 (PostgreSQL 10 이상):standby_mode = 'on'primary_conninfo = 'host=<master_ip> port=5432 user=replication_user password=your_password'- (PostgreSQL 10 이상에서는
recovery.conf파일이 사라지고postgresql.conf파일에primary_conninfo등을 설정합니다.)
- 마스터 서버의 데이터를 백업합니다.
-
PostgreSQL 서비스 재시작:
- 마스터 및 스탠바이 서버 모두에서 PostgreSQL 서비스를 재시작합니다.
-
복제 상태 확인:
- 마스터 서버의
pg_stat_replication뷰를 통해 스탠바이 서버의 연결 상태를 확인할 수 있습니다. SELECT * FROM pg_stat_replication;- 스탠바이 서버에서
pg_stat_wal_receiver뷰를 통해 수신 상태를 확인할 수 있습니다. SELECT * FROM pg_stat_wal_receiver;
- 마스터 서버의
3. 고가용성(HA) 구성
복제만으로는 자동 장애 조치(Automatic Failover)가 이루어지지 않습니다. 고가용성(HA) 환경을 구축하려면 복제된 서버들 간의 장애 감지 및 자동 장애 조치를 담당하는 외부 도구나 솔루션이 필요합니다.
- 주요 HA 솔루션:
- Patroni: Python으로 작성된 오픈소스 HA 솔루션으로, etcd, Consul, ZooKeeper와 같은 분산 키-값 저장소를 사용하여 클러스터 상태를 관리하고 자동 장애 조치를 수행합니다. PostgreSQL 복제 관리, 리더 선출, 장애 감지 등을 지원합니다.
- Repmgr: PostgreSQL 복제 및 장애 조치를 위한 도구 모음입니다. 클러스터 관리, 스탠바이 승격, 장애 조치 등을 지원합니다.
- PgBouncer/Pgpool-II: 연결 풀링 및 로드 밸런싱 기능 외에 복제 관리 및 장애 조치 기능을 일부 지원합니다.
4. 주의사항
- 데이터 일관성: 논리 복제는 데이터 변경 사항의 순서가 중요하므로, 복제 지연이 발생하면 일관성 문제가 발생할 수 있습니다. 물리 복제는 WAL 스트리밍으로 순서를 보장합니다.
- 네트워크: 마스터와 스탠바이 서버 간의 안정적인 네트워크 연결이 필수적입니다.
- 디스크 공간: WAL 파일이 쌓이므로 충분한 디스크 공간 확보가 중요합니다.
- 모니터링: 복제 지연, 스탠바이 서버 상태 등을 지속적으로 모니터링해야 합니다.
- 보안: 복제 연결 시 SSL/TLS를 사용하여 통신을 암호화하는 것이 좋습니다.
5. 짧은 예시 (물리 복제 pg_basebackup)
마스터 서버에서:
sudo -u postgres pg_dumpall > dump.sql
스탠바이 서버에서 (데이터 디렉토리를 비우거나 초기화 후):
pg_basebackup -h master_ip -p 5432 -U replication_user -D /var/lib/postgresql/14/main -Fp -Xs -P -W
이 가이드라인을 바탕으로 실제 환경에 맞는 복제 및 HA 구성을 진행하시기 바랍니다.