35

Heroku へのプッシュの悪い点は、データベースの移行を実行する前にコードをプッシュする (そしてサーバーが自動的に再起動する) 必要があることです。

これは明らかに、新しいテーブル/属性なしで新しいコードを持つ Web サイトをナビゲートするユーザーに約 500 エラーを引き起こす可能性があります。

方法はありますか?たとえば、カピストラーノの場合:

  • 新しいディレクトリにデプロイするコードを準備します
  • (逆方向の) 移行を実行すると、古いコードは引き続き完全に機能します
  • 雑種インスタンスを新しいディレクトリに移動し、サーバーを再起動します

...ダウンタイムはありません。

4

7 に答える 7

22

プライマリ本番アプリと同じ DB を指す 2 つ目の Heroku アプリをセットアップし、セカンダリ アプリを使用して、本番環境を中断することなく DB 移行を実行できます (移行によってアプリの以前のバージョンが壊れないことが前提です)。

Heroku アプリをPRODUCTIONおよびSTAGINGと呼びましょう。

展開シーケンスは次のようになります。

  1. 新しいコードをSTAGINGにデプロイする
    git push heroku staging
  2. STAGINGでデータベースの移行を実行します(PROD db を更新するため)
    heroku run -a staging-app rake db:migrate
  3. 新しいコードをPRODUCTIONにデプロイする
    git push heroku production

Heroku の無料利用枠を超える必要がないため、アプリのステージングに費用はかかりません。これを自動的に行う rake デプロイ スクリプトをセットアップするのは簡単です。

幸運を!

于 2012-04-10T00:26:11.603 に答える
11

同じアプリの 2 つのバージョンを同時にライブで使用できる場合、Heroku にはプリブート機能があります。

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

于 2012-09-04T20:54:58.237 に答える
5

プロセスをいくらか改善する唯一の方法は、この男が提案することです。ただし、これはまだホットデプロイシナリオではありません。

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

私が提案する1つのことは、最初に移行のみをHerokuにプッシュし、コードベースをプッシュする前にそれらを実行することです。これには、移行をスタンドアロンコミットとしてコミットし、毎回手動でプッシュする必要があります(これは理想的ではありません)。現在Herokuでホストされているすべての大型アプリで、この問題に対するより良い解決策がないことに非常に驚いています。

于 2011-05-03T13:47:56.330 に答える
3

Heroku がアプリを再起動すると、実際にはダウンタイムが発生します。古い dyno を削除する前に新しい dyno を起動する Preboot と呼ばれる新機能があります: https://devcenter.heroku.com/articles/labs-preboot/

データベースの移行に関しては、その記事はその問題に対処する方法に関するこの記事へのリンクです: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

于 2012-09-25T17:31:00.003 に答える
2

最初に移行をコミットして実行し、残りのコードをプッシュします。次のように単一のファイルを追加します。

git commit -m 'added migration' -- db/migrate/2012-your-migration.rb
于 2012-11-07T18:35:36.870 に答える
0

Heroku は capistrano でデプロイできません。あなたはherokuがリリースしたツールによってブロックされています。

ノーダウンタイムシステムは、すべての場合において不可能です。サーバーを停止せずに大きな変更でスキーマを変更する方法。停止しないと、一部の変更を回避でき、データベースの一貫性が失われる可能性があります。SOメンテナンスページの使用は通常の解決策です。

問題を回避するための小さな解決策が必要な場合は、2 つのサーバーでバランスを取ることです。移行中にデータベースの読み取りのみを行うもの。メンテナンス ページを避けて、移行中にこのインスタンスに切り替えることができます。移行後、マスターに戻ります。

于 2010-04-01T14:19:33.723 に答える
0

現在、ダウンタイムなしでこれを行う可能性はありません。私も嫌いです。

このコンソールコマンドは、私が考えることができる最小の時間でそれを行います

git push heroku master && 
heroku maintenance:on && 
sleep 5 && 
heroku run rails db:migrate && 
sleep 3 && 
heroku ps:restart && 
heroku maintenance:off
  1. git push heroku masterマスターブランチをherokuにプッシュする
  2. heroku maintenance:onメンテナンスを行うため、500 はありません
  3. sleep 5dyno が新しいコードを起動できるようにします (これがないと、移行が失敗する可能性があります)
  4. heroku run rails db:migrate実際の移行を行う
  5. heroku ps:restart経験から、再起動により、新しいdynoに最新のスキーマがあることが確認されます
  6. heroku maintenance:offメンテナンスの順番

-a <app name>複数のアプリがある場合は、すべての heroku コマンドの後ろに追加する必要がある場合があります。

たった 1 つのコマンドで、これらを Mac OSX のターミナルで連続して実行できます。

于 2018-04-19T14:16:46.873 に答える