スケーラブルで信頼できるhaproxyクラスターをAmazon EC2にデプロイするにはどうすればよいですか?


25

ELBが提供するよりも高度な機能(主にL7検査)が必要ですが、EC2を使用したhaproxyなどでハートビートや高可用性などを処理する方法は明らかではありません。クラスター内に3つ以上のhaproxyノードが必要になる可能性が高いため、2つのノード間の単純なハートビートは機能しません。

haproxyノードの前にハートビートレイヤーを配置するのは、おそらくIPVSを使用する方法ですが、EC2クラスターの変更に応じて構成の変更を処理します(拡張などの意図的な変更、またはEC2ノード)は重要なようです。

ソリューションは、少なくとも2つのアベイラビリティーゾーンにまたがることが望ましい。

質問への答え:いいえ、セッションはスティッキーではありません。そして、はい、SSLが必要になりますが、理論的には完全に別のセットアップで処理することができます-SSLトラフィックを非SSLトラフィックとは異なる場所に向けることができます。


新しいバージョンのソフトウェアに向かうトラフィックの割合を徐々に増やしてカナリアを展開する方法を研究していますが、これでどこに行き着いたのか、とても興味があります。ジェスパーの提案を試してしまいましたか?
イアン

回答:


14

わかりました。SmugMugのレベルのトラフィックでAWSロードバランシングソリューションを構築したことはありませんが、理論とAWSのサービスを考えただけで、いくつかのアイデアが思い浮かびます。

元の質問には、負荷分散設計に影響を与える傾向があるいくつかの項目が欠落しています。

  1. スティッキーセッションかどうか?スティッキーセッションを使用せず、すべてのロードバランサー(LB)がラウンドロビン(RR)またはランダムバックエンド選択を使用できるようにすることが非常に望ましいです。RRまたはランダムなバックエンドの選択は、シンプルでスケーラブルであり、あらゆる状況で均等な負荷分散を提供します。
  2. SSLかどうか SSLが使用されているかどうか、およびリクエストの何パーセントが、一般に負荷分散設計に影響を与えます。多くの場合、証明書の処理を簡素化し、SSL CPUの負荷をWebアプリケーションサーバーから遠ざけるために、できるだけ早くSSLを終了することをお勧めします。

負荷分散レイヤー自体の可用性を高める方法の観点から答えています。アプリケーションサーバーのHAの維持は、L7ロードバランサーに組み込まれたヘルスチェックによって行われます。

OK、うまくいくはずのいくつかのアイデア:

1)「AWSの方法」:

  • 最初のレイヤーの最前面では、L4(TCP / IP)モードでELBを使用します。
  • 2番目のレイヤー、選択したL7ロードバランサー(nginx、HAProxy、Apacheなど)でEC2インスタンスを使用します。

利点/アイデア: L7ロードバランサーは、非常にシンプルなEC2 AMIで、すべて同じAMIから複製され、同じ構成を使用できます。したがって、AmazonのツールはすべてのHAニーズを処理できます。ELBはL7ロードバランサーを監視します。L7 LBが停止するか、応答しなくなると、ELBとCloudwatchが一緒になって新しいインスタンスを自動的に生成し、ELBプールに取り込みます。

2)「監視方法を使用したDNSラウンドロビン:」

  • 基本的なDNSラウンドロビンを使用して、2、3のIPアドレスで粗粒度の負荷分散を実現します。サイトに3つのIPアドレスを公開するとします。
  • これら3つのIPはそれぞれ、選択したL7ロードバランサーを使用してEC2インスタンスにバインドされたAWS Elastic IPアドレス(EIA)です。
  • EC2 L7 LBが停止した場合、準拠するユーザーエージェント(ブラウザー)は、代わりに他のIPのいずれかを使用する必要があります
  • 外部監視サーバーをセットアップします。3つのEIPをそれぞれ監視します。応答しなくなった場合は、AWSのコマンドラインツールとスクリプトを使用して、EIPを別のEC2インスタンスに移動します。

利点/アイデア:対応するユーザーエージェントが応答しなくなった場合、別のIPアドレスに自動的に切り替える必要があります。したがって、障害が発生した場合、影響を受けるのはユーザーの1/3のみであり、ユーザーのUAはサイレントに別のIPにフェールオーバーするため、これらのほとんどは何も気付かないはずです。また、外部監視ボックスは、EIPが応答しないことに気付き、数分以内に状況を修正します。

3)HAサーバーのペアへのDNS RR:

基本的に、これは1組のサーバー間の単純なハートビートに関するDon自身の提案ですが、複数のIPアドレスについては単純化されています。

  • DNS RRを使用して、サービスの多数のIPアドレスを公開します。上記の例に従って、3つのIPを公開するとしましょう。
  • これらの各IP はEC2サーバーのペアに送られるため、合計で6つのEC2インスタンスになります。
  • これらのペアはそれぞれ、ハートビートまたは別のHAソリューションとAWSツールを使用して、アクティブ/パッシブ構成で1つのIPアドレスをライブに保ちます。
  • 各EC2インスタンスには、選択したL7ロードバランサーがインストールされています。

利点/アイデア: AWSの完全に仮想化された環境では、実際にはL4サービスとフェイルオーバーモードについて簡単に推論することはできません。IPアドレスを1つだけ維持して同一のサーバーのペアを1つに簡素化することにより、推論とテストがより簡単になります。

結論:繰り返しますが、私は実際に本番環境でこれを試していません。私の直感から、オプション1はL4モードのELB、およびL7 LBとしての自己管理EC2インスタンスは、AWSプラットフォームの精神と最も整合性があり、Amazonが後で投資し拡張する可能性が最も高いと思われます。これがおそらく私の最初の選択でしょう。


1
だから私はアプローチ#1が大好きです、それが私が傾いている方向ですが、まだいくつかの興味深い落とし穴があります-とりわけ、ELBはAZ全体を非常にうまく処理できていないということです(すでに起こったこと) )。簡単だが不愉快な「解決策」は、AZを横断するようにELBの背後にあるプロキシを設定することです(別のAZのバックアップクラスタを使用することもあります)。したがって、各AZで少なくとも1つのhaproxyが稼働していれば問題ありません。しかし、それは問題を排除するのではなく、最小限にするだけです。この問題に関するアイデアはありますか?
ドンMacAskill

@Don MacAskill:AWSで大規模なサービスのダウンタイムが2回発生したことは知っていますが、AWSでAZよりも信頼性が高いことは困難です。...フロントエンドのマルチAZ運転への移行を容易スタック全体のマルチAZ運転に向けた最初のステップとなると、それはヘビの全体やかんだ可能性
ジェスパーM

@Don MacAskill:1つのオプションは、1つのAZ内のDynDNS Dynect-> ELB + L7 LBのような地理認識DNS解決と、別のAZのホットスタンバイ上の別のELB + L7です。(ジオ認識に加えて、Dynectにはいくつかのヘルスチェックもあります。)DynDNSは稼働時間に関して優れた実績がありますが、それでもジオ認識DNSを追加することは別のSPOFです。2つのAZでのDynect +ロードバランシングが、1つのAWS AZよりも長期のアップタイムに優れているかどうかは明らかではありません。マルチAZデータベースを除く
Jesper M

@Don MacAskill:最後に1つだけです。1つのELBインスタンスが複数のAZにまたがることができることに注意してください。それはEC2 領域にまたがることができません。しかし、同じ地域内の2つのAZでL7 LBにELBを使用するだけでよい場合は、これがはるかに簡単です。私がやります。
ジェスパーM

ええ、ELBが複数のAZにまたがり、AZ のどのバックエンドノードに到達できない何らかの障害(オーバーロード、ダウン、503を返すなど)がある場合、エンドユーザーはそれらのエラーを表示します- t他のAZに再ルーティングします。私はそれが計画されていることを望んでいますが、すでに一度は噛まれました。
ドンMacAskill

2

スティッキーセッションを実行していない場合、またはtomcat / apacheスタイル(LBに状態を保存するのではなく、セッションIDにノードIDを追加する)を使用している場合、ハプロキシのグループの前でELBを使用します。ELBにはヘルスチェックが組み込まれているため、ハプロキシを監視し、ダウンしたものをプールから取り出すことができます。ハートビートフェールオーバーよりもセットアップの方が少ない。

変更を伝播する限り、私は良い答えがありません。Puppetは初期設定および変更の実装には最適ですが、ノードの追加/削除には、30分のポーリング間隔よりも速い応答が必要になる傾向があります。


1
これは良い解決策です(そして良い質問です!)Amazon SNSを使用して、プッシュ方式で構成の変更を伝達できます。haproxy構成にノードを追加/削除するための通知システムが必要です。
ラフィクマニア

バックエンドサーバー(haproxyが転送するサーバー)を管理する別のオプションは、各バックエンドサーバーがすべてのhaproxies、または構成サーバー、定期的な登録(30秒程度)を送信することです。死亡するとすぐに登録解除されます(とにかくhaproxyは気付くはずです)。新しいものが現れると、自動的に回転します。これは明らかにNetflixが行うことです。
ベンジェンクス

1

私は自分で使ったことはありませんが、多くの人がEC2でこうした問題を処理するためにパペットを使うと言っているのを見てきました


ええ、EC2のPuppetはクラスターの管理を非常に簡単にします。マイクロインスタンスを作成し、それを操り人形マスターとして使用するだけです。
トム・オコナー

1
データセンターではパペットを使用していますが、まだEC2を試していません。puppet EC2-awareは何らかの方法で、ec2-describe-instancesなどを使用してノードを見つけ、その出力に基づいて自動的に構成/再構成できるようになっていますか?そして、パペットマスターが突然去って行くのをどのように扱いますか?
ドンMacAskill

なぜ突然消えるのでしょうか?
トム・オコナー

EC2に対応していませんが、起動時に新しいノードが署名用にマークされるように設定し、外部ノードスクリプトを使用してそれらを記述することができます。SimpleDB(外部ノード)とSQS(新しいノードの署名要求のキュー)でこれを行うためのPythonをいくつか書きました。:Ubuntuのdevのは、S3を使用してスクリプトを書いたubuntumathiaz.wordpress.com/2010/04/07/...
ベンJencks

からくり士が突然消えた場合は、それだけでマニフェストを実行していない、すなわち、それは、彼らがにいるどんな状態でノードを残します。
ベンJencks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.