2010-04-01 18 views
33

Eine schlechte Seite des Pushing zu Heroku ist, dass ich den Code schieben muss (und der Server startet automatisch neu) vor dem Ausführen meiner db-Migrationen.Hot-Bereitstellung auf Heroku ohne Ausfallzeit

Dies kann offensichtlich 500 Fehler bei Benutzern verursachen, die die Website mit dem neuen Code ohne die neuen Tabellen/Attribute navigieren: Die von Heroku vorgeschlagene Lösung ist die Verwendung des Wartungsmodus, aber ich möchte einen Weg ohne Nachteile meiner Webapp läuft immer!

Gibt es einen Weg? Zum Beispiel mit Capistrano:

  • ich den Code bereite in einem neuen Verzeichnis
  • Ich betreiben (rückwärts) Migrationen und den alten Code weiter arbeiten perfekt
  • ich swith Mischlings Instanz mit dem neuen Verzeichnis zu implementieren und Neustart des Servers

... und ich habe keine Ausfallzeit!

Antwort

0

Heroku kann nicht von capistrano bereitgestellt werden. Sie werden Block für Werkzeug von Heroku freigegeben.

Das No-Downtime-System ist nicht in allen Fällen möglich. Wie ändern Sie Ihr Schema mit großen Änderungen, ohne Ihren Server zu stoppen. Wenn Sie es nicht stoppen, können Sie einige Änderungen vermeiden und Ihre Datenbank kann inkonsistent sein. SO ist die Verwendung der Wartungsseite eine normale Lösung.

Wenn Sie eine kleine Lösung, um Probleme zu vermeiden wollen, ist ein Ausgleich in zwei Server. Eine mit nur gelesenen Datenbank während Ihrer Migration. Sie können während der Migration zu dieser Instanz wechseln und die Wartungsseite vermeiden. Nach deiner Migration kommst du zu deinem Meister zurück.

+1

Hallo Shingara, Es tut mir leid, aber ich mit Ihnen nicht einverstanden sind. Ich möchte nicht Load Balancing dafür verwenden: eine der großen Funktionen von Heroku ist die "trasparent" Cloud-Power aus Notwendigkeit und ich möchte diese Funktion verwenden ... Um das Gleichgewicht in Heroku zu laden, muss ich zwei beibehalten Verschiedene Apps und eine schreibgeschützte Datenbank können Probleme für meine Benutzer verursachen. Und ein System ohne Ausfallzeiten ist nicht immer unmöglich. Ich habe das System richtig und ohne Ausfallzeit erklärt. Im Falle einer großen Änderung ohne die Möglichkeit eines retro-kompatiblen DB-Schemas kann ich eine Wartungsseite verwenden: aber das sind die 5% aller meiner Fälle ... – zetarun

+0

Sie können das in dieser Antwort beschriebene Problem vermeiden, indem Sie CouchDB verwenden, beispielsweise. – iconoclast

5

Die einzige Methode, um den Prozess etwas zu verbessern, ist, was dieser Typ vorschlägt. Dies ist immer noch kein Hot Deploy Szenario aber:

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

Eine Sache, die ich vorschlagen würde, treibt nur Migrationen bis zu Heroku ersten und laufen sie, bevor Sie Ihr Code-Basis drücken. Dies würde bedeuten, die Migrationen als eigenständige Commits zu begehen und sie jedes Mal manuell zu schieben (was nicht ideal ist). Ich bin sehr überrascht, dass es bei allen großen Apps, die auf Heroku gehostet werden, keine bessere Lösung für dieses Problem gibt.

21

Sie könnten eine zweite Heroku-App einrichten, die auf dieselbe DB wie Ihre primäre Produktionsanwendung verweist und die DB-Migrationen ohne Unterbrechung der Produktion mithilfe der sekundären App ausführt (vorausgesetzt, die Migrationen beeinträchtigen nicht die vorherige Version Ihrer App) .

Nennen wir die Heroku apps PRODUKTION und STAGING.

Ihre deploy Sequenz wie etwas werden würde:

  1. Deploy neuen Code STAGING
    git push heroku staging
  2. Run Datenbank Migrationen auf STAGING
    heroku run -a staging-app rake db:migrate
  3. (ART db aktualisiert) Stellen Sie neuen Code auf PRODUCTION
    git push heroku production

Die Inszenierung App werden Sie nichts kosten, da Sie nicht frei Tier des Heroku und es wäre ziemlich trivial zu Setup ein Rake deploy Skript zu tun dies für Sie automatisch überschreiten müssen.

Viel Glück!

+0

Sie hätten immer noch ein bisschen Ausfallzeit mit Schritt 3 oder? – andrewrk

+0

Ich glaube, Heroku wird deine alten Dynos solange aufbewahren, bis die Kompilierung des neuen Slugs abgeschlossen ist, damit deine Seite verfügbar bleibt, während Schritt 3 läuft. Ich nehme an, es könnte eine momentane Ausfallzeit geben, während Heroku das Routing von den alten zu den neuen Dynos unterbricht, aber es sollte ziemlich minimal sein. – jshkol

+2

Ich bin mir nicht sicher, ob es wirklich eine gute Idee ist, Ihre Staging-Umgebung mit Ihrer Produktionsdatenbank zu verknüpfen, wenn Sie sie wirklich als Staging-Umgebung verwenden. – Daniel

9

Wenn Sie mit zwei Versionen derselben App gleichzeitig live leben können, verfügt Heroku nun über eine Preboot-Funktion.

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

+0

Der richtige Link ist jetzt: https://devcenter.heroku.com/articles/preboot –

1

ich zum ersten Mal Übernehmen Sie die Migrationen, führen Sie sie aus und drücken Sie den Rest des Codes. Fügen Sie eine einzelne Datei wie folgt:

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