質問: Django を使用しているときに、ダウンタイムを 0 (または 0 に限りなく近づける) にするための優れた戦略は何ですか?
私が読んだ答えのほとんどは、「南を使用する」または「生地を使用する」と言っていますが、それらは非常に漠然とした答えです。私は実際に両方を使用していますが、ダウンタイムをできるだけゼロにする方法をまだ考えています。
いくつかの詳細:
私は EC2 でホストしている適切なサイズの Django アプリケーションを持っています。スキーマとデータの移行には Southを使用し、一連のJenkins (継続的インテグレーション サーバー)タスクによってトリガーされる繰り返しの展開/バックアップ タスクを自動化するにはbotoを使用したファブリックを使用します。私が使用するデータベースは、標準の PostgreSQL 9.0 インスタンスです。
私は...
すべての新しいコンテンツを使用してチームによって常に編集され、最新かつ最高のコードと...
ユーザー アカウントとユーザー データで変化し続けるライブ サーバー- すべて PostgreSQL に記録されます。
現在の展開戦略:
新しいコードとコンテンツをデプロイすると、両方のサーバー (ライブとステージング) の 2 つの EC2 スナップショットが作成されます。ライブは「新しいコンテンツを更新中」ページに切り替わります...
ダウンタイムが始まります。
ライブ クローン サーバーは、ステージング サーバーと同じスキーマ バージョンに移行されます (South を使用)。ライブから保存したいテーブルとシーケンスのみのダンプが作成されます (特に、ユーザー アカウントとそのデータ)。これが完了すると、ダンプがステージング クローン サーバーにアップロードされます。ライブから保存されたテーブルは切り捨てられ、データが挿入されます。私のライブサーバーのデータが大きくなるにつれて、この時間は明らかに増加し続けます.
ロードが完了すると、ライブ サーバーのエラスティック IP がステージング クローンに変更されます (したがって、新しいライブ サーバーに昇格されます)。ライブ インスタンスとライブ クローン インスタンスが終了します。
ダウンタイムが終了します。
はい、これは機能しますが、データが大きくなるにつれて、私の「仮想」ゼロ ダウンタイムはどんどん遠ざかっていきます。もちろん、どういうわけかレプリケーションを活用し、PostgreSQL のレプリケーションと「結果整合性」のアプローチを検討し始めることは私の頭をよぎりました。おそらくロードバランサーでできる魔法があることは知っていますが、その間に作成されたアカウントの問題がそれを難しくしています。
何を見ることをお勧めしますか?
更新:
典型的な Django 単一ノード アプリケーションがあります。私は、django 固有の問題をより深く掘り下げた解決策を望んでいました。たとえば、レプリケーションと並行してカスタム ルーターを使用して複数のデータベースをサポートする Django を使用するというアイデアは、私の頭をよぎりました。答えが触れられることを願っていることに関連する問題があります。