본문 바로가기
Database

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

by kmkhm 2025. 6. 20.

이전 포스팅에서는 Patroni와 etcd를 활용하여 PostgreSQL 클러스터를 구성하였습니다. 이번에는 HAProxy를 도입하여 클러스터에 고가용성을 보장하도록 구현해 보겠습니다. HAProxy는 클러스터 내에서 리더 노드를 자동으로 식별하고, 클라이언트의 요청을 해당 노드로 라우팅하는 역할을 수행합니다. 이를 통해 애플리케이션은 장애 발생 시에도 중단 없이 데이터베이스에 접근할 수 있으며, 실시간 장애 조치(Failover)가 가능해집니다. 먼저, HAProxy의 역할을 담당할 EC2 인스턴스를 하나 새로 생성합니다. 해당 인스턴스에서는 클러스터의 상태를 감지하고, 클라이언트 요청을 현재 리더 노드로 라우팅하는 프록시 역할을 수행하게 됩니다.

 

HAProxy 설치 & 설정

다음 명령어를 통해 HAProxy를 설치해줍니다.

sudo apt update
sudo apt install -y haproxy

설치가 완료되면, HAProxy의 설정 파일인 /etc/haproxy/haproxy.cfg를 열어 Patroni 클러스터와 연동될 수 있도록 수정해줍니다.

global
    log /dev/log local0
    maxconn 4096
    daemon

defaults
    log     global
    mode    tcp
    option  tcplog
    timeout connect 10s
    timeout client  1m
    timeout server  1m

frontend pgsql
    bind *:5432
    default_backend patroni_leader

backend patroni_leader
    option httpchk GET /master
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server node1 172.31.12.153:5432 check port 8008
    server node2 172.31.3.207:5432 check port 8008
    server node3 172.31.5.148:5432 check port 8008

위 설정에서 check port 8008은 각 Patroni 노드의 REST API를 통해 해당 노드가 리더인지 여부를 확인하는 데 사용됩니다.

 

현재 node1이 Leader인 상태입니다. 8008 포트로 마스터인지 다음과 같이 명령어를 보내면 마스터라면 상태코드 200을 응답하고, 마스터가 아니라면 다음과 같이 500번대를 응답합니다.

curl -i http://172.31.3.207:8008/master
#HTTP/1.0 503 Service Unavailable

 

FailOver Test

리더가 죽었을 때, 레플리카 중 하나가 리더로 승격되는지 테스트해보겠습니다. 간단하게 리더를 node1에서 node2로 넘겨줍니다.

이 상황에서 node2에서 patroni를 강제로 중지시킵니다.

sudo systemctl stop patroni

 

그럼 node2의 상태가 stopped 상태이고, 리더가 다시 node1로 넘어가는 걸 확인할 있습니다.

 

 

댓글