web-dev-qa-db-ja.com

異なるデータセンターにまたがる複数のVPSセットの負荷分散/フェイルオーバー

この質問の多くのバリエーションがすでに尋ねられていることは知っていますが、それでも自分のニーズに対する適切な答えを見つけることができません。

私がやりたいのはセットアップですいくつか(少なくとも2つ)のVPS私のWebアプリをホストします。 負荷分散(Varnishなどで非常に簡単に実現できます)と比較的高い可用性-これが私の問題です。を提供したいと思います。

ロードバランサー(VPSの1つでホストする必要があります)を使用すると、単一障害点が発生します。これは、コンテンツを提供するマシンが1台しかない場合とほぼ同じです。

http://i.stack.imgur.com/lFafj.png

また、AFAIK DNSラウンドロビンメソッドは、ロードバランシングにとって悪い考えであるだけでなく、フェイルオーバーメカニズムも提供しません。サーバーの1つがダウンした場合でも、一部のユーザー(DNS IPがキャッシュされている)は、使用できないサーバーに接続しようとします。そして忘れてくださいshort TTL-これはnot正しい解決策です。

http://i.stack.imgur.com/mTLRf.png

考慮すべき非常に重要なことの1つ:VPSを多くのデータセンターに分割にしたいので、1つのデータセンターで電気またはISPに障害が発生しても、Webサイトはダウンしません。

私が考えることができる唯一の2つの解決策は、DNSラウンドロビンに依存するか(サーバーに障害が発生した場合、回復するまで少なくとも一部のユーザーにコンテンツを提供する)、または停電に備えて設備が整ったデータセンターで専用サーバーを購入することです。いくつかのインターネット接続があります(これは、10台のVPSを借りるのに比べてめちゃくちゃ高価です)。

したがって、問題は次のとおりです。複数の負荷分散されたVPSを使用しながら、単一障害点を回避する正しい方法は何ですか?

画像を失礼します。それらは、私が意味したことの可能な限り基本的な例です。

4
user500921

ノート:

あなたはいくら費やしても構わないと思っていますが、VPSに依存していて、データセンターの障害のケースに本当にお金を使いたいと思っている人はまだいません。

あなたの絵について:

ロードバランサーが単一のマシンである場合(複数のホストから構築されたシステムのように)、それが単一のシステムである場合、最初の失敗は真実ではありません。

SPA(可能な限り短い答え):

本当に短い答え:すべての場所で利用できるサービスIPを取得する必要があります。そして、BGPルーティングを設定します。

もう少し長い:通常、これはBGPを使用し、2つの異なる場所でIPをアナウンスすることによって行われます。 IPが常にアナウンスされるように設定できますが、一方の優先度はもう一方の優先度よりも低くなります。このように、通常の状況では、トラフィックは1つのサイトにのみ送信されます。それが失敗した場合、BGPルートはドロップされ、トラフィックは引き続き使用可能なIPに切り替わります。

これに似たセットアップがいくつかあります。一般的なレイアウトは次のとおりです。

(場所ごと):

  • 2つのロードバランサー

    これは、BGPも実行され、IPをアナウンスする場所です。通常、QuaggaといくつかのIPVSセットアップ(keepalivedを使用)

  • 負荷を処理するためのnサーバー(FE)

失敗の場合:

  • 1つのロードバランサー(単一のサイト)が失敗する

    • Keepalivedによって処理され、他のLBは作業を続行します
  • 任意の_n-k_のFEが失敗します(kは、問題が発生せずに失敗する可能性のあるFEの数です)

    • LBによって処理されると、チェックによってLBが削除され、それ以上トラフィックを受信しなくなります。
  • n-(k+1) FEが失敗する(単一のサイトで)

    • BGPによって処理されます。失敗したFEが多すぎるサイトのLBでBGPセッションを強制終了します。他の場所が引き継ぎます
  • 単一のサイトでの大規模な停止

    • BGPによって処理されると、BGPセッションはドロップされ、他の場所がジャンプインします

申し訳ありませんが、現在、これを手動で行う方法の詳細について詳しく説明する気にはなれません。私の推測では、あなたのために魔法をかけるロードバランサーサービスを借りることで、あなたはより良く(そしてより安く)なるでしょう。 Amazonがこれらを提供していることを読みましたが、残りのインフラストラクチャを使用せずにそれらを使用できるかどうかはわかりません。

3
Martin M.

私はまったく同じことを達成しようとしています。良い解決策を見つけたら投稿してください! :)

これまでに入手したのは、Amazon EC2の「ElasticIP」(および「ElasticLoad Balaning」)で、1つのリージョン内の異なるデータセンターにまたがるインスタンスにルーティングできます。 (皮肉なことに、彼らはかつて1つの地域のすべてのデータセンターを停止させる停止を経験しました)。

また、私はこれをグーグルで検索しました: http://www.fibercloud.com/MatrixTechnology -彼らはあなたが探しているものも提供しているようです。 (私自身は価格についてあえて尋ねませんでした:)

これまでのところ、最終的な答えは独自のBGPを管理することだと思いますが、少なくとも私にとっては問題外です。

DNSオプションについては、主にエンドユーザーのブラウザ内でのキャッシュが避けられないため、完全ではないことに一般的に同意します。また、小さいサイトでは低いTTLであると、ほとんどのユーザーにとって再帰的なDNSリゾルバーであるため、わずかな速度低下が発生すると思うので、低いTTLは完全ではありません。キャッシュにはありません(ただし、google.comのTTL 300秒))ところで、AFAIKブラウザーは、接続がタイムアウトすると、DNSでアドバタイズされた2番目のIPにフェイルオーバーします。完全に失敗することはないので、最初のものに変更しますが、むしろ劣化と呼びます。

同じデータセンターのホスト間で2つのVPSプロバイダーを使用し、それぞれが2つのホストをホストしている両方を組み合わせてIPフェイルオーバーを使用し、データセンター間でDNSを使用することを考えています(通常、両方のIPがアドバタイズされ、TTLが低く、一方が失敗すると、失敗したIPが削除されました)。

両方のサイトがお互いを利用できないと考えているため、お互いのIPを削除するために戦うスプリットブレインのケースに注意する必要があります。私はそれに対する良い解決策を見つけたと思います-各ホストでDNSサーバーを実行するので、スプリットブレイン時に各サイトは自身のDNSサーバーからのみ他のサイトを削除します。 1つのホストに到達できると、DNSはそのaccessible(彼は到達しましたよね?)ホストに解決されます。

4つのホストを使用するのが高すぎる場合は、信頼できるプロバイダーでIPフェイルオーバーのみを使用し、DNSだけに依存しない方がよいと思います。

よろしく、アレックス

0
Alex