| .. | ||
| haproxy | ||
| docker-compose.yml | ||
| README.md | ||
DIDI PostgreSQL HA — Patroni + etcd + HAProxy (IaC livrabil)
Pachet reproductibil care livrează clusterul HA PostgreSQL al platformei DiDi
ca Infrastructure-as-Code. Aceeași arhitectură rulează în producție pe VM-uri
dedicate (vezi ../MIGRATION.md); acest compose o reproduce integral pe un
singur host pentru demo, recepție, DR-rehearsal și medii de test.
Arhitectură
┌────────────────────┐
apps ──5000──▶ │ HAProxy │ ──▶ /primary (Patroni REST :8008)
apps ──5001──▶ │ (LB + healthcheck)│ ──▶ /replica
└─────────┬──────────┘
┌───────────────┼───────────────┐
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ pg-node1 │ │ pg-node2 │ │ pg-node3 │ Spilo = PostgreSQL 16
│ Patroni │ │ Patroni │ │ Patroni │ + Patroni (Zalando)
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
└───────────────┼───────────────┘
┌────────▼────────┐
│ etcd1/2/3 (DCS) │ quorum leader-election
└─────────────────┘
| Rol | Producție (VM-uri) | Acest pachet |
|---|---|---|
| PG + Patroni ×3 | 10.11.50.160–162 | pg-node1..3 (Spilo 16) |
| etcd quorum ×3 | 10.11.50.163–165 | etcd1..3 (v3.5) |
| HAProxy | 10.11.50.166 + 169 (VIP .167) | haproxy :5000/:5001 |
| Backup | pgBackRest (10.11.50.168, NFS) | vezi §Backup |
Pornire
docker compose up -d
# election durează ~30-60s; verifică:
docker exec didi-ha-pg1 patronictl list
Conectare (contract identic cu producția):
PGPASSWORD=didi-super-secret psql -h localhost -p 5000 -U postgres # RW (leader)
PGPASSWORD=didi-super-secret psql -h localhost -p 5001 -U postgres # RO (replici)
Restaurare schema DIDI (bos_parammgmt / bos_analysis / bos_sysadmin / bos_subscriber):
PGPASSWORD=didi-super-secret psql -h localhost -p 5000 -U postgres \
-f ../DIDI_full_export_2026-07-02.sql
Test failover (drill de recepție)
# 1. află liderul
docker exec didi-ha-pg1 patronictl list
# 2. omoară-l
docker stop didi-ha-pg2 # (dacă pg2 e leader)
# 3. Patroni promovează o replică în secunde; HAProxy reroutează :5000
# automat (healthcheck /primary la 3s, fall 3). Aplicațiile nu schimbă
# nimic — se reconectează pe același endpoint.
docker exec didi-ha-pg1 patronictl list
# 4. reintră nodul căzut ca replică:
docker start didi-ha-pg2
Switchover planificat (fără downtime):
docker exec didi-ha-pg1 patronictl switchover didi --force
Parametri
| Env | Default | Rol |
|---|---|---|
PG_SUPERUSER_PASSWORD |
didi-super-secret |
postgres superuser |
PG_ADMIN_PASSWORD |
didi-admin-secret |
admin role |
PG_STANDBY_PASSWORD |
didi-standby-secret |
replicare streaming |
Schimbă-le obligatoriu în producție (.env lângă compose).
Backup
În producție backup-ul e pgBackRest (full zilnic + WAL archiving pe NFS, nod dedicat). Pe acest pachet, echivalentul minim:
docker exec didi-ha-pg1 su postgres -c \
'pg_basebackup -h localhost -p 5432 -D /tmp/didi-backup -Ft -z -Xs'
Relația cu livrabilul Lot 2
- Modulul 5 (Baze de date SQL) cere PostgreSQL cu HA; oferta specifică
Patroni + HAProxy. Acest director este implementarea IaC livrată —
reproductibilă pe orice host Docker, plus instanțierea de producție
documentată în
MIGRATION.md. - Aplicațiile (agent-v3, didiFramework) sunt agnostice:
PG_HOST:PG_PORTarată fie spre VIP-ul de producție (10.11.50.167:5000), fie spre acest cluster local (localhost:5000) — același contract, zero modificări de cod.