Pourquoi le déploiement de base de données nécessite sa propre stratégie
Vous avez un pipeline CI/CD qui fonctionne bien pour votre application. Les modifications de code sont construites, testées et déployées en production en quelques minutes. L'équipe livre plusieurs fois par jour sans difficulté. Puis quelqu'un ajoute une migration de base de données dans le même pipeline, et tout s'effondre.
La migration s'exécute pendant quarante-cinq minutes sur une grande table. Pendant ce temps, la table est verrouillée. Les utilisateurs commencent à voir des erreurs. L'application ne peut plus servir les requêtes. À mi-parcours, la migration échoue, mais vous ne pouvez pas revenir en arrière proprement car certaines lignes ont déjà été modifiées. Le pipeline qui prenait cinq minutes prend désormais une heure, et personne n'ose l'exécuter pendant les heures de bureau.
Ce n'est pas un problème d'outil. C'est un problème de stratégie. Le déploiement de base de données fonctionne sous des contraintes fondamentalement différentes de celles du déploiement d'application, et les traiter de la même manière crée des risques qu'aucune automatisation ne peut résoudre.
Le modèle de déploiement d'application qui ne s'applique pas
Le déploiement d'application suit un modèle simple et reproductible : construire une nouvelle version, la déployer sur les serveurs, et si quelque chose se passe mal, revenir à la version précédente. Ce cycle peut se répéter plusieurs fois par jour avec des conséquences minimes. L'ancienne version est toujours là. Les fichiers sont toujours valides. Le rollback consiste simplement à pointer le répartiteur de charge vers la version précédente.
Le déploiement de base de données ne fonctionne pas ainsi. Lorsque vous exécutez une migration, vous modifiez des structures de données qui contiennent déjà des données de production. Un rollback n'est pas un simple interrupteur. Vous ne pouvez pas simplement "annuler le déploiement" d'une colonne qui a été ajoutée, ou restaurer une table qui a été supprimée, sans reconstruire soigneusement l'état précédent. Les données qui ont été transformées pendant la migration ne reviennent pas automatiquement.
Le diagramme suivant compare les deux cycles :
Le facteur temps aggrave la situation. Les déploiements d'application se terminent généralement en quelques secondes ou minutes. Les migrations de base de données sur de grandes tables peuvent prendre des dizaines de minutes ou des heures. Pendant ce temps, les tables peuvent être verrouillées, les requêtes bloquées, et l'application peut devenir partiellement ou totalement indisponible. Un pipeline qui traite les changements de base de données comme une simple étape du workflow applicatif ignore ces réalités.
Pourquoi séparer les pipelines est judicieux
La réponse la plus pratique à ce décalage est de séparer le pipeline applicatif du pipeline de base de données. Ils s'exécutent selon des calendriers différents, avec des processus de révision différents et des profils de risque différents.
Le pipeline applicatif reste rapide. Il continue de livrer des fonctionnalités, des corrections de bugs et des changements de configuration plusieurs fois par jour. Le pipeline de base de données s'exécute à un rythme plus lent, avec une révision plus minutieuse et une planification explicite. Les migrations de base de données peuvent être exécutées plusieurs cycles avant le déploiement applicatif qui en dépend. Cela crée une marge : si la migration pose problème, il y a du temps pour la corriger sans bloquer la livraison applicative.
Cette séparation modifie également les acteurs impliqués. Les déploiements applicatifs sont généralement gérés par l'équipe de développement ou la plateforme. Les déploiements de base de données nécessitent souvent l'intervention d'un DBA ou d'un membre de l'équipe qui comprend le schéma, le volume de données et le comportement de verrouillage de la migration. Un pipeline séparé clarifie qui doit réviser, approuver et surveiller chaque type de changement.
Les changements de schéma rétrocompatibles réduisent les risques
Une autre stratégie qui change la façon de penser le déploiement de base de données consiste à rendre les changements de schéma rétrocompatibles. L'idée est simple : l'ancien schéma et le nouveau schéma doivent pouvoir coexister pendant un certain temps. Cela permet de déployer l'application et les changements de base de données en étapes séparées, sans nécessiter une bascule synchronisée.
Prenons l'exemple du renommage d'une colonne. L'approche naïve consiste à renommer la colonne en une seule migration et à mettre à jour le code applicatif en même temps. Si quelque chose se passe mal, l'application se casse car elle référence un nom de colonne qui n'existe plus.
Une approche rétrocompatible est différente. D'abord, ajoutez la nouvelle colonne tout en conservant l'ancienne. Mettez à jour l'application pour écrire dans les deux colonnes. Déployez ce changement. Une fois que vous êtes sûr que tout fonctionne, mettez à jour l'application pour lire depuis la nouvelle colonne au lieu de l'ancienne. Déployez à nouveau. Enfin, après que tous les consommateurs ont migré, supprimez l'ancienne colonne dans une migration séparée.
Ce processus prend plus de temps. Il nécessite plusieurs déploiements et plus de coordination. Mais il est nettement plus sûr. Si quelque chose se passe mal à une étape, vous pouvez revenir en arrière sur l'application sans laisser la base de données dans un état incohérent. Les changements de base de données ne sont jamais le facteur bloquant.
La gouvernance n'est pas de la bureaucratie, c'est de la protection
Les changements de base de données nécessitent un processus de révision qui va au-delà de la vérification syntaxique. Une pull request pour une migration doit inclure des réponses à des questions comme : Cette migration va-t-elle verrouiller la table ? Quelle est la durée prévue du verrou ? Quel est le temps d'exécution estimé sur le volume de données en production ? Y a-t-il d'autres services ou consommateurs qui lisent cette table et pourraient être affectés ?
Il ne s'agit pas d'ajouter de la paperasse. Il s'agit de reconnaître que les changements de base de données ont des conséquences que les changements de code applicatif n'ont pas. Un bug dans le code applicatif peut être corrigé avec un nouveau déploiement. Un bug dans une migration peut corrompre les données, provoquer une indisponibilité ou nécessiter une restauration à partir d'une sauvegarde. Le processus de révision existe pour détecter ces risques avant qu'ils n'atteignent la production.
Le même principe s'applique à qui peut exécuter des migrations. Tout le monde ne devrait pas avoir la capacité d'exécuter des changements de schéma en production. Il ne s'agit pas de confiance. Il s'agit de responsabilité et de la réalité que les changements de base de données nécessitent des connaissances spécifiques sur le volume de données, l'indexation, le verrouillage et le retard de réplication. Un pipeline séparé avec un accès contrôlé et des étapes d'approbation explicites est une protection pratique, pas un obstacle bureaucratique.
Ce que cela signifie pour votre équipe
Si votre équipe traite les migrations de base de données comme une simple étape du pipeline applicatif, vous portez un risque inutile. La solution n'est pas de ralentir les déploiements applicatifs. C'est de donner au déploiement de base de données sa propre stratégie, son propre pipeline et son propre processus de révision.
Commencez par la séparation. Exécutez les pipelines applicatifs et de base de données indépendamment. Rendez les changements de schéma rétrocompatibles autant que possible. Construisez un processus de révision qui pose les bonnes questions sur le verrouillage, le timing et l'impact sur les consommateurs. Et acceptez que le déploiement de base de données ne sera jamais aussi rapide ou aussi décontracté que le déploiement applicatif. Ce n'est pas une limitation. C'est une reconnaissance de ce qui est en jeu.
Liste de contrôle pratique pour la stratégie de déploiement de base de données
- Les pipelines applicatif et de base de données sont séparés, avec des calendriers et des processus de révision différents
- Les changements de schéma sont conçus pour être rétrocompatibles lorsque c'est possible
- Chaque migration inclut un temps d'exécution estimé et une analyse de verrouillage
- Les changements de base de données passent par une révision en pull request avec des vérifications explicites des verrous de table et de l'impact sur les consommateurs
- Les migrations sont testées dans un environnement de staging avec un volume de données proche de la production
- Le plan de rollback est documenté avant d'exécuter toute migration en production
L'essentiel
Le déploiement de base de données n'est pas un problème technique qui peut être résolu en ajoutant un outil de migration à votre pipeline existant. C'est un problème de stratégie qui vous oblige à concevoir un processus séparé, avec un timing différent, des critères de révision différents et une tolérance au risque différente. Les équipes qui le traitent ainsi livrent plus rapidement à long terme, car elles cessent d'être bloquées par des changements de base de données qui n'ont jamais été conçus pour s'intégrer dans un pipeline applicatif.