Déployer un cluster PostgreSQL haute disponibilité avec Patroni, Etcd et HAProxy

Publié le 24 juin 2025

Infrastructure
Base de données
Haute Disponibilité

La haute disponibilité d'une base de données PostgreSQL est critique pour les applications en production. Ce guide explique comment déployer un cluster PostgreSQL résilient en utilisant Patroni pour l'orchestration, Etcd pour le consensus distribué et HAProxy pour le load balancing.

Prérequis

  • Trois nœuds Linux (Debian/Ubuntu ou RHEL/Rocky/AlmaLinux)
  • Docker et Docker Compose installés ou installation native de PostgreSQL
  • Ports réseau ouverts : 5432, 2379-2380 (Etcd), 8008 (Patroni API), 5433 (HAProxy)

Architecture du cluster

  • Etcd : service de stockage clé-valeur distribué pour le consensus
  • Patroni : gestion des rôles master/replica et failover
  • PostgreSQL : base de données
  • HAProxy : répartiteur de charge SQL
[Client]
   |
  HAProxy (5433)
   |
+---------+-----------+
|                     |
Pod1                 Pod2
Patroni API 8008     Patroni API 8008
Postgres Master <---> Etcd Cluster
                                           Pod3 (Replica)

Étape 1 : Déployer Etcd

docker run -d --name etcd1   -p 2379:2379 -p 2380:2380   quay.io/coreos/etcd:v3.5   etcd --name etcd1 --listen-client-urls http://0.0.0.0:2379        --advertise-client-urls http://127.0.0.1:2379        --listen-peer-urls http://0.0.0.0:2380        --initial-cluster etcd1=http://127.0.0.1:2380        --initial-cluster-state new

Répétez pour etcd2, etcd3, en adaptant les noms et adresses.

Étape 2 : Fichier de configuration Patroni

Créez patroni.yml sur chaque nœud :

scope: postgres-ha
namespace: /service/
name: node1

restapi:
  listen: 0.0.0.0:8008
  connect_address: 10.0.0.1:8008

etcd:
  hosts: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      parameters:
        max_connections: 100
  initdb:
  - encoding: UTF8
  - data-checksums

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 10.0.0.1:5432
  data_dir: /var/lib/postgresql/data
  bin_dir: /usr/lib/postgresql/15/bin
  authentication:
    replication:
      username: repl
      password: replpassword
    superuser:
      username: postgres
      password: superpassword
  parameters:
    shared_buffers: 256MB
    wal_level: replica
    hot_standby: "on"

Adaptez name, listen et connect_address pour node2, node3.

Étape 3 : Lancer Patroni

docker run -d --name patroni   -v $(pwd)/patroni.yml:/etc/patroni.yml   --net host   registry.gitlab.com/postgres-ai/patroni:latest   patroni /etc/patroni.yml

Étape 4 : Configurer HAProxy

Fichier haproxy.cfg :

global
  daemon
  maxconn 2000

defaults
  mode tcp
  timeout connect 10s
  timeout client 30s
  timeout server 30s

frontend pg_front
  bind *:5433
  default_backend pg_back

backend pg_back
  mode tcp
  balance roundrobin
  option tcp-check
  server node1 10.0.0.1:5432 check port 8008
  server node2 10.0.0.2:5432 check port 8008
  server node3 10.0.0.3:5432 check port 8008

Démarrer HAProxy

sudo systemctl restart haproxy

Vérification et tests

  • Patroni UI : http://10.0.0.1:8008
  • Cluster status :
patronictl -c patroni.yml list
  • Test de basculement :
docker stop patroni_node1
patronictl -c patroni.yml list

Conclusion

Ce cluster PostgreSQL orchestré par Patroni et Etcd, équilibré par HAProxy, garantit une haute disponibilité et un failover automatique pour les bases de données critiques. Parfait pour les applications d'entreprise nécessitant une continuité de service maximale.

Besoin d'aide sur ce sujet ?

Notre équipe d'experts est là pour vous accompagner dans vos projets.

Contactez-nous

Articles similaires qui pourraient vous intéresser