2010-12-16 46 views
11

私は、Javaアプリケーション用のゼロダウンタイムデプロイメントのための非常に軽量なソリューションを構築しようとしています。わかりやすくするため、2つのサーバーがあると考えてください。私の解決策は以下を使用することです:Javaアプリケーション用のゼロダウンタイムデプロイ

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

  2. 「バック」では、2つのサーバーとも、どちらも展開されたアプリケーションでTomcatを実行しています。

我々は新しいリリースに

  1. を展開しようとしているときに我々がこれだけあるサーバーが(の古いリリースを実行しているサーバーのA、それを呼びましょう)になり、HAProxyとサーバーのいずれかを無効にします利用可能です。

  2. 他のサーバーに新しいリリースをデプロイする(サーバーBと呼ぶ)、生産ユニットテストを実行する(:-)、HAProxyでサーバーBを有効にする、サーバーAを同時に無効にする)

  3. もう一度アクティブなサーバーが1つ(サーバーB、新しいリリース)です。サーバーBに新しいリリースをデプロイし、再度有効にします。

いずれかをお勧めしますか?どのように自動化?

準備が整ったソリューションはありますか、自分のカスタムスクリプトで終わらせる必要はありますか?

ありがとうございます!

答えて

4

ロードバランサがこのオプションをサポートしている場合(サーバーの枯渇)、ローリングアップグレードは確かに良いソリューションです。 OSGi対応のアプリケーションサーバーを使用して、アプリケーションの一部または全部をホットリプレースする方法もあります。

私は最初のものをお勧めします。 SpringSourceのAMS監督コンソールは、tcServerのクラスタをステロイドでカスタムTomcatにすることができ、IIRCはローリングアップグレードを自動的に行います(しかし、ドキュメントをチェックします)。

3

OSGiバンドルに適切な分離とホットデプロイメントを提供するので、OSGiコンテナーを使用できる場合は、OSGiテクノロジーを参照してください。あなたが使用できるSpringフレームワークを使用している場合Spring OSGi

3

LiveRebelはローリング再開機能を提供し、自動化のためのCLI APIとHudson/Jenkinsプラグインを提供します。

3

私はゼロからのダウンタイムに関してこのarticleから興味深い解決策を見つけました。私はその記事ではほんの少しの解決策を強調したいと思います。

1. A/Bスイッチ:ローリング+フォールバック機構アップグレード)

我々は、モードによって立っ内のノードのセットを有するべきです。これらのノードに新しいバージョンを導入し、トラフィックを即座に切り替えます。古いノードを元の状態に保つと、インスタントロールバックも実行できます。ロードバランサはアプリケーションの前にあり、要求に応じてこのスイッチの役割を担います。

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

2.ゼロダウンタイム

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

3.パラレル展開 - Apache Tomcatの:(唯一のWebアプリケーションの場合)

Apache Tomcatが彼らのバージョン7リリースに並列展開機能を追加しました。彼らは、アプリケーションの2つのバージョンを同時に実行させ、最新バージョンをデフォルトとして使用します。結合

4.遅延ポート:

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

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

神話を壊すことによって「Address already in use」、*両方の古いプロセス&新しいプロセスが同じポートにバインドします。 ONモードのSO_REUSEPORTオプションを使用すると、2つ(またはそれ以上)のプロセスを同じポートにバインドできます。新しいプロセスがポートにバインドしたら、古いプロセスを強制終了します。

SO_REUSEPORTオプションアドレス二つの問題:

  1. アプリケーションのバージョンの切り替えの間に小さなグリッチ:ノードが効果的に私たちにダウンタイムゼロを与えて、トラフィックのすべての時間を提供することができます。

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

enter image description here

:両方後半結合ポートがを再利用し組み合わせることにより

、我々は事実上ゼロダウンタイムを実現することができます。スタンバイプロセスを維持すると、インスタントロールバックも実行できるようになります。

0

Dockerコンテナとまったく同じであるeasy-deployがあります。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 

開示をコマンドを実行して展開するには:私はこのツールを構築しました。私はこの問題のための簡単な解決策を見つけることができなかったので、それを正確に構築しました。

関連する問題