停止時間ゼロの展開を達成しようとしているので、理論的には、営業時間外に少なく、「遅い」時間にもっと多く展開できます。
私の現在のセットアップ、やや単純化された:
- WebサーバーA(.NETアプリ)
- WebサーバーB(.NETアプリ)
- データベースサーバー(SQL Server)
私の現在の展開プロセス:
- WebサーバーAとBの両方のサイトを「停止」する
- デプロイされているアプリのバージョンのデータベーススキーマをアップグレードする
- WebサーバーAを更新する
- WebサーバーBを更新する
- すべてをオンラインに戻す
現在の問題
これにより、毎月わずかなダウンタイムが発生します(約30分)。私は休み時間にこれを行うので、それは大きな問題ではありません-しかし、それは私が逃げたいものです。
また-実際に「戻る」方法はありません。通常、ロールバックDBスクリプトは作成せず、スクリプトのみをアップグレードします。
ロードバランサーの活用
一度に1つのWebサーバーをアップグレードできるようになりたいです。WebサーバーAをロードバランサーから取り出してアップグレードし、オンラインに戻し、WebサーバーBについて繰り返します。
問題はデータベースです。私のソフトウェアの各バージョンは、異なるバージョンのデータベースに対して実行する必要があります-だから私は一種の「スタック」です。
可能な解決策
私が検討している現在の解決策は、次のルールを採用しています:
- データベーステーブルを削除しないでください。
- データベース列を削除しないでください。
- データベース列の名前を変更しないでください。
- 列を並べ替えないでください。
- すべてのストアドプロシージャはバージョン管理する必要があります。
- 意味-「spFindAllThings」は、編集時に「spFindAllThings_2」になります。
- その後、再度編集すると「spFindAllThings_3」になります。
- 同じルールがビューに適用されます。
一方、これは少し極端に思えます-私はそれが問題を解決すると思います。アプリケーションの各バージョンは、中断することなくDBにヒットします。コードは、ビュー/ストアドプロシージャから特定の結果を予期します。これにより、その「契約」が有効になります。問題は、それがただずさんに染み込んでいるということです。アプリがしばらく展開された後、古いストアドプロシージャをクリーンアップできることは知っていますが、それは単に汚い感じです。また、これはこれらのルールに従っているすべての開発者に依存しますが、ほとんどの場合これは起こりますが、誰かが間違いを犯すと思います。
最後に-私の質問
- これはずさんですか、それともハックですか?
- 他の誰かがこれをやっていますか?
- 他の人はこの問題をどのように解決していますか?