← 글 목록

PostgreSQL 레플리카 데이터베이스 구성: WAL로 스트리밍 복제

/ 9분 분량

두 대의 라즈베리파이4를 이용하여 PostgreSQL 스트리밍 복제 방식으로 레플리카 데이터베이스를 구축하는 과정을 정리해보았습니다. 운영DB의 변경 사항을 주기적으로 읽어와 테스트DB에 같은 스키마와 구조로 저장하고, 원본DB에 변화가 생기면 테스트DB도 같은 구조로 변하도록 하는 것이 목표였습니다. 이 과정에서 WAL, standby, re...

PostgreSQL 레플리카 데이터베이스 구성: WAL로 스트리밍 복제

두 대의 라즈베리파이4를 이용하여 PostgreSQL 스트리밍 복제 방식으로 레플리카 데이터베이스를 구축하는 과정을 정리해보았습니다. 운영DB의 변경 사항을 주기적으로 읽어와 테스트DB에 같은 스키마와 구조로 저장하고, 원본DB에 변화가 생기면 테스트DB도 같은 구조로 변하도록 하는 것이 목표였습니다. 이 과정에서 WAL, standby, recovery, quorum 등 PostgreSQL 레플리카의 핵심 개념들을 이해할 수 있었습니다.

학습 주제

  • 공부 주제: PostgreSQL 스트리밍 복제를 이용한 레플리카 데이터베이스 구축
  • 대화 제목: PostgreSQL 레플리카 데이터베이스 구성
  • 학습 날짜: 2026년 3월 1일

질문과 탐구

이번 학습의 시작은 운영 중인 PostgreSQL 데이터베이스(Node 1)의 데이터를 읽기 전용 복제본(Node 2)으로 주기적으로 동기화하는 방법을 찾는 것이었습니다. 구체적으로는 다음과 같은 질문을 가지고 탐구를 시작했습니다.

  • 어떻게 하면 Node 1의 데이터를 Node 2로 주기적으로 복사할 수 있을까?
  • 원본 DB에 변화가 생기면 테스트 DB도 자동으로 업데이트되게 하려면 어떻게 해야 할까?
  • 복제된 DB는 읽기만 가능하고 수정은 불가능하도록 설정할 수 있을까?
  • 두 대의 라즈베리파이4를 같은 네트워크에서 어떻게 연결하고 설정해야 할까?

이러한 질문들을 바탕으로 AI와 대화하며 스트리밍 복제라는 방식을 알게 되었고, 각 설정 파일(postgresql.conf, pg_hba.conf)과 명령어(pg_basebackup, systemctl, psql)의 역할을 이해하며 단계별로 설정을 진행했습니다.

핵심 학습 내용

1. PostgreSQL 스트리밍 복제 이해

스트리밍 복제는 PostgreSQL의 WAL(Write-Ahead Log)을 Primary 서버(Node 1)에서 Replica 서버(Node 2)로 실시간 전송하여 데이터베이스를 동기화하는 방식입니다. WAL은 데이터베이스 변경 사항을 기록하는 로그로, 이를 Replica로 전송함으로써 Primary의 모든 변경을 Replica에도 적용할 수 있습니다.

2. Primary (Node 1) 설정

  • postgresql.conf 수정:
    • wal_level = replica: 복제에 필요한 WAL 정보까지 기록하도록 설정합니다.
    • max_wal_senders = 3: 동시에 WAL을 보낼 수 있는 최대 프로세스 수를 설정합니다.
    • wal_keep_size = 64: Replica가 잠시 연결이 끊어졌을 때를 대비하여 WAL 파일을 보관하는 크기를 설정합니다.
    • listen_addresses = '*': 모든 IP 주소에서의 접속을 허용하도록 설정합니다.
  • pg_hba.conf 수정:
    • Replica 서버(Node 2)에서 replicator 계정으로 replication 목적의 접속을 scram-sha-256 방식으로 허용하도록 규칙을 추가했습니다. (host replication replicator 172.30.1.64/32 scram-sha-256)
  • 복제 전용 유저 생성:
    • CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'yourpassword';: 복제 권한만 가진 replicator 유저를 생성하고 비밀번호를 설정했습니다.

3. Replica (Node 2) 설정

  • PostgreSQL 버전 통일: Node 1과 Node 2의 PostgreSQL 메이저 버전이 같아야 하므로, Node 2에 설치된 구 버전(16)을 제거하고 Node 1과 동일한 버전(17)을 설치했습니다. 이 과정에서 PostgreSQL 공식 저장소를 추가하는 방법을 학습했습니다.
  • pg_basebackup: Node 1의 현재 DB 데이터를 Node 2로 통째로 복사하는 초기화 작업입니다. -h (host), -U (user), -D (directory), -P (progress), -Xs (WAL stream), -R (replica config) 옵션을 사용하여 진행했습니다. -R 옵션은 standby.signal 파일과 postgresql.auto.conf 파일을 자동으로 생성하여 Replica 설정을 간소화합니다.
  • postgresql.conf 수정:
    • hot_standby = on: Replica 상태에서도 읽기 쿼리를 허용하도록 설정합니다.
    • hot_standby_feedback = on: Replica에서 읽기 쿼리 실행 중임을 Primary에 알려 데이터 유실을 방지합니다.

4. 동작 확인

  • Node 2 (Replica) 확인: pg_is_in_recovery() 함수를 실행하여 t(true)가 나오면 Replica 모드로 정상 동작 중임을 확인했습니다. 또한 CREATE TABLE과 같은 쓰기 시도를 통해 cannot execute INSERT in a read-only transaction 에러가 발생하는 것을 확인하며 읽기 전용임을 검증했습니다.
  • Node 1 (Primary) 확인: pg_stat_replication 테이블을 조회하여 Node 2의 접속 상태, streaming 상태, WAL 동기화 상태(sent_lsn, write_lsn, replay_lsn 값 일치) 등을 확인했습니다.

이해한 내용

이번 학습을 통해 PostgreSQL 레플리카 구성의 핵심 원리를 명확히 이해했습니다.

  • WAL과 스트리밍 복제: 데이터베이스 변경이 WAL에 기록되고, 이 WAL이 스트리밍 방식으로 Replica로 전송되어 동기화된다는 흐름을 파악했습니다.
  • pg_basebackup의 역할: 최초 데이터베이스 전체 복사를 담당하며, Replica 설정에 필요한 파일들을 자동으로 생성해준다는 점을 알게 되었습니다.
  • standby.signal과 postgresql.auto.conf: standby.signal 파일의 존재 유무로 Primary와 Replica를 구분하며, postgresql.auto.conf는 Replica가 Primary에 접속하여 WAL을 수신하기 위한 연결 정보를 담고 있다는 것을 이해했습니다.
  • hot_standby와 hot_standby_feedback: Replica에서도 읽기가 가능하도록 하는 hot_standby와, 읽기 작업 중 Primary에서 데이터가 삭제되는 것을 방지하는 hot_standby_feedback의 중요성을 알게 되었습니다.
  • sync vs async 복제: 데이터 유실의 위험과 성능 간의 트레이드오프를 이해하고, 목적에 따라 적절한 방식을 선택해야 함을 배웠습니다.

실전 적용

이번 학습 내용은 다음과 같은 분야에 바로 적용할 수 있습니다.

  • 고가용성(HA) 시스템 구축: 운영 DB의 장애 발생 시 서비스 중단을 최소화하기 위한 백업 및 복구 시스템 구축의 기초가 됩니다.
  • 읽기 부하 분산: 대규모 트래픽이 발생하는 서비스에서 읽기 요청을 Replica DB로 분산시켜 Primary DB의 부하를 줄일 수 있습니다.
  • 테스트 환경 구축: 운영 DB와 동일한 데이터를 가진 독립적인 테스트 환경을 구축하여 안전하게 기능을 테스트할 수 있습니다.

실습 계획:
이번에 구축한 레플리카 환경에서 Node 1에 데이터를 추가, 수정, 삭제하는 작업을 수행하고 Node 2에 실시간으로 반영되는지 지속적으로 테스트할 계획입니다. 또한, Node 1을 강제로 종료하고 Node 2를 Primary로 승격시키는 작업을 수행하여 장애 복구 시나리오도 테스트해볼 예정입니다.

추가 학습 계획

  • 동기 복제(Synchronous Replication) 심화: synchronous_standby_names 설정을 다양하게 변경해보며 quorum 방식 등을 직접 구현하고 테스트하여 데이터 유실 없는 시스템 구축 방법을 더 깊이 연구하고 싶습니다.
  • 복제 지연(Replication Lag) 모니터링: pg_stat_replication의 lag 관련 컬럼들을 활용하여 복제 지연을 주기적으로 모니터링하고, 지연 발생 시 알림을 받는 시스템을 구축하는 방법을 학습할 예정입니다.
  • PostgreSQL 고가용성 솔루션: Patroni, repmgr 등 PostgreSQL의 고가용성을 더욱 강화해주는 외부 솔루션들에 대해 알아보고 비교 학습을 진행하고자 합니다.

참고 자료

  • PostgreSQL 공식 문서: 스트리밍 복제, WAL, pg_basebackup 관련 공식 문서들