J'essaie de réaliser des déploiements sans temps d'arrêt afin de pouvoir en déployer moins pendant les heures creuses et davantage pendant les heures "plus lentes" - ou à tout moment, en théorie.
Ma configuration actuelle, quelque peu simplifiée:
- Serveur Web A (application .NET)
- Serveur Web B (application .NET)
- Serveur de base de données (SQL Server)
Mon processus de déploiement actuel:
- "Arrêtez" les sites sur les serveurs Web A et B
- Mettre à niveau le schéma de base de données pour la version de l'application en cours de déploiement
- Mettre à jour le serveur Web A
- Mettre à jour le serveur Web B
- Ramener tout en ligne
Problème actuel
Cela conduit à une petite quantité de temps d'arrêt chaque mois - environ 30 minutes. Je le fais en dehors des heures de travail, donc ce n’est pas un problème énorme, mais c’est quelque chose que j’aimerais abandonner.
En outre, il n'y a aucun moyen de vraiment revenir en arrière. En général, je ne fais pas de scripts d'annulation de base de données, mais uniquement des scripts de mise à niveau.
Tirer parti de l’équilibreur de charge
J'aimerais pouvoir mettre à niveau un serveur Web à la fois. Retirez Web Server A de l'équilibreur de charge, mettez-le à niveau, remettez-le en ligne, puis répétez l'opération pour Web Server B.
Le problème est la base de données. Chaque version de mon logiciel devra être exécutée sur une version différente de la base de données - je suis donc en quelque sorte "bloqué".
Solution possible
Une solution actuelle que je considère envisage d'adopter les règles suivantes:
- Ne supprimez jamais une table de base de données.
- Ne supprimez jamais une colonne de base de données.
- Ne jamais renommer une colonne de base de données.
- Ne réorganisez jamais une colonne.
- Chaque procédure stockée doit être versionnée.
- Signification - "spFindAllThings" deviendra "spFindAllThings_2" lors de la modification.
- Il devient ensuite 'spFindAllThings_3' lors de sa prochaine édition.
- La même règle s'applique aux vues.
Bien que cela semble un peu extrême, je pense que cela résout le problème. Chaque version de l'application utilisera la base de données de manière ininterrompue. Le code attend certains résultats des vues / procédures stockées, ce qui permet de conserver la validité de ce "contrat". Le problème est - ça suinte mouillée. Je sais que je peux nettoyer les anciennes procédures stockées après le déploiement de l'application pendant un certain temps, mais cela semble tout simplement sale. En outre, cela dépend du fait que tous les développeurs suivent cette règle, ce qui arrivera surtout, mais j'imagine que quelqu'un va se tromper.
Enfin - ma question
- Est-ce bâclé ou hacky?
- Est-ce que quelqu'un d'autre le fait de cette façon?
- Comment d'autres personnes résolvent-elles ce problème?