web-dev-qa-db-ja.com

ミラーリングされたデータベースとファイルシステムを備えた複数のVPS

私は最近VPSクラスターに興味を持ち、マルチVPSセットアップをセットアップしようとするのは素晴らしいアイデアのように思えました。これについては以下で説明します。これは実際には本番環境での使用を目的としたものではなく、マルチサーバーシステムの関連スキルと知識を向上させるための実験としてのものです。ただし、ノウハウが不足しているため、一般的な情報が必要です。

セットアップの説明

私はRedisをデータストアとして使用するNode.jsアプリケーションを毎日扱っているので、それがセットアップの基礎として機能します。私が念頭に置いていたのは、基本的に最低2つのVPSセットアップでした。各サーバーは同じNodeサービス(両方のサーバーで一度に5つの異なるサービスとしましょう)を実行します)、また各VPSはRedisの1つのインスタンスを実行します。これは=によって使用されます。 Nodeサービスはデータを保存します。このセットアップの目的は、両方のサーバー間のデータミラーリングを有効にすることです(最初のサーバーのサービス#1が何かを追加した場合Node Redis、変更は2番目のサーバーにも反映される必要があります。これは、アップロードされたファイルなどが両方のサーバーにミラーリングされる必要があることも意味します(データストアとファイルシステムの両方での変更が他方に反映される必要があるという意味で)。

理想的には、これにより、サーバー間で負荷を共有する単純なロードバランサーが有効になり、単一のサーバーに障害が発生した場合、他のサーバーが実行を継続するため、Nodeサービスをオンラインに保つことができます。ミラーリングする必要のある変更は高くなく、1分間の遅延でも問題にはなりません。ただし、ユーザーがデータをアクティブに更新している場合は、変更したばかりのデータを提示する必要があります(何らかの意味で変更が他のサーバーにまだミラーリングされていない可能性があるため、彼はデータを更新したサーバーとの通信を強制されました)。

質問

  1. 負荷分散を実現するための合理的な方法は何ですか? DNSマジックの使用について聞いたことがありますが、実際には理解していません。 DNSレコードは複数の場所にキャッシュされるため、単に更新するのは遅すぎます。また、他のサーバー間のバランシングを処理する1つの「メインプロキシ」サーバーの使用についても読みました。メインサーバーに障害が発生するとすべてがオフラインになるため、これは少し危険なようです。

  2. アップロードされた画像などが両方のサーバーに存在するように、ファイルシステムの一部を異なるVPSにミラーリングする方法。広く普及しているソフトウェアオプションはありますか、それともアップロードを検出してそれらのファイルを異なるサーバーに複製する単純なスクリプトで問題なく動作しますか?

  3. Redisは、私が説明した種類のミラーリングもサポートしていますか?マスタースレーブレプリケーションに関する情報しか見つかりませんでした。正しく理解していれば、マスターはスレーブを更新できますが、スレーブはマスターを更新できないという意味で、更新は一方向です。

ありがとうございました!

4
zatatatata
  1. ペースメーカーについて読む( www.clusterlabs.org )。負荷分散とフェイルオーバー(サービスの実行と移動、IPなど)のためにクラスターリソースを管理できます。
  2. 次の解決策があります:
    • 2ノードクラスターの場合、DRBDをアクティブ/パッシブモードで使用できます( http://www.drbd.org/ );
    • 複数のサーバーでは、クラスターファイルシステム(GFS2など)を使用できます。
    • たくさんのファイルがあり、いくつかのノードで非常に高速な同期が必要な場合は、 lsyncd で解決することをお勧めします。
  3. 私は今、そのようなredisの解決策はありません。この目的のために、MongoDBとレプリカセットを使用できます。
2
Biriukov

質問1のみを支援できます。

負荷分散とフェイルオーバーにはいくつかのアプローチがあります(最も単純なものから)

  1. DNSラウンドロビン(負荷分散とフェイルオーバー)
  2. ダイナミックDNS(フェイルオーバー)
  3. プロキシ(負荷分散とフェイルオーバー)
  4. ローカルIPフェイルオーバー(フェイルオーバー)
  5. BGPエニーキャスト(ロードバランシングとフェイルオーバー)

DNS負荷分散は単純です:IP 1.1.1.1と2.2.2.2のサーバーが2つ(またはそれ以上)あるとします。 DNS負荷分散を設定するには、ホスト名のDNSレコードを作成します(例:www.example.com)。

www.example.com. A 1.1.1.1
                 A 2.2.2.2

(また、DNSサーバーは、ラウンドロビンモードでこの名前を提供するように構成する必要がありますが、通常はデフォルトです)。

これで、www.example.comへの各DNS要求は、疑似ランダムな順序で2つのアドレスで応答されるため、クライアントはサーバー間で均等に分散する可能性があります。

レコードを頻繁に更新する必要はありません。一度セットアップすると、永久に機能します。また、some程度のフェイルオーバーも提供します。たとえば、1つのホストがダウンしている場合、ブラウザーはタイムアウトしてから2番目のホストを試行しますが、かなりの遅延が発生する可能性があり、ユーザーはそれを気に入らないでしょう。

ダイナミックDNS。 1.に追加される可能性があります。ホストに障害が発生すると、DNSレコードが動的に更新され、障害が発生したホストへの参照が削除されますが、DNSシステムでのキャッシュが多いと、ある程度の劣化が発生します。上記の動作。非常に低いTTLを使用すると状況は改善されますが、TTLを考慮しないクライアントOS /ブラウザー内のキャッシュがあり、一部のISPも低いTTLを無視しません。とにかく、結論-それは非常に簡単で、バランシングと基本フェイルオーバーを実現する手頃な方法。

プロキシ。シンプルで負荷分散に人気があります。単一障害点を排除するには、それを他のアプローチと組み合わせる必要があります。

IPフェイルオーバー。 2.に加えて、プロキシ自体の障害に対処するために、「IPフェイルオーバー」セットアップで使用される2つのプロキシ-基本的な考え方は、通常はHost1で1回だけ発生する1つのIPアドレスを持つことです。失敗すると、Host2がそれを検出し、IPがHost2で起動します。 Linuxの「ハートビート」プロジェクトを探してください。 (プロキシなしでサーバー自体をフェイルオーバーすることもできますが、バランスを取ることはできません)。 通常両方のPCが同じサブネット(同じデータセンター)にある必要があります。

エニーキャスト。アイデアは、いくつかの物理的な場所にある単一のIPアドレス(実際には単一のサブネット)にルートをアドバタイズすることです。独自の/ 24サブネットと、BGPを構成する機能が必要です。 DNSサーバーによく使用されるエニーキャスト。永続的なTCP接続には問題があるため、UDPとDNSに簡単に適合しますが、Webにも使用されることがあります。

それが基本的な考え方です。ご覧のとおり、すべての方法には制限と複雑さがあります。そして、それが十分に複雑でない場合は、上記のアプローチの考えられる組み合わせを構築することができます:)

2
Sandman4