#9 - WSL PostgreSQL 17 Master-Replica 구축 가이드
중년개발자
@loxo
13일 전
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
- Master: Port
1단계: WSL 인스턴스 준비 (Export & Import)
Windows **PowerShell(관리자 권한)**에서 실행합니다.
1.1 기존 배포판 내보내기
기존 Debian 배포판(예: Debian)을 tar 파일로 추출합니다.
# C:\WSL 폴더가 없다면 생성
mkdir C:\WSL
# 기존 Debian 이미지를 파일로 저장
wsl --export Debian C:\WSL\debian_base.tar
1.2 Master 및 Replica 인스턴스 생성
추출한 이미지를 기반으로 두 개의 독립된 WSL 인스턴스를 생성합니다.
# 각 인스턴스용 폴더 생성
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) 양쪽 모두 동일하게 수행합니다.
# 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 생성
# 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 설정을 확인합니다.
sudo nano /etc/postgresql/17/main/postgresql.conf
- 다음 항목을 찾아 수정하거나 주석을 해제합니다.
listen_addresses = '*' # 모든 IP(localhost 포함) 허용
wal_level = replica # 기본값이지만 확인
max_wal_senders = 10
port = 5432 # (기본값 유지)
3.3 인증 설정 (pg_hba.conf)
Replica가 127.0.0.1을 통해 접속할 수 있도록 허용합니다.
sudo nano /etc/postgresql/17/main/pg_hba.conf
- 파일 맨 아래에 다음 줄을 추가합니다.
# TYPE DATABASE USER ADDRESS METHOD
host replication replicator 127.0.0.1/32 scram-sha-256
3.4 Master 재시작
sudo service postgresql restart
4단계: Replica 서버 구성 (초기화 및 백업)
[Terminal: pg-replica] 에서만 수행합니다.
4.1 사전 준비 (매우 중요: 디렉터리 생성)
Master와 파일 시스템이 다르므로, Master가 사용하는 Tablespace 경로를 미리 생성해두어야 합니다.
# 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)에서 데이터를 복제합니다.
# 암호 입력 프롬프트가 뜨면 '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)
# 데이터 디렉터리 내의 설정 파일을 수정하는 것이 확실합니다.
sudo nano /etc/postgresql/17/main/postgresql.conf
# 또는 sudo nano /var/lib/postgresql/17/main/postgresql.conf
- 반드시 수정해야 할 항목:
port = 5433 # 5432 -> 5433 변경
- (선택 사항) 클러스터 이름 변경:
cluster_name = '17/replica'
5.2 연결 정보 확인 (postgresql.auto.conf)
-R 옵션으로 생성된 자동 설정 파일을 확인합니다.
cat /var/lib/postgresql/17/main/postgresql.auto.conf
- 내용 중
primary_conninfo에port=5432가 적혀 있어야 합니다. (Master는 5432번이 맞으므로 수정하지 않습니다.)
5.3 Replica 서비스 시작
sudo service postgresql start
6단계: 최종 검증
6.1 포트 리스닝 확인
아무 터미널에서나 실행:
ss -nlt
- 결과에
127.0.0.1:5432(Master)와127.0.0.1:5433(Replica)가 모두 보여야 합니다.
6.2 복제 상태 확인 (Master)
[Terminal: pg-master]
sudo -u postgres psql -p 5432 -c "SELECT pid, client_addr, state, sync_state FROM pg_stat_replication;"
- 성공 기준:
client_addr가127.0.0.1,state가streaming으로 표시됨.
6.3 데이터 동기화 및 Tablespace 확인
[Terminal: pg-master] (데이터 입력)
sudo -u postgres psql -p 5432 -c "INSERT INTO master_table (memo) VALUES ('Replication Test Success');"
[Terminal: pg-replica] (데이터 조회)
# 포트 5433으로 접속
sudo -u postgres psql -p 5433 -c "SELECT * FROM master_table;"
- 성공 기준: 방금 입력한
Replication Test Success데이터가 조회됨.
[Terminal: pg-replica] (읽기 전용 확인)
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 구성이 완료되었습니다.