104 lines
4.1 KiB
Markdown
104 lines
4.1 KiB
Markdown
# 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
|
||
|
||
```bash
|
||
docker compose up -d
|
||
# election durează ~30-60s; verifică:
|
||
docker exec didi-ha-pg1 patronictl list
|
||
```
|
||
|
||
Conectare (contract identic cu producția):
|
||
|
||
```bash
|
||
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):
|
||
|
||
```bash
|
||
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)
|
||
|
||
```bash
|
||
# 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):
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
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_PORT`
|
||
arată 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.
|