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

4.1 KiB
Raw Blame History

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

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