didi-lot2-backend/backend/services/data-layer/didiDatabase/ha-cluster/README.md
2026-07-10 03:39:53 -07:00

104 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.160162 | `pg-node1..3` (Spilo 16) |
| etcd quorum ×3 | 10.11.50.163165 | `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.