Railsアプリをシームレスにアップグレードしたい:
意味:
- 移行を実行する必要がない場合は、コードを透過的にアップグレードし、デプロイ中に404にリクエストが送信されないようにします。
- これは難しいです。データベースをシームレスにアップグレードできるプロセスが必要です。その間、dbの更新が完了したら、Webリクエストを保留して(パイプにキューに入れて)、処理を許可します。(これは、5〜10秒の移行などの短い移行でのみ機能する必要があります)。
これをどのように達成しますか?
Railsアプリをシームレスにアップグレードしたい:
意味:
これをどのように達成しますか?
コードのみのアップグレード
アプリケーション コードをアップグレードするだけの場合は、パッセンジャーを使用すると、ビートを飛ばすことなくアップグレードできます。ただし、アップグレードがうまくいかない場合は保護されません。そのため、ラウンド ロビンで個別にアップグレードできる負荷分散された 2 つ以上の Web サーバーを用意することを検討する必要があります。
データベースのアップグレード
ユーザーとしては、ブラウザが 10 秒間回転するよりも、「メンテナンスのためダウン」ページを見たいと思っています。ダウンタイムは数秒程度であると説明し、ページを自動更新に設定します。
データベースのアップグレード中にダウンタイムが発生しないことに固執している場合は、いくつかのオプションがあります。
古いスキーマを有効に保つように、データベースをリファクタリングできます。これは、アプリの 2 つのバージョンを同じデータベースに対して実行し続け、時間の経過とともに新しいスキーマに移行できることを意味します。多くの「データベースのリファクタリング」記事があり、そのほとんどはトリガーなどを使用して目的の結果を達成することを提唱しています。個人的には、報酬が少ない割には大変な努力だと思います。
アプリケーションによっては、書き込みより読み取りに大きく偏っている可能性があります。つまり、データベースをアップグレードしている間、キャッシュされていないデータの「メンテナンス」ページを表示できます (これは、Facebook がデータベースのアップグレードを行う方法です)。大量のデータが memcached または redis に保存されている場合、これはさらに効果的です。または、読み取り専用データベース スレーブに切り替えて、書き込みアクションを無効にすることもできます。
これが役立つことを願っています!
Capistranoをご覧ください。