# 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.