web-dev-qa-db-ja.com

Amazon EC2 Elastic LoadBalancing-ダウンタイムゼロのサーバー再起動のための戦略

Amazon EC2 Elastic Load Balancingの背後に5つのWebサーバー(Apache/mod_Perl)があります。Webサーバーにコードをデプロイするときに、これを実行しています。

  1. マシンごとに、Apacheをシャットダウンします
  2. コードを更新する
  3. サーバーからやり直して、次のサーバーに進みます

サーバーがシャットダウンすると、ELBはサーバーにリクエストを配信しないと思いますが、リクエストは引き続き処理されますか?

より良いアプローチは

  1. ELBからの新しいリクエストの受け入れを停止します
  2. 時々スリープし、すべての要求が応答された場合にのみWebサーバーをシャットダウンします
  3. コードを更新する
  4. サーバーを再起動します

しかし、私の地元のサーバーから(1)と(2)を実行するにはどうすればよいですか? AWS APIを使用する必要がありますか?またはそれを行う他の簡単な方法?

ありがとう。

4
Ryan

私はApache/mod_Perlを負荷分散されたEC2インスタンスとして実行し、あなたが言うように定期的にコードのアップグレードを行います。私のプロセスは次のとおりです。

  1. 1つまたは2つのインスタンスをローテーションから外します
  2. そのインスタンスでApacheをシャットダウンします
  3. インスタンスをアップグレードします
  4. ローテーションに戻り、他のものを削除します

AWSのドキュメントでは、ローテーションからインスタンスを追加および削除する方法について説明しています APIまたはコンソールのいずれかを使用して、選択します。私のアプローチでは、Webサーバーが正常にローテーションから外れるため、特定のユーザー要求が強制終了されるかどうかについて心配する必要はありません。 @ cyberx86で説明したように、コマンドapachectl -k gracefulを使用して、各リクエストが処理された後にApacheサーバーをシャットダウンできます。

2
khoxsey

これを実現する別の方法があります。各サーバーでアップグレードするものがいくつかある場合。同じ操作で5台のサーバーを更新するのは非常に無駄になります。

負荷分散とスケーリンググループを作成します。接続ドレインが有効になっていることを確認します。

私のアップグレードステップがあります。

  1. ロードバランサーから1つのインスタンスを削除します。必要なものをすべて更新してください。そして、本番インスタンスからAMIを作成します。これにより、インスタンスが再起動します。
  2. 新しいAMIを使用してScalingグループを設定します。
  3. ロードバランサーからインスタンスを削除し、インスタンスを停止します。新しいインスタンスが自動的に起動します
  4. 他のインスタンスのシャットダウンを続行し、すべてのインスタンスが再作成された後。アップグレードが完了しました。

いくつかのガイド:
自動スケーリンググループの負荷分散
接続のドレイン

3
Happier

新しいコードでオンラインになる新しく作成されたインスタンスをサポートするようにデプロイを変更できる場合-実際にELBからインスタンスを削除し、60秒待ってから(AmazonのELBがバックエンドとクライアントへの接続を閉じます)、インスタンスを終了します-そして、AmazonのAuto Scaling Groupを利用して、新しいインスタンスを作成します。このプロセスを自動化するオープンソースツールを作成しました。awsmissingtools.comで入手できます。「AWS-HA-Release」というツールを探してください。

2
Colin Johnson