Section 06PKIFactorArchitecteDevOps

Haute disponibilité

Tolérance aux pannes nœud, datacenter et région.

Dernière mise à jour 2026-04-18

PKIFactor s'exécute en cluster actif-actif avec basculement automatique en moins d'une minute. La couche données s'appuie sur Patroni 3-nœuds (PostgreSQL streaming replication + etcd) et la couche applicative est stateless (aucune session locale, P12 généré à la demande).

RPO 0

La réplication PostgreSQL est configurée en synchronous_commit=on par défaut : aucun commit n'est acquitté tant que le replica de secours ne l'a pas reçu. Vous ne perdez aucun certificat même en cas de bascule immédiate.

6.1. Topologie cible

Diagramme 6.A — Topologie HA
Load Balancer
HAProxy / Nginx • Health checks
Node 1
BackendACME/ESTFrontend
Node 2
BackendACME/ESTFrontend
Node 3
BackendACME/ESTFrontend
PgBouncer 1
PgBouncer 2
Patroni 1
leader
Patroni 2
replica
Patroni 3
replica
etcd 1
etcd 2
etcd 3

──── connexions actives  •  ─ ─ ─ réplication / consensus

6.2. Caractéristiques

ComposantMécanisme HARTORPO
Backend / APIStateless, N nœuds derrière LB< 5 s0
ACME / ESTStateless< 5 s0
PostgreSQLPatroni + streaming replication sync~ 30-60 s0 (sync)
etcdQuorum (2/3)< 10 s0
KMS (Vault Transit)Cluster Vault HA< 30 s0

6.3. Installation HA via pkifactor-ctl

bash
# Sur le nœud 1 (initial)
sudo pkifactor-ctl ha-init \
  --node-name pki-node-1 \
  --advertise-ip 10.0.0.11 \
  --etcd-peers 10.0.0.11,10.0.0.12,10.0.0.13

# Sur les nœuds 2 et 3
sudo pkifactor-ctl ha-join \
  --node-name pki-node-2 \
  --advertise-ip 10.0.0.12 \
  --leader 10.0.0.11

6.4. Vérification du cluster

bash
sudo pkifactor-ctl ha-status

# Sortie attendue :
#   Cluster: pkifactor-prod
#   ──────────────────────
#   Nodes:
#     ✓ pki-node-1 (10.0.0.11)  role=leader     uptime=12d 4h
#     ✓ pki-node-2 (10.0.0.12)  role=replica    lag=0 bytes
#     ✓ pki-node-3 (10.0.0.13)  role=replica    lag=0 bytes
#
#   PostgreSQL: synchronous_commit=on, replication=streaming
#   etcd: leader=10.0.0.12, healthy=3/3
#   Last failover: 2026-04-12T08:14:23Z (auto, duration=42s)