6

展開プロセスを完全には理解していないと思います。これが私が知っていることです:

  • ホットデプロイメントを行う必要がある場合、つまりライブのコードを変更する必要がある場合、モジュールをリロードすることでそれを行うことができますが、
  • imp.reload変更したモジュールをリロードする代わりに、アプリケーションを再起動する必要があります。
  • 理想的には、実行中のコードはコード リポジトリのクローンである必要があり、デプロイが必要なときはいつでも変更をプルするだけです。

ここで、 (8011、8012 などのポートで)wsgiリバース プロキシの背後で実行されているアプリの複数のインスタンスがあるとします。また、 1 秒あたりのリクエスト数nginxを想定してみましょう。5

この場合、アプリケーションの実行中のすべてのインスタンスでコードをどのように更新すればよいでしょうか。

  • すべてのインスタンスを停止し、すべてを更新してから再起動すると、確かにいくつかのリクエストが失われます
  • 各インスタンスを 1 つずつ更新すると、すべてが更新されるまで、インスタンスは一貫性のない状態になります (一部は古いコードを実行し、一部は新しいコードを実行します)。リクエストが更新されたインスタンスにヒットし、その後の(および関連する)リクエストが古いインスタンス(まだ更新されていない)にヒットすると、間違った結果が得られます。

このようなビジーなアプリケーションがホットデプロイされる方法を誰かが完全に説明できますか?

4

2 に答える 2

2

nginxのようなロード バランサーの背後にある複数のホット インスタンスにまたがるデプロイでは、 Fabricのようなツールを使用してローリング デプロイを行うのが好きです。

  1. ファブリックはサーバー 1 に接続します
  2. ウェブサーバーをシャットダウンする
  3. VCS を使用するか、新しいアプリケーションで tarball を転送して、変更をデプロイします
  4. ウェブサーバーを起動する
  5. GOTO1 に移動し、次のサーバーに接続します。

そうすれば、オフラインになることはありません。nginx は、Web サーバーにラウンドロビンを試行するときに Web サーバーがダウンしたことを認識し、代わりに次のサーバーに移動し、ノード/インスタンスがバックアップされるとすぐにシームレスになります。本番使用に戻ります。

編集:

nginx のip_hashモジュールを使用して、1 つの IP アドレスからのすべてのリクエストがセッションの間同じサーバーに送信されるようにすることができます。

このディレクティブにより、クライアントの IP アドレスに基づいてアップストリーム間でリクエストが分散されます。ハッシュのキーは、クライアントのクラス C ネットワーク アドレスです。このメソッドは、クライアント要求が常に同じサーバーに転送されることを保証します。ただし、このサーバーが動作していないと見なされた場合、このクライアントの要求は別のサーバーに転送されます。これにより、クライアントが常に同じサーバーに接続する可能性が高くなります。

これが意味することは、Web サーバーが更新され、クライアントが新しいインスタンスに接続されると、そのセッションのすべての接続が引き続き同じサーバーに転送されるということです。

これにより、次のような状況に陥ります

  1. クライアントがサイトに接続し、サーバー 1 からサービスを受ける
  2. サーバー 1 は、クライアントが何をしていても終了する前に更新されます
  3. クライアントが途方にくれたままになっている可能性がありますか?

このシナリオでは、API/サイトから、クライアントを不安定な状態にする可能性のあるものを削除していますか?という疑問が生じます。たとえば、UI 要素の更新やページの追加などを行っていて、バックエンド API を変更していない場合は、問題はないはずです。API 関数を削除すると、問題が発生する可能性があります。

于 2012-06-19T13:10:33.070 に答える
0

サーバーの半分をオフラインにして (たとえば、負荷分散プールから引き出すことによって)、それらを更新できませんでしたか。次に、残りの半分を同時に引き下げながら、それらをオンラインに戻します。次に、それらを更新してオンラインに戻します。

これにより、アプリケーションの古いバージョンと新しいバージョンが同時にオンラインになることがないようにしながら、オンラインを維持できます。はい、これは、その間、サイトが容量の半分で実行されることを意味します。でもそれでいいかも?

于 2014-07-12T11:00:40.413 に答える