[infra] TimescaleDB, hypertables et compression #29
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Reference
g2/enervision#29
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Exigence couverte
ENF-04, ENF-07
Épreuve servie
EC05 · Data, ETL et BI
Charge estimée
1 j.h
Ce qu'on veut obtenir
Préparer la base à recevoir la zone or matérialisée, avec des séries temporelles interrogeables sous 400 ms sur 24 heures.
Critères d'acceptation
Comment on le vérifie
Commande \dx dans psql, puis EXPLAIN ANALYZE sur une fenêtre de 24 heures
Attendu extension présente, requête sous 400 ms
Preuve la sortie du EXPLAIN ANALYZE
Manuel d'exploitation à mettre à jour
docs/runbooks/postgres.md, section hypertables et compression
Risque et retour arrière
Une conversion en hypertable sur une table déjà remplie est longue. La faire avant le chargement. Retour arrière : la table reste une table ordinaire, la cible de performance saute.
Vérifié et fait — relevé du 3 septembre 2026
Serveur
ml-stagiaire-02, conteneurev-postgres(enervision/postgres:17-ts2.29.2, PostgreSQL 17.11).Un préalable qu'il fallait lever
Les quatre critères supposaient des tables de mesures à convertir. Il n'y en avait aucune :
enervision_prodetenervision_preprodcomptaient zéro table danspublic, seuls les catalogues internes de TimescaleDB étaient là — ce que voit tout client SQL et qu'on prend facilement pour une installation configurée. C'est le constat du #105.La migration
0007_zone_or_mesure.sqlpose donc le strict nécessaire :site(les sept sites duGLOSSAIRE) etmesureen hypertable. Les cinq autres tables de la zone or restent au #105. Demande de fusion #106.Le modèle suit le dossier d'architecture collectif, pas la forme esquissée dans
docs/POSTGRESQL.md: clécapteur_idétrangère aux zones bronze et argent, valeur unique là où l'ADR 0006 exige la brute à côté de la retenue, etdata_qualitypar défaut à'ok'qui n'est dans aucune des deux énumérations retenues. Le document est corrigé, motifs inclus.Les critères
L'extension
timescaledbest active.2.29.2surenervision_prodetenervision_preprod, avec l'ordonnanceur de fond actif sur chacune plus le lanceur.timescaledb.max_background_workers = 8pour 4 bases (max_worker_processes = 16) : le correctif du 2 septembre tient.Les tables de mesures sont converties en hypertables, partitionnées sur l'horodatage.
mesureest une hypertable partitionnée surhorodatage, fragments d'un jour. Sur préproduction : 36 fragments pour 35 jours.Une politique de compression est posée au-delà de sept jours.
Elle agit, ce n'est pas qu'une déclaration :
28 fragments comprimés sur 36, les 8 restants étant exactement ceux de moins de sept jours. 35 Mo → 5 488 kio, facteur 6,5.GLOSSAIRE(creux nocturne, repli de week-end sur bureaux et commerces) et aux trois régimes de l'ADR 0006 : 97,52 %good, 0,97 %imputed(brute nulle, valeur reconstituée à côté), 1,00 %suspect, 0,51 %critical(tout nul).La preuve —
EXPLAIN ANALYZEsur 24 heuresAgrégat horaire, les 7 sites, fenêtre de 24 h :
ChunkAppendne touche que 2 fragments sur 36 : c'est le partitionnement journalier qui fait son travail.Sur 20 exécutions : médiane 3,67 ms, p95 4,09 ms, max 10,31 ms. Cible 400 ms, marge d'un facteur 100.
Et la même fenêtre de 24 h prise dans les fragments comprimés (J-20), le cas le plus défavorable :
Lecture en
ColumnarScanvectorisé, 19 fragments écartés au démarrage : 4,94 ms. Comprimer ne coûte rien en lecture ici.Deux choses à savoir
La production est vide, et c'est voulu.
mesurey est une hypertable comprimable avec sa politique, mais 0 ligne : la note de risque de ce ticket demande de convertir avant le chargement, une conversion de table remplie étant longue. La table attend la collecte du #33. Le jeu de test vit en préproduction seule, c'est là que la latence se mesure.Un écart d'installation corrigé au passage.
pg_default_aclétait vide surenervision_preprodalors queenervision_prodportaitgrafana=rsurpublic. Les tables créées ensuite auraient été lisibles par Grafana en production et muettes en préproduction — une asymétrie qui ne se voit qu'au moment de la démonstration. La clause manquante est posée, et la migration porte en plus ungrant selectexplicite pour ne plus en dépendre.Manuel d'exploitation
docs/runbooks/postgresql.md§9 reçoit une sous-section « Hypertables et compression » : état des fragments, gain réel, forcer un passage de la politique, et ce qu'une table comprimée refuse — unUPDATEligne à ligne sur un fragment comprimé échoue ou coûte très cher, une reprise d'historique demande de décomprimer d'abord.docs/POSTGRESQL.mdetdb/migrations/README.mdsont à jour.La migration se rejoue sans effet de bord (vérifié en transaction annulée sur une hypertable déjà comprimée : uniquement des
NOTICE).Relevé et migration produits avec Claude Code.