내 잡다한 노트

PostgreSQL의 HA를 위해 설계된 Patroni 본문

DB/PostgreSQL

PostgreSQL의 HA를 위해 설계된 Patroni

peanutwalnut 2025. 2. 12. 10:09

Patroni는 PostgreSQL의 고가용성(HA)을 위해 설계된 오픈 소스 도구로, 자동 장애 조치(auto-failover)와 클러스터 관리를 간소화하는 데 중점을 둡니다. 다음은 Patroni에 대한 자세한 설명입니다.


1. Patroni란?

  • 정의:
    Patroni는 Python으로 작성된 PostgreSQL 전용 HA 솔루션입니다. 각 PostgreSQL 인스턴스(노드)를 모니터링하고, 클러스터 내에서 자동으로 리더(Primary)를 선출하거나 장애 발생 시 standby(Replica)를 승격하는 역할을 합니다.
  • 주요 역할:
    • 자동 장애 조치 (Auto-Failover): Primary 노드에 문제가 생기면, 사전에 구성된 규칙과 우선순위에 따라 standby 노드 중 하나를 자동으로 Primary로 승격시킵니다.
    • 클러스터 상태 관리: 클러스터의 현재 상태를 지속적으로 모니터링하고, 상태 정보를 기반으로 노드 간의 역할 전환을 조율합니다.

아키텍쳐

출처 : https://medium.com/@chriskevin_80184/high-availability-ha-postgresql-cluster-with-patroni-1af7a528c6be

 

항상 단일 리더가 존재하고 나머지 노드는 복제본이 된다.

leader가 다운되면, replica들 중에 하나가 new leader로 선택된다. etcd에 의해서.

 

이 configuration은 더욱 많은 replica를 확장할 수 있고 pgbouncer이 pool connections을 사용하여 db에 대한 연결을 풀링할 수 있다.

 

우리가 cluster와 interface하고 싶을때는 우린 patroni cli 또는 rest api를 활용할 수 있다.

 

patroni는 클러스터를 매니징하기 위한 툴이다. 또한 배포와 운영의 customize와 자동화를 할 수 있게 해준다.

configuration을 저장하는 용도로 etcd, consul, zookeeper를 쓰는 편이다.

patroni는 또한 설정을 통해 database replication, backup, restoration을 다룰 수 있다

이러한 세팅들은 yaml 파일로 할 수 있다.

 

ETCD

etcd는 postgresql 클러스터의 상태를 저장한다. postgre node의 상태가 변화가 생긴다면 patroni는 상태 변화를 업데이트한다. etcd key-value store에다가.

그리고 etcd는 이 정보를 활용하여 master node를 선출하고 cluster가 동작하도록 유지한다.

 

HAPROXY

HAProxy는 여러 서버에 요청을 분산시키는 TCP 및 HTTP 기반 애플리케이션을 위한 고가용성 로드 밸런서 및 프록시 서버를 제공하는 무료 오픈 소스 소프트웨어다.

master/slave 노드의 변화를 추적하고 적절한 master node로 연결하게 해준다. 클라이언트가 요청할때말이다.

 

How it works?

patroni bot은 각각의 postgre node에 설치돼야한다.

etcd 또한 HA 상태가 되도록 set up이 되야 할 필요가 있다. 그럴려면 3개의 etcd node가 필요하다. 

 

haproxy는 어떤 노드가 마스터인지 patroni rest api를 통해 결정한다.

patroni rest api는 port 8008로 보통 설정된다.

 

failover times는 클러스터 상태와 장애 조치 이유에 따라 항상 즉각적으로 나타나지 않을 수 있다.

새로운 리더가 선출되고 클러스터가 재구성되는 동안 잠시 사용할 수 없는 경우가 있을 수 있다.

 

글에서 알려주는 next step으로는 etcd cluster를 더욱 크게 늘리라고 하고, pgbounder를 사용해 pool connection을 좋게 하도로 ㄱ하고 second ha proxy 서버를 추가하여 ip 장애 조치를 설정하여 고가용성 클러스터를 구축하라고 한다.

( 글에선 한개의 etcd, haproxy로 설명했기 때문에 )

 

2. 핵심 구성 요소 및 동작 원리

  • 분산 구성 저장소 (Distributed Configuration Store, DCS):
    Patroni는 etcd, Consul, ZooKeeper 등과 같은 분산 키-값 저장소를 사용합니다.
    • 리더 선출: 각 노드가 DCS를 통해 클러스터 상태를 공유하고, 분산 합의 알고리즘을 이용하여 어떤 노드가 Primary가 되어야 하는지 결정합니다.
    • 상태 공유: DCS에 클러스터의 현재 상태와 각 노드의 건강 상태를 저장하여, 장애 발생 시 신속하게 반응할 수 있도록 합니다.
  • Patroni 에이전트:
    각 노드에 설치되어 PostgreSQL 인스턴스를 관리하는 데 필요한 역할을 수행합니다.
    • 헬스 체크: 주기적으로 PostgreSQL 프로세스의 상태를 확인합니다.
    • 명령 수행: 장애가 감지되면 DCS와 협의하여 노드의 역할 전환(promotion) 등을 자동으로 수행합니다.
    • REST API 제공: 클러스터 상태 조회, 수동 장애 조치 등의 작업을 위한 API를 제공하여, 관리자가 클러스터를 모니터링하고 제어할 수 있도록 합니다.

3. Patroni의 주요 기능

  • 자동 장애 조치 (Auto-Failover):
    Primary 노드에 장애가 발생하면, Patroni가 자동으로 standby 노드 중 하나를 승격시켜 클러스터의 가용성을 유지합니다.
  • 간편한 구성:
    YAML 형식의 설정 파일을 사용하여 각 노드의 동작 방식, 우선순위, DCS 연결 정보 등을 쉽게 설정할 수 있습니다.
  • 유연한 배포:
    클라우드, 컨테이너(Docker, Kubernetes) 또는 베어메탈 환경 모두에서 사용할 수 있으며, 리전 또는 가용영역(AZ) 간의 장애 조치 구성에도 적합합니다.
  • 모니터링 및 알림:
    노드의 상태를 실시간으로 모니터링하고, 필요시 알림을 보내어 관리자가 문제 상황을 즉시 인지할 수 있도록 지원합니다.

4. Patroni를 사용하는 환경

  • 다중 가용영역(AZ) 환경:
    동일 리전 내 여러 가용영역에 걸쳐 배포할 경우, 각 AZ에 Patroni 노드를 구성하고 DCS를 통해 클러스터 상태를 공유하면, 한 AZ에 장애가 발생해도 다른 AZ에서 자동으로 Primary가 승격되어 서비스 연속성을 유지할 수 있습니다.
  • 자동 장애 조치 요구 환경:
    서비스 중단 시간을 최소화하고, 장애 발생 시 인력 개입 없이 신속하게 failover가 이루어지길 원할 때 Patroni가 유용합니다.

5. Patroni 사용 시 고려사항

  • DCS 구성:
    Patroni는 etcd, Consul, ZooKeeper 등의 분산 구성 저장소가 필요합니다. 별도의 DCS를 구축하고 운영해야 하므로, 해당 시스템의 관리 및 모니터링이 추가로 요구됩니다.
  • 설정 복잡성:
    기본적인 HA 구성은 상대적으로 간단하지만, 클러스터 규모가 커지거나 특정 요구사항(예: 복잡한 장애 조치 정책, 네트워크 레이턴시 고려)이 있는 경우에는 추가적인 설정과 튜닝이 필요할 수 있습니다.
  • 모니터링 도구와의 연계:
    Patroni의 REST API나 로그를 활용하여 클러스터 상태를 모니터링할 수 있는 외부 도구(예: Prometheus, Grafana)와의 연계도 고려해볼 수 있습니다.

 

 

'DB > PostgreSQL' 카테고리의 다른 글

Pigsty 란?  (0) 2025.02.15
pg_rewind 란?  (0) 2025.02.13
Patroni 설정 파일  (0) 2025.02.13
Citus를 왜 사용해야하는가?  (0) 2025.02.12
PostgreSQL Citus  (0) 2025.02.12