tadata
Retour à l'accueil

Dimensionnement des Bases de Données & FinOps : Gérer la Croissance, les Coûts & la Capacité

#databases#finops#postgresql#mongodb#cloud#cost-optimization

Les bases de données sont souvent le poste le plus important des factures cloud — et le plus difficile à dimensionner correctement. Ce guide couvre comment estimer, surveiller et optimiser la taille des bases de données pour PostgreSQL et MongoDB, avec des stratégies FinOps pratiqués.

Pourquoi le Dimensionnement Compte

ImpactCe qui se passé quand on se trompé
CoûtInstances surdimensionnées gaspillent de l'argent ; sous-dimensionnées causent des pannes
PerformanceQuand les données dépassent la RAM, les requêtes touchent le disque — la latence explose x100
OpérationsLes grandes tables ralentissent sauvegardés, migrations et changements de schéma
ConformitéConserver des données au-delà de la politique augmente les risqués et coûts de stockage

PostgreSQL : Dimensionnement & Surveillance

Tailles des tables et index

Requêtes essentielles que tout DBA devrait connaître :

Quoi mesurerPourquoi
Taille de la table (données seules)Comprendre le volume brut par entité
Taille totale (données + index + TOAST)Empreinte disque réelle
Taille des indexLes index peuvent dépasser la table — signé de sur-indexation
Bloat (tuples morts)Surcoût MVCC — espace gaspillé par les updates/deletes
Nombre de lignesPlanification opérationnelle, décisions de partitionnement

Points de repère typiques

LignesTaille brute approx. (lignes de 100 octets)Avec index (3 B-tree)Notes
100 K~10 Mo~40 MoTient entièrement en RAM, aucune inquiétude
1 M~100 Mo~400 MoEncore confortable dans la plupart des configs
10 M~1 Go~4 GoSurveiller les plans de requêtes, envisager des index partiels
100 M~10 Go~40 GoPartitionnement recommandé, réglage du VACUUM nécessaire
1 Md~100 Go~400 GoPartitionnement requis, stratégie d'index soignée, hardware dédié

Coûts de stockage par type de colonne

TypeTaille par valeurNotes
BOOLEAN1 octet
SMALLINT2 octetsUtiliser au lieu de INT quand les valeurs < 32K
INTEGER4 octets
BIGINT8 octetsNe pas mettre BIGINT par défaut si INT suffit
REAL4 octets
DOUBLE PRECISION8 octets
NUMERIC(p,s)Variable (5–20+ octets)Coûteux — utiliser uniquement quand la précision exacte est requise
TEXT / VARCHAR1 octet + longueur de chaîne+ 4 octets de surcoût pour les chaînes > 126 octets
UUID16 octetsPlus grand qu'un INT (4o) — réserver aux systèmes distribués
TIMESTAMPTZ8 octets
JSONBVariablePratique mais coûteux — dénormaliser les chemins chauds en colonnes
ARRAYVariableSouvent mieux dans une table séparée pour les grands tableaux interrogés

Bloat PostgreSQL et surcoût MVCC

Le MVCC de PostgreSQL crée des tuples morts à chaque UPDATE et DELETE. Sans VACUUM correct, les tables peuvent gonfler à 2–5x leur taille logique.

Exemple réel : Une table de 10 Go avec des mises à jour fréquentes peut croître à 30–50 Go si l'autovacuum est mal configuré. Cela impacté directement :

  • Les coûts de stockage (3–5x)
  • La taille et durée des sauvegardés
  • La performance des requêtes (scan des tuples morts)
  • Le retard de réplication (plus de WAL à transmettre)

Leviers FinOps PostgreSQL

LevierImpactEffort
Redimensionner l'instance20–40 % de réduction typiqueFaible — surveiller l'usage CPU/RAM, réduire
Régler l'autovacuumRéduire le bloat 2–5xMoyen — ajuster les paramètres par table
Types de colonnes appropriés10–30 % de réduction du stockageMoyen — auditer les types du schéma
Index partielsIndex 50–90 % plus petitsMoyen — identifier les patterns de requêtes
Partitionner et supprimer les anciennes donnéesJusqu'à 80 % d'économie de stockageÉlevé — nécessite des changements de schéma
Compression TOAST50–75 % pour le texte/JSON volumineuxFaible — activé par défaut, ajuster le seuil
Passer aux instances ARM (Graviton)20 % d'économie sur AWSFaible — même PostgreSQL, compute moins cher
Instances réservées / engagement30–60 % vs à la demandeFaible — engagement financier
Réplicas de lectureDécharger les lectures, primaire plus petitMoyen — routage applicatif nécessaire
Pooling de connexions (PgBouncer)Instance plus petite suffisanteMoyen — déployer et configurer le pooler

MongoDB : Dimensionnement & Surveillance

Tailles des documents et collections

Quoi mesurerPourquoi
Taille des données de la collectionOctets bruts des documents
Taille de stockage de la collectionSur disque avec compression WiredTiger (~60–70 % de la taille des données)
Taille des indexChaque index coûte de la RAM — doit tenir en mémoire pour la performance
Taille moyenne des documentsDétecter la croissance des documents dans le temps
Nombre de documentsPlanification opérationnelle, décisions de sharding

Points de repère typiques

DocumentsTaille doc moy. 1 KoAvec 3 indexNotes
100 K~100 Mo (brut) / ~35 Mo (compressé)~50 Mo d'indexTient en RAM
1 M~1 Go / ~350 Mo~500 MoConfortable
10 M~10 Go / ~3,5 Go~5 GoSurveiller la mémoire des index, working set
100 M~100 Go / ~35 Go~50 GoEnvisager le sharding
1 Md~1 To / ~350 Go~500 GoSharding requis, cluster multi-nœuds

Spécificités du stockage MongoDB

Compression WiredTiger : Le moteur de stockage par défaut de MongoDB compresse les données (snappy) et les index (compression par préfixe). Ratios de compression typiques :

Type de donnéesRatio de compression
Documents riches en JSON3:1 à 5:1
Données binaires (images, fichiers)1,1:1 à 1,5:1
Données très répétitives5:1 à 10:1
Charges mixtes2:1 à 4:1

Limite de taille de document : 16 Mo par document. Si vous approchez cette limite, votre schéma a besoin d'être repensé — utilisez des références plutôt que l'embedding.

Patterns de schéma MongoDB et leur impact sur la taille

PatternImpact sur la tailleQuand l'utiliser
Embedding (documents imbriqués)Documents plus grands, moins de collectionsDonnées toujours accédées ensemble, croissance bornée
Référencement (clés étrangères)Documents plus petits, plus de lookupsCroissance non bornée (commentaires, logs), many-to-many
Pattern bucketMoins de documents, taillé prévisibleTime-séries, IoT — grouper N événements par document
Pattern subsetGarder les données chaudes petitesGros documents dont seule une partie est fréquemment lue
Pattern outlierGérer les exceptions séparémentLa plupart des docs petits, quelques-uns énormes (followers de célébrités)

Leviers FinOps MongoDB

LevierImpactEffort
Redimensionner le tier du cluster20–40 % d'économieFaible — l'auto-scaling Atlas aide
Choisir la bonne shard keyDistribution uniforme → moins de nœudsÉlevé — doit être choisi à la création
Index TTLExpiration automatique des anciennes donnéesFaible — ajouter un index TTL sur le champ date
Compacter les collectionsRécupérer l'espace après des suppressions massivesFaible — lancer compact ou initial sync
Optimisation du schéma30–60 % de réduction de tailleMoyen — noms de champs courts, types corrects
Auto-scaling du cluster AtlasNe payer que ce qu'on utiliséFaible — activer dans Atlas
Archiver les données froides vers Atlas Online Archive50–80 % d'économie sur les anciennes donnéesMoyen — configurer les règles d'archivage
Clusters réservés (Atlas)30–50 % vs pay-as-you-goFaible — engagement financier
Passer du stockage NVMe au standard20–40 % d'économie sur le stockageFaible — si les besoins en IOPS sont faibles

Comparatif FinOps : PostgreSQL vs MongoDB

DimensionPostgreSQLMongoDB
Efficacité stockageStockage en lignes + compression TOASTCompression WiredTiger (typiquement meilleur par défaut)
Risque de bloatÉlevé (tuples morts MVCC)Plus faible (WiredTiger gère en interne)
Surcoût des indexModéré (B-tree)Plus élevé (chaque collection nécessite un index _id minimum)
Modèle de coût de scalingVertical d'abord → coûteux à grande échelleHorizontal (sharding) → coût croît linéairement
Coût managé (AWS)RDS/Aurora : instance + stockage + IOPSDocumentDB/Atlas : instance + stockage + transfert de données
Coût de sauvegardéSnapshots RDS (gratuit jusqu'à la taille de la DB)Backup continu Atlas inclus, ou snapshots S3
LicenceGratuit (open source)Gratuit (Community) ou payant (Enterprise/Atlas)

Cadre FinOps Général pour les Bases de Données

1. Visibilité — Savoir ce qu'on dépense

MétriqueObjectif
Coût par requêteSuivre avec APM (Datadog, New Relic)
Coût par Go stockéComparer entre tiers et fournisseurs
Coût par environnementDev/staging souvent 30–50 % du total — utiliser des instances plus petites
Coût des ressources inutiliséesRéplicas non utilisés, bases dev surdimensionnées

2. Optimisation — Réduire le gaspillage

Gains rapides (semaine 1) :

  • Réduire les instances dev/staging au minimum viable
  • Activer l'auto-pause pour les bases non-production
  • Supprimer les snapshots et sauvegardés inutilisés au-delà de la politique de rétention
  • Éteindre les bases dev en dehors des heures de bureau

Moyen terme (mois 1–3) :

  • Redimensionner la production selon l'utilisation réelle CPU/mémoire (cible 60–70 %)
  • Implémenter des politiques de rétention — archiver ou supprimer les anciennes données
  • Passer aux tarifs réservés/engagement pour les charges stables
  • Consolider plusieurs petites bases en moins d'instances managées

Stratégique (trimestre 1–2) :

  • Évaluer le coût total de possession managé vs auto-hébergé
  • Envisager le stockage multi-tiers (chaud/tiède/froid)
  • Implémenter le chargeback — les équipes voient leurs coûts de base de données
  • Automatiser les politiques de scaling basées sur les patterns de charge

3. Gouvernance — Prévenir le gaspillage futur

PratiqueCe qu'elle prévient
Politique de taggingCoûts non attribués (imposer les tags équipe/projet/env)
Garde-fous de provisionnementDéveloppeurs créant des instances surdimensionnées
Alertes de budgetPics de coûts inattendus
Revues trimestriellesDérive des coûts, ressources oubliées
Revues d'architecture pour les nouveaux projetsMauvais choix de base coûtant 10x à long terme

Exemples de Dimensionnement Réels

Exemple 1 : SaaS B2B — CRM Client

ParamètreValeur
Clients50 000
Enregistrements moyens par client500 (contacts, deals, activités)
Total lignes25 M
Taille moyenne d'une ligne200 octets
Données brutes~5 Go
Avec index (5 B-tree)~20 Go
Instance recommandéedb.r6g.large (2 vCPU, 16 Go RAM)
Coût mensuel (RDS PostgreSQL)~200 €/mois

Exemple 2 : Plateforme IoT — Données Capteurs

ParamètreValeur
Capteurs10 000
Événements par capteur par jour1 440 (un par minute)
Événements quotidiens14,4 M
Événements mensuels~430 M
Taille moyenne d'un événement150 octets
Données brutes mensuelles~65 Go
Rétention12 mois → ~780 Go
Configuration recommandéeCluster MongoDB shardé (3 shards) ou TimescaleDB avec partitionnement
Coût mensuel~800–1 500 €/mois (Atlas M40 ou équivalent)

Exemple 3 : E-commerce — Catalogue Produits + Commandes

ParamètreValeur
Produits500 000 (attributs variables → MongoDB)
Commandes10 M/an (relationnel → PostgreSQL)
Taille du catalogue produits~2 Go (MongoDB, compressé)
Commandes + lignes de commande~15 Go/an (PostgreSQL)
Configuration recommandéePolyglot : PostgreSQL pour les commandes + MongoDB pour le catalogue
Coût mensuel~350 €/mois combiné

Planification de la Croissance

Taux de croissanceAction
< 10 Go/moisSurveiller trimestriellement, pas d'urgence
10–100 Go/moisPlanifier une stratégie de partitionnement, mettre en placé l'archivage
100 Go–1 To/moisPlanification de capacité active, envisager sharding/scaling horizontal
> 1 To/moisÉquipe de capacité dédiée, stratégie multi-régions, stockage par tiers

Règle pratiqué : Planifier pour 2x votre projection de données à 12 mois. Le stockage est bon marché ; les migrations d'urgence ne le sont pas.

Ressources

:::

Nous utilisons des cookies analytiques pour améliorer votre expérience. Aucune donnée personnelle n'est collectée.