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.