본문 바로가기
Database

PostgreSQL 클러스터 구성하기(3)

by kmkhm 2025. 6. 18.

이전 단계에서 etcd 클러스터를 정상적으로 구성했다면, 이제는 본격적으로 PostgreSQL과 Patroni를 이용한 데이터베이스 클러스터를 구성할 차례입니다. 이번 글에서는 각 노드에 PostgreSQL 16을 설치하고, Patroni 설정을 통해 클러스터를 구성하는 과정을 정리해보겠습니다.

 

1. PostgreSQL 설치

Patroni는 PostgreSQL을 직접 구동하고 관리하기 때문에, systemd로 실행되는 기본 PostgreSQL 데몬은 꺼두는 게 좋습니다. 먼저 PostgreSQL 16을 설치하겠습니다.

# 1. 필수 도구 설치
sudo apt install -y wget gnupg lsb-release

# 2. GPG 키 등록
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /usr/share/keyrings/postgresql.gpg

# 3. 저장소 추가
echo "deb [signed-by=/usr/share/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

# 4. 저장소 반영 및 PostgreSQL 설치
sudo apt update
sudo apt install -y postgresql-16

psql --version

 

Ubuntu 저장소를 통해 PostgreSQL 설치가 완료되면, 기본적으로 시스템 서비스로 등록되어 자동 실행되도록 설정됩니다. 이후 Patroni를 통해 PostgreSQL을 직접 제어할 예정이므로, 기본 PostgreSQL 서비스를 중지하고, 부팅 시 자동 실행되지 않도록 비활성화해줍니다.

sudo systemctl stop postgresql
sudo systemctl disable postgresql

 

 

2. Patroni 설치

이제 etcd를 통한 클러스터 기반의 PostgreSQL 고가용성을 구현하기 위해 Patroni를 설치합니다. Patroni는 Python 기반으로 동작하기 때문에 먼저 가상환경을 구성하고 설치를 진행하겠습니다. 

mkdir -p ~/patroni
cd ~/patroni

# 가상환경 생성
python3 -m venv venv
source venv/bin/activate

# pip 업그레이드
pip install --upgrade pip

# patroni 및 필수 패키지 설치
pip install patroni[etcd]
pip install psycopg2-binary

 

프로젝트별로 독립된 환경을 유지하기 위해 가상환경을 만들어두었습니다. patroni[etcd]는 etcd 연동 기능 포함, psycopg2-binary는 PostgreSQL 접속용 드라이버입니다.

 

3. Patroni 설정 파일 및 초기 스크립트 작성

각 노드들에 patroni 실행을 위한 설정파일을 작성해줍니다.

scope: patroni-cluster
name: node3

restapi:
  listen: 0.0.0.0:8008
  connect_address: 172.31.5.148:8008

etcd3:
  protocol: http
  hosts: 172.31.12.153:2379,172.31.3.207:2379,172.31.5.148:2379
  use_proxies: false
  api_version: v3

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        wal_level: replica
        hot_standby: "on"
        wal_keep_size: 512MB
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"
  initdb:
    - encoding: UTF8
    - locale: en_US.UTF-8
    - data-checksums
  post_bootstrap: /home/ubuntu/patroni/create_users.sh

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 172.31.5.148:5432
  data_dir: /home/ubuntu/postgres-data
  bin_dir: /usr/lib/postgresql/16/bin
  authentication:
    replication:
      username: replicator
      password: test1234
    superuser:
      username: postgres
      password: test1234
  parameters:
    unix_socket_directories: '/home/ubuntu/postgres-socket'
  pg_hba:
    - host replication replicator 172.31.0.0/16 md5
    - host all all 0.0.0.0/0 md5
    - host replication replicator 127.0.0.1/32 md5
    - local all all trust

watchdog:
  mode: off

 

공통 설정

  • scope: 클러스터 이름 → 모든 노드 동일 (patroni-cluster)
  • etcd3.hosts: etcd 클러스터 주소 → 3개 노드 모두 동일하게 172.31.12.153, 172.31.3.207, 172.31.5.148 사용

노드별 설정 (다르게 설정)

  • name: 각 노드 고유 이름 (node1, node2, node3)
  • restapi.connect_address: 해당 노드의 IP:8008
  • postgresql.connect_address: 해당 노드의 IP:5432

PostgreSQL 설정

  • data_dir: PostgreSQL 데이터 디렉토리 (예: /home/ubuntu/postgres-data)
  • bin_dir: PostgreSQL 16 바이너리 경로 (/usr/lib/postgresql/16/bin)
  • authentication: superuser 및 replication 계정 (postgres, replicator) → 비밀번호는 test1234
  • parameters: PostgreSQL 클러스터링 필수 설정 (wal_level, slots 등)

부트스트랩 관련

  • initdb: DB 초기 설정 (UTF8, checksum 등)
  • post_bootstrap: 사용자 생성 스크립트 실행 경로
  • /home/ubuntu/patroni/create_users.sh

 

위에서 설정한 계정 생성 스크립트 파일을 작성합니다.

#!/bin/bash
psql -U postgres -c "CREATE USER admin WITH PASSWORD 'test1234' SUPERUSER;"
psql -U postgres -c "CREATE USER replicator WITH PASSWORD 'test1234' REPLICATION;"

 

이제 각 노드에서 "patroni patroni.yml"로 클러스터를 실행하면, 최초 실행된 노드가 리더로 선정되고 나머지 노드는 자동으로 follower로 붙게 됩니다.

 

로그를 보면 다음과 같습니다.

  • node1: 리더 (leader with the lock)
  • node2, node3: 팔로워 (a secondary, and following a leader)

4. systemd에 Patroni 등록 (자동 실행)

Patroni를 수동으로 매번 실행하는 대신, 시스템 서비스로 등록하면 부팅 시 자동 시작되고 장애 시 재시작됩니다.

 

sudo vi /etc/systemd/system/patroni.service

[Unit]
Description=Patroni PostgreSQL HA
After=network.target

[Service]
User=ubuntu
Environment=PATH=/home/ubuntu/patroni/venv/bin:/usr/bin:/bin
ExecStart=/home/ubuntu/patroni/venv/bin/patroni /home/ubuntu/patroni/patroni.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target



sudo systemctl daemon-reload
sudo systemctl enable --now patroni

 

다시 실행하고 journalctl -u patroni -f 명령어를 통해 실시간 로그를 확인할 수 있습니다.

댓글