14

Javaアプリのダウンタイムをゼロに展開するための非常に軽量なソリューションを構築しようとしています。簡単にするために、2つのサーバーがあると考えてみましょう。私の解決策は以下を使用することです:

  1. 「フロント」(ロードバランサー(ソフトウェア))については、ここでHAProxyについて考えています。

  2. 「背面」には、2台のサーバーがあり、どちらもアプリケーションがデプロイされたTomcatを実行しています。

新しいリリースを展開しようとしているとき

  1. HAProxyを使用してサーバーの1つを無効にするため、使用できるサーバーは1つだけです(古いリリースを実行しているサーバーAと呼びます)。

  2. 新しいリリースを他のサーバー(サーバーBと呼びましょう)にデプロイし、本番ユニットテストを実行し(テストがある場合は:-)、サーバーBをHAProxyで有効にし、同時にサーバーAを無効にします。

  3. これで、アクティブなサーバーは1つだけになります(サーバーB、新しいリリース)。サーバーBに新しいリリースをデプロイし、再度有効にします。

改善する方法についてアドバイスはありますか?どのように自動化しますか?

既製のソリューションはありますか、それとも独自のカスタムスクリプトを作成する必要がありますか?

ありがとう!

4

5 に答える 5

6

ゼロダウンタイムに関するこの記事から、いくつかの興味深い解決策を見つけました。その記事でいくつかの解決策だけを強調したいと思います。

1. A / Bスイッチ:(ローリングアップグレード+フォールバックメカニズム

スタンバイモードのノードのセットが必要です。新しいバージョンをそれらのノードにデプロイし、トラフィックを即座にそれらのノードに切り替えます。古いノードを元の状態に保つと、インスタントロールバックも実行できます。ロードバランサーはアプリケーションの前にあり、要求に応じてこのスイッチを担当します。

短所:アプリケーションを実行するためにXサーバーが必要な場合は、このアプローチでは2Xサーバーが必要です。

2.ゼロダウンタイム

このアプローチでは、一連のマシンを保持しません。むしろ、ポートバインディングを遅らせます。共有リソースの取得は、アプリケーションが起動するまで遅延されます。アプリケーションの起動後にポートが切り替えられ、古いバージョンも(アクセスポイントなしで)実行され続け、必要に応じて即座にロールバックされます。

3.並列展開– Apache Tomcat :( Webアプリケーションのみ)

Apache Tomcatは、バージョン7リリースに並列デプロイメント機能を追加しました。2つのバージョンのアプリケーションを同時に実行し、最新バージョンをデフォルトとして使用します。

4.遅延ポートバインディング:

ここで提案するのは、ポートをバインドせずに、基本的にコネクタを起動せずにサーバーを起動する機能です。後で、別のコマンドが起動してコネクタをバインドします。ソフトウェアのバージョン2は、バージョン1が実行されていて、すでにバインドされているときに展開できます。後でバージョン2を開始するときに、バージョン1のバインドを解除してバージョン2をバインドできます。このアプローチでは、ノードは数秒間だけ事実上オフラインになります。

5.高度なポートバインディング:

神話を破ることによって:'<code>アドレスはすでに使用されています'、*古いプロセスと新しいプロセスの両方が同じポートにバインドされます。ONモードのSO_REUSEPORTオプションを使用すると、2つ(またはそれ以上)のプロセスを同じポートにバインドできます。新しいプロセスがポートにバインドされたら、古いプロセスを強制終了します。

SO_REUSEPORTオプションは、次の2つの問題に対処します。

  1. アプリケーションバージョンの切り替え間の小さな不具合:ノードは常にトラフィックを処理できるため、ダウンタイムがゼロになります。

  2. 改善されたスケジューリング:

ここに画像の説明を入力してください

要約すれば:

遅延バインディングポートの再利用の両方を組み合わせることで、ダウンタイムを効果的にゼロにすることができます。また、スタンバイプロセスを維持すれば、インスタントロールバックも実行できるようになります。

于 2015-12-23T12:33:56.190 に答える
5

ロードバランサーがこのオプション(サーバーの枯渇)をサポートしている場合、ローリングアップグレードは確かに優れたソリューションです。もう1つの解決策は、OSGi対応のアプリケーションサーバーを使用して、アプリケーションの一部または全体をホットリプレースすることです。

私は最初のものをお勧めします。SpringSourceのAMS監視コンソールはtcServer(ステロイドのカスタムTomcat)のクラスターを停止でき、IIRCは自動的にローリングアップグレードを実行します(ただし、ドキュメントを確認してください)。

于 2010-12-16T15:10:48.653 に答える
3

OSGiバンドルに優れた分離とホットデプロイメントを提供するため、OSGiコンテナーに対応できる場合は、OSGiテクノロジーをご覧ください。Springフレームワークを使用している場合は、SpringOSGiを使用できます。

于 2010-12-16T15:12:57.633 に答える
3

LiveRebelは、ローリングリスタートの機能を提供し、自動化のためのCLIAPIとHudson/Jenkinsプラグインを提供します。

于 2012-05-05T18:35:06.580 に答える
2

Dockerコンテナーでまさにそれを行う簡単なデプロイがあります。

バージョン1をデプロイする

easy-deploy -p 80:80 -v some/path:other/path my-image:1

新しいバージョンをデプロイするには、更新されたタグ名でコマンドを実行するだけです。

easy-deploy -p 80:80 -v some/path:other/path my-image:2

開示:私はこのツールを作成しました。この問題の簡単な解決策が見つからなかったため、正確に作成しました。

于 2017-10-07T17:22:50.837 に答える