SRDF Like – Guide projet IDEO‑LAB
Formalisation projet pour l’équipe : architecture, data model, orchestration DR, roadmap et phases de delivery.
Vision projet
Le projet SRDF Like vise un socle de réplication et de bascule orienté DB-first, asynchrone, observable, et pilotable depuis un Control Plane Django. La colonne vertébrale retenue est un pipeline Capture → Journal → Transport → Apply → Verify, avec un premier démarrage pragmatique sur PostgreSQL avant généralisation multi‑DB.
Cadre cible
Vision & objectifs
Contrat du projet, RTO/RPO, hypothèses réseau et tolérance explicite à la perte.
RTORPOSLOPérimètre V1
Données critiques, priorités DB, métadonnées DR, ce qui reste hors du scope initial.
DBMetadataV1Architecture globale
Pipeline SRDF-like moderne : capture, journal, transport async, apply, verify.
CDCJournalVerifyControl Plane vs Data Plane
Séparation structurante entre pilotage Django et flux opérationnels Linux/DB.
DjangoAgentPlaneModes de réplication
Log shipping natif vs CDC logique, stratégie DB-first, montée vers multi-cibles.
WALLogicalModeAgent Linux local
Health, polling, collecte système, exécution d’actions, base de la remédiation.
LinuxPollingExecControl Plane Django
Modèles de contrôle, dashboard, orchestration, journaux d’actions et décisions.
DashboardActionsAPIData Model V1
Sites, pairs, instances DB, events, health, actions, failover runs, replication state.
ModelsStateRunbookObservabilité & health
Lag, backlog, throughput, mismatch, ETA, health polling, alerting intelligent.
LagBacklogAlertingFailover / Failback
États, fencing anti split-brain, promotion standby, bascule DNS/VIP, retour contrôlé.
PromoteFencingRunbookSécurité & split-brain
mTLS, least privilege, rotation clés/certs, journal chiffré, witness, coupure réseau.
mTLSWitnessACLConnecteurs techniques
PostgreSQL d’abord, MariaDB ensuite, puis filesync, Nginx/proxy et trafic utilisateur.
PostgreSQLMariaDBFilesyncRoadmap & patches
POC, pilote, généralisation multi-DB, découpage en phases Django et infra.
POCPilotPatchesTests DR & validation
Failover mensuel, lien coupé, corruption logique, PITR, mesure RTO/RPO réels.
DRPITRValidationPositionnement produit
Ce que SRDF Like imite, ce qu’il simplifie, et les extensions futures réalistes.
SRDFPME/LabFuture1️⃣ Contrat du projet
- Construire une solution Remote Data Facility Async adaptée à IDEO‑LAB.
- Commencer en DB-first : les bases restent le cœur de la V1.
- Garder une logique SRDF-like, mais modernisée autour d’un pipeline CDC.
- Prévoir une architecture exploitable par une petite équipe, sans usine à gaz dès la phase 1.
2️⃣ Objectifs de niveau de service
| Indicateur | Cible | Remarque |
|---|---|---|
| RTO | 2–5 minutes | pilotage runbook + promotion + bascule endpoint |
| RPO | best effort, alerte < 10 s | en async, dépend du backlog réel |
| SLO | 99.9% → 99.99% | selon maturité POC / pilote / prod |
| Distance | illimitée | mais débit, jitter et rattrapage comptent |
3️⃣ Principe directeur
4️⃣ Hypothèses de démarrage
- Deux sites : A primary et B standby.
- Witness / quorum optionnel mais recommandé dès qu’on automatise.
- Failover manuel en V1, puis semi-auto.
- Protection contre erreurs logiques via PITR + base backups.
5️⃣ Message à formaliser dans le CDFC
Le guide n’est pas là pour “faire joli” : il doit verrouiller les invariants de design, éviter les ambiguïtés d’implémentation, et servir de support commun pour toi et tes collègues.
1️⃣ Ce qui est obligatoire en phase 1
- Bases de données : PostgreSQL, MariaDB/MySQL, puis autres moteurs si besoin.
- Métadonnées DR : état réplication, checkpoints, journal, inventaire, état health.
- Observabilité du pipeline : offsets, backlog, erreurs, retries.
- Actioning : déclenchement d’actions sûres depuis le control plane.
2️⃣ Hors scope V1 immédiat
- Object storage / uploads critiques.
- Queues et streams type RabbitMQ / Kafka.
- Caches Redis répliqués “de manière critique”.
- Failback auto complet et non supervisé.
3️⃣ Principe de priorisation
| Niveau | Contenu | Décision |
|---|---|---|
| P0 | DB + health + state + actions | à livrer en premier |
| P1 | dashboard + failover manuel + audit | phase pilote |
| P2 | multi-DB + filesync + proxy | après stabilisation |
| P3 | extensions produit | selon usage réel |
1️⃣ Chaîne cible
2️⃣ Capture
- SQL : WAL / binlog / redo-log selon moteur.
- NoSQL plus tard : oplog / change streams.
- Contrainte : capture idempotente, ordonnée et replayable.
3️⃣ Journalisation
- Stockage local séquentiel par segments.
- Retention contrôlée.
- Checkpoints côté apply.
- Checksum par segment.
4️⃣ Transport
- Protocole fiable avec ACK offset, retry et compression.
- mTLS et authentification obligatoire.
- Backpressure et multi-stream par table / shard / partition.
5️⃣ Apply + Verify
- Apply transactionnel quand possible.
- Rejeu sans doublon.
- DDL vs DML cadré : DDL out-of-band au début.
- Verify par checksum, rowcount et hash sampling.
| Plane | Responsabilités | Composants | À ne pas mélanger |
|---|---|---|---|
| Control Plane | pilotage, inventory, health view, décisions, runbooks, UI, audit | Django, API, admin, scheduler, action queue | ne doit pas devenir le chemin de données critique |
| Data Plane | capture, journal, transport, apply, verify, promotion standby | agents Linux, DB connectors, local journal, replication workers | ne doit pas dépendre du dashboard pour continuer à vivre |
1️⃣ Pourquoi cette séparation est fondamentale
- Évite que la supervision casse la réplication.
- Permet de garder un control plane plus lent, plus riche, plus orienté produit.
- Rend l’agent local autonome en cas de coupure réseau.
2️⃣ Règle d’architecture
1️⃣ Mode A – native log shipping
- On envoie le journal natif du moteur au standby.
- Rapide, robuste, performant.
- Excellent choix pour PostgreSQL / MySQL dans un démarrage pragmatique.
- Moins générique, plus dépendant du moteur.
2️⃣ Mode B – logical row-based CDC
- On transporte des événements logiques INSERT / UPDATE / DELETE.
- Plus générique, plus multi-cibles.
- Plus complexe : ordering, drift de schéma, mapping de types.
3️⃣ Recommandation de lancement
4️⃣ Décision projet
| Étape | Mode | But |
|---|---|---|
| POC | physical streaming replication | prouver robustesse et runbook |
| Pilote | native + control plane | outillage et supervision |
| Généralisation | connecteurs CDC | ouvrir vers MariaDB et au-delà |
Agent = bras local du projet
- Collecte l’état de la machine, de la DB locale et des services dépendants.
- Expose un point de vérité local même si le control plane est loin.
- Peut exécuter des actions sûres : promote, stop writer, reload service, fencing hooks.
Principes
- Stateless autant que possible, mais cache local acceptable.
- Idempotence sur les actions critiques.
- Audit obligatoire de toute commande réellement exécutée.
Health & polling V1
| Signal | Source | Usage |
|---|---|---|
| DB reachable | local connector | base health primaire |
| replication lag | DB stats | promotion eligibility |
| disk / journal pressure | OS metrics | risque backlog / rétention |
| service state | systemd / process | détection panne locale |
Action execution V1
Aucune action shell “libre”. Toute action doit être déclarée, paramétrée, journalisée, et confirmée par policy.
Design système recommandé
- Service systemd dédié.
- Configuration signée / versionnée.
- mTLS vers le control plane.
- Queue locale légère pour exécutions différées.
1️⃣ Responsabilités du Control Plane
- Inventaire des sites, pairs, agents, DB instances et endpoints.
- Dashboard global : santé, backlog, état de réplication, alertes.
- Runbooks et traces d’orchestration.
- Historique d’actions et décisions opérateur.
2️⃣ Écrans V1 attendus
- Overview cluster / pair.
- Replication state detail.
- Health timeline.
- Action center avec confirmation.
3️⃣ API et logique métier
| Domaine | API / vue | Finalité |
|---|---|---|
| Inventory | sites, pairs, DBs | base de pilotage |
| Health | last status, timeline | détection dérive |
| Actions | queue + execution log | traçabilité complète |
| Failover | runbook runs | mesure et audit |
Objectif du data model
Ne pas modéliser tout le monde dès le jour 1. Il faut couvrir ce qui rend le système pilotable, observable et actionnable.
- site topology
- replication state
- health measurements
- action audit trail
- failover lifecycle
Niveau de granularité
- Un Site représente un lieu logique.
- Un Pair relie A et B pour une réplication donnée.
- Une DatabaseInstance décrit le moteur réel.
- Les états et événements restent historisés.
| Model | Rôle | Champs clés |
|---|---|---|
| SrdfSite | site logique A/B/witness | name, role, region, is_enabled |
| SrdfPair | relation primary/standby | primary_site, standby_site, mode, target_rto, target_rpo |
| DatabaseInstance | instance DB réelle | engine, version, endpoint, port, site, status |
| ReplicationState | état courant synthétique | lag_seconds, backlog_bytes, last_offset, state, is_eligible_for_promotion |
| HealthSample | mesures horodatées | sampled_at, db_ok, service_ok, disk_ok, latency_ms |
| ActionExecution | audit des actions | action_type, status, requested_by, executed_by_agent, stdout_tail |
| FailoverRun | runbook métier | started_at, ended_at, trigger, outcome, rto_seconds |
| AlertEvent | alerting et incidents | severity, category, message, is_open |
On garde des tables d’historique séparées des états courants pour ne pas mélanger lecture “dashboard” et analyse temporelle.
Évolutions prévues
- MariaDB-specific state.
- Filesync inventory and drift tracking.
- Traffic switch objects for proxy / DNS / VIP.
- Witness/quorum votes et fencing receipts.
1️⃣ Métriques minimales
- replication lag (seconds)
- backlog size (bytes / segments)
- throughput capture / transport / apply
- error rate + retry count
- checksum mismatch
- estimated catch-up ETA
2️⃣ États de haut niveau
3️⃣ Alerting V1
| Condition | Action | Sens |
|---|---|---|
| lag > threshold | warning alert | la fenêtre RPO dérive |
| backlog growth > 0 sur fenêtre glissante | degraded | la réplication ne rattrape plus |
| apply stalled | critical | risque de standby inutilisable |
| checksum mismatch | critical + verify run | divergence potentielle |
Le failover V1 est manuel assisté. L’objectif n’est pas l’automatisme spectaculaire, mais la fiabilité opérationnelle.
| Déclencheur | Validation | Décision |
|---|---|---|
| primary lost | health + fencing possible | ouvrir failover |
| standby caught up enough | lag <= policy | promotion eligible |
| endpoint switch ready | dns/proxy hook ready | cut traffic |
Failback
- À traiter comme une opération séparée.
- Jamais “retour automatique” en V1.
- Rebuild propre de l’ancien primary avant retour de rôle.
1️⃣ Mesures minimales
- mTLS site A ↔ site B.
- Journal local chiffré au repos.
- Rotation des clés / certificats.
- Least privilege sur les comptes CDC et agents.
2️⃣ Split-brain
- Couper l’accès du primary historique avant promotion B.
- Fencing réseau : firewall / security group / ACL.
- VIP / DNS redirigé seulement après fencing validé.
3️⃣ Witness / quorum
Optionnel au tout début, mais fortement recommandé dès qu’on veut aller vers du semi-auto. Son rôle : arbitrer et réduire le risque de double-primary.
4️⃣ Politique sécurité projet
| Sujet | V1 | Ensuite |
|---|---|---|
| mTLS | obligatoire | pinning / rotation outillée |
| fencing | network rules | STONITH si justifié |
| audit | action logs | tamper evidence |
| RBAC | roles Django simples | granular policies |
1️⃣ PostgreSQL – priorité absolue
- Physical streaming replication async.
- Lag via pg_stat_replication côté primary.
- Replay delay via recovery functions côté standby.
- PITR via archiving + base backup.
2️⃣ MariaDB – phase suivante
- Brancher après stabilisation du socle V1.
- Conserver le même contrat de health / action / state.
- Éviter de tout abstraire avant d’avoir le premier connecteur vraiment robuste.
3️⃣ Filesync et trafic
- Filesync utile pour fichiers applicatifs hors DB.
- Nginx / proxy / VIP / DNS pour la bascule du trafic utilisateur.
- Ces briques doivent s’intégrer au runbook, pas vivre séparément.
4️⃣ Décision d’implémentation
| Étape | But | Contenu |
|---|---|---|
| POC | prouver le modèle | 1 DB, capture → journal → transport → apply, dashboard lag/backlog, bascule manuelle |
| Pilote prod | sécuriser le socle | fencing, witness, failover semi-auto, tests DR récurrents |
| Généralisation | ouvrir la plateforme | connecteurs CDC par techno, normalisation du journal |
Livrables attendus
- Guide HTML partagé équipe.
- Data model et vues dashboard lisibles.
- Runbook failover écrit et testé.
- POC PostgreSQL reproductible.
- Mesure réelle RTO / RPO.
1️⃣ Plan minimal
- Exercice failover mensuel.
- Test lien coupé 1h avec rattrapage.
- Test corruption logique type DROP TABLE pour valider PITR.
- Mesure RTO/RPO réels et pas théoriques.
2️⃣ Critères de succès
| Test | On valide quoi ? |
|---|---|
| failover | promotion, bascule endpoint, retour service |
| network cut | journal local + replay + ETA |
| logical corruption | backup/PITR hors réplication brute |
| dashboard audit | historique exploitable a posteriori |
1️⃣ Ce que SRDF Like reprend
- Réplication distante primary / standby.
- Logique de bascule et de reprise sur sinistre.
- Exigence de cohérence opératoire et d’observabilité.
2️⃣ Ce qu’il simplifie
- Approche logicielle ouverte au lieu d’un stack storage propriétaire.
- DB-first et produit “PME / labo / infra pragmatique”.
- Control plane Django lisible plutôt qu’une boîte noire pure infra.
3️⃣ Extensions futures
- Auto-failover encadré par witness.
- Connecteurs multi-moteurs supplémentaires.
- Filesync avancé et cohérence objet.
- Capacity planning et advisor réseau / backlog.
- Policy engine et workflows d’exploitation avancés.
| Bloc | Résumé |
|---|---|
| Goal | remote async DB facility for IDEO‑LAB |
| V1 focus | PostgreSQL first, manual failover, Django control plane |
| Pipeline | capture -> journal -> transport -> apply -> verify |
| Main risk | backlog growth and unsafe failover |
| Main protection | fencing + PITR + observability + tested runbooks |
| Main models | sites, pairs, db instances, replication state, health, actions, failover runs |
1️⃣ Invariants d’architecture
- same major PostgreSQL version on both sites
- stable endpoint for app traffic
- time sync on both nodes
- fast enough storage for WAL and data on standby
2️⃣ Succès du POC
- standby connected
- replay delay low when idle
- manual promote works
- dashboard shows lag / backlog / state
