PostgreSQL
강의

#9 - WSL PostgreSQL 17 Master-Replica 구축 가이드

중년개발자
중년개발자

@loxo

13일 전

22

WSL PostgreSQL 17 Master-Replica 구축 가이드

이 문서는 WSL 2 환경에서 Debian 배포판을 복제하여 PostgreSQL 17 Streaming Replication을 구축하는 전체 절차를 다룹니다.

📋 환경 및 전제 조건

  • Infrastructure: WSL 2 (Windows Subsystem for Linux)
  • Base Image: Debian (기존에 설치된 배포판)
  • Network: WSL은 모든 인스턴스가 127.0.0.1을 공유함. 따라서 포트로 구분.
    • Master: Port 5432 / Tablespace: /var/lib/postgresql/ts_data
    • Replica: Port 5433 / Tablespace: /var/lib/postgresql/ts_data

1단계: WSL 인스턴스 준비 (Export & Import)

Windows **PowerShell(관리자 권한)**에서 실행합니다.

1.1 기존 배포판 내보내기

기존 Debian 배포판(예: Debian)을 tar 파일로 추출합니다.

powershell
# C:\WSL 폴더가 없다면 생성 mkdir C:\WSL # 기존 Debian 이미지를 파일로 저장 wsl --export Debian C:\WSL\debian_base.tar

1.2 Master 및 Replica 인스턴스 생성

추출한 이미지를 기반으로 두 개의 독립된 WSL 인스턴스를 생성합니다.

powershell
# 각 인스턴스용 폴더 생성 mkdir C:\WSL\pg-master mkdir C:\WSL\pg-replica # 인스턴스 등록 (Import) wsl --import pg-master C:\WSL\pg-master C:\WSL\debian_base.tar wsl --import pg-replica C:\WSL\pg-replica C:\WSL\debian_base.tar # 생성 확인 wsl -l -v

2단계: PostgreSQL 17 설치 (공통)

이제부터는 각 WSL 터미널을 열어서 작업을 진행합니다.
**Master(pg-master)**와 Replica(pg-replica) 양쪽 모두 동일하게 수행합니다.

bash
# 1. 패키지 리스트 업데이트 및 필수 도구 설치 sudo apt update && sudo apt install -y curl gpg gnupg2 lsb-release # 2. PostgreSQL 공식 GPG 키 추가 curl -fsSL [https://www.postgresql.org/media/keys/ACCC4CF8.asc](https://www.postgresql.org/media/keys/ACCC4CF8.asc) | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg # 3. 저장소(Repository) 추가 echo "deb [http://apt.postgresql.org/pub/repos/apt](http://apt.postgresql.org/pub/repos/apt) $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list # 4. PostgreSQL 17 설치 sudo apt update sudo apt install -y postgresql-17 # 5. 서비스 시작 확인 sudo service postgresql start

3단계: Master 서버 구성

[Terminal: pg-master] 에서만 수행합니다.

3.1 복제용 사용자 및 Tablespace 생성

bash
# postgres 계정으로 접속 sudo -u postgres psql -- (SQL 모드 진입) -- -- 1. 복제(Replication) 권한을 가진 유저 생성 CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'secret_pass'; -- 2. Tablespace 생성을 위해 잠시 쉘로 나가기 \q -- (Shell 모드) Tablespace 디렉터리 생성 sudo mkdir -p /var/lib/postgresql/ts_data sudo chown postgres:postgres /var/lib/postgresql/ts_data sudo chmod 700 /var/lib/postgresql/ts_data -- 다시 SQL 접속 sudo -u postgres psql -- (SQL 모드) Tablespace 등록 CREATE TABLESPACE my_ts LOCATION '/var/lib/postgresql/ts_data'; -- 3. 테스트용 테이블 생성 (Tablespace 지정) CREATE TABLE master_table (id serial primary key, memo text) TABLESPACE my_ts; INSERT INTO master_table (memo) VALUES ('Data from Master'); -- 종료 \q

3.2 설정 파일 수정 (postgresql.conf)

외부(Replica) 접속을 허용하고 WAL 설정을 확인합니다.

bash
sudo nano /etc/postgresql/17/main/postgresql.conf
  • 다음 항목을 찾아 수정하거나 주석을 해제합니다.
ini
listen_addresses = '*' # 모든 IP(localhost 포함) 허용 wal_level = replica # 기본값이지만 확인 max_wal_senders = 10 port = 5432 # (기본값 유지)

3.3 인증 설정 (pg_hba.conf)

Replica가 127.0.0.1을 통해 접속할 수 있도록 허용합니다.

bash
sudo nano /etc/postgresql/17/main/pg_hba.conf
  • 파일 맨 아래에 다음 줄을 추가합니다.
text
# TYPE DATABASE USER ADDRESS METHOD host replication replicator 127.0.0.1/32 scram-sha-256

3.4 Master 재시작

bash
sudo service postgresql restart

4단계: Replica 서버 구성 (초기화 및 백업)

[Terminal: pg-replica] 에서만 수행합니다.

4.1 사전 준비 (매우 중요: 디렉터리 생성)

Master와 파일 시스템이 다르므로, Master가 사용하는 Tablespace 경로를 미리 생성해두어야 합니다.

bash
# 1. 서비스 중지 sudo service postgresql stop # 2. Master와 동일한 Tablespace 경로 생성 sudo mkdir -p /var/lib/postgresql/ts_data sudo chown postgres:postgres /var/lib/postgresql/ts_data sudo chmod 700 /var/lib/postgresql/ts_data # (혹시 파일이 있다면 삭제) sudo rm -rf /var/lib/postgresql/ts_data/* # 3. 기존 데이터 디렉터리 초기화 (삭제) sudo rm -rf /var/lib/postgresql/17/main/*

4.2 Base Backup 실행 (데이터 가져오기)

Master(127.0.0.1:5432)에서 데이터를 복제합니다.

bash
# 암호 입력 프롬프트가 뜨면 'secret_pass' 입력 sudo -u postgres pg_basebackup \ -h 127.0.0.1 \ -p 5432 \ -U replicator \ -D /var/lib/postgresql/17/main \ -R \ -v -P --wal-method=stream

참고: -T 옵션은 사용하지 않습니다. WSL 인스턴스끼리는 파일 시스템이 격리되어 있어 경로 충돌이 발생하지 않으므로, Master와 동일한 경로를 사용합니다.


5단계: Replica 포트 변경 및 실행

[Terminal: pg-replica] 에서 계속 수행합니다.
pg_basebackup은 설정 파일까지 복제하므로 포트가 5432로 되어 있습니다. 이를 5433으로 변경해야 합니다.

5.1 포트 변경 (postgresql.conf)

bash
# 데이터 디렉터리 내의 설정 파일을 수정하는 것이 확실합니다. sudo nano /etc/postgresql/17/main/postgresql.conf # 또는 sudo nano /var/lib/postgresql/17/main/postgresql.conf
  • 반드시 수정해야 할 항목:
ini
port = 5433 # 5432 -> 5433 변경
  • (선택 사항) 클러스터 이름 변경:
ini
cluster_name = '17/replica'

5.2 연결 정보 확인 (postgresql.auto.conf)

-R 옵션으로 생성된 자동 설정 파일을 확인합니다.

bash
cat /var/lib/postgresql/17/main/postgresql.auto.conf
  • 내용 중 primary_conninfoport=5432가 적혀 있어야 합니다. (Master는 5432번이 맞으므로 수정하지 않습니다.)

5.3 Replica 서비스 시작

bash
sudo service postgresql start

6단계: 최종 검증

6.1 포트 리스닝 확인

아무 터미널에서나 실행:

bash
ss -nlt
  • 결과에 127.0.0.1:5432 (Master)와 127.0.0.1:5433 (Replica)가 모두 보여야 합니다.

6.2 복제 상태 확인 (Master)

[Terminal: pg-master]

bash
sudo -u postgres psql -p 5432 -c "SELECT pid, client_addr, state, sync_state FROM pg_stat_replication;"
  • 성공 기준: client_addr127.0.0.1, statestreaming으로 표시됨.

6.3 데이터 동기화 및 Tablespace 확인

[Terminal: pg-master] (데이터 입력)

bash
sudo -u postgres psql -p 5432 -c "INSERT INTO master_table (memo) VALUES ('Replication Test Success');"

[Terminal: pg-replica] (데이터 조회)

bash
# 포트 5433으로 접속 sudo -u postgres psql -p 5433 -c "SELECT * FROM master_table;"
  • 성공 기준: 방금 입력한 Replication Test Success 데이터가 조회됨.

[Terminal: pg-replica] (읽기 전용 확인)

bash
sudo -u postgres psql -p 5433 -c "INSERT INTO master_table (memo) VALUES ('Fail');"
  • 성공 기준: cannot execute INSERT in a read-only transaction 에러 발생.

수고하셨습니다! WSL 환경에서 PostgreSQL 17 Master-Replica 구성이 완료되었습니다.

#WSL#PostgreSQL#Streaming Replication#Master-Replica#Linux

댓글 0

Ctrl + Enter를 눌러 등록할 수 있습니다
※ AI 다듬기는 내용을 정제하는 보조 기능이며, 최종 내용은 사용자가 확인해야 합니다.