34 votes

Déploiement à chaud sur Heroku, sans temps d'arrêt

Un mauvais côté de pousser à Heroku est que je dois pousser le code (et le serveur redémarre automatiquement) avant de lancer ma db migrations.

Cela peut causer de 500 erreurs sur les utilisateurs naviguant sur le site avoir le nouveau code sans les nouvelles tables/attributs: la solution proposée par la société Heroku est d'utiliser le mode de maintenance, mais j'ai besoin d'un moyen avec aucun inconvénient à laisser ma webapp de course à chaque fois!

Est-il possible? Par exemple avec Capistrano:

  • Je prépare le code de déployer dans un nouveau répertoire
  • - Je exécuter (en arrière) migrations et de l'ancien code de continuer à fonctionner parfaitement
  • Je swith mongrel exemple pour le nouveau dir et redémarrez le serveur

...et j'ai pas de temps mort!

22voto

jshkol Points 867

Vous pouvez configurer un deuxième Heroku application qui pointe vers le même en tant que base de votre production primaire à l'application et à l'utilisation secondaire d'application pour exécuter votre DB migrations sans interruption de la production (en supposant que les migrations ne se cassent pas la version précédente de l'application).

Appelons le Heroku applications de PRODUCTION et de mise en scène.

Votre déployer séquence deviendrait quelque chose comme:

  1. Déployer de nouveaux code de mise en scène
    git push heroku staging
  2. Exécuter des migrations de base de données sur la mise en scène (mise à jour de PROD db)
    heroku run -a staging-app rake db:migrate
  3. Déployer de nouveaux code de PRODUCTION
    git push heroku production

La mise en scène application ne vous coûtera rien, car vous n'aurez pas besoin de dépasser Heroku de niveau gratuit et il serait assez trivial à l'installation d'un râteau pour déployer un script pour le faire automatiquement pour vous.

Bonne chance!

11voto

dB. Points 2350

Si vous êtes capable de vivre avec les deux versions de la même application en ligne dans le même temps, Heroku a maintenant un preboot laboratoires de fonctionnalité.

https://devcenter.heroku.com/articles/labs-preboot

5voto

iWasRobbed Points 26926

La seule méthode pour améliorer le processus est un peu ce qu'il suggère. Ce n'est pas encore un déploiement à chaud scénario bien:

http://casperfabricius.com/site/2009/09/20/manage-and-rollback-heroku-deployments-capistrano-style/

Une chose que je suggère, c'est d'poussant seulement votre migrations jusqu'à Heroku première et en cours d'exécution avant de vous pousser votre base de code. Cela supposerait de commettre les migrations de manière autonome et s'engage manuellement en les poussant à chaque fois (ce qui n'est pas idéal). Je suis très surpris de voir qu'il n'est pas une meilleure solution à ce problème avec toutes les grandes applications hébergées sur Heroku maintenant.

3voto

michael Points 551

En fait vous aurez un peu de temps libre quand Heroku redémarrage de votre application. Ils ont une nouvelle fonctionnalité appelée Avant que démarre de nouveaux dynamomètres avant d'enlever l'ancienne: https://devcenter.heroku.com/articles/labs-preboot/

Comme pour les migrations de base de données, que l'article des liens vers celui-ci sur la façon de traiter ce problème: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

1voto

bevanb Points 1649

J'ai d'abord engager les migrations, les exécuter, puis pousser le reste du code. Ajouter un seul fichier comme suit:

git commit -m 'added migration' -- db/migrate/2012-your-migration.rb

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X