web-dev-qa-db-ja.com

予算内でApacheの負荷分散?

何百万人ものユーザーに驚異的な速度を提供するために負荷分散を行うのではなく、負荷分散の概念に頭を悩ませて、可用性と冗長性を確保し、問題が発生したときにユーザーを満足させようとしています。

私たちは予算に余裕があり、利用可能な知識が豊富なものに固執しようとしているので、Ubuntu VPSでApacheを実行することは、有名な検索エンジンが私たちを獲得するまでの戦略のようです(土曜日の皮肉を含む、注意してください =)。

少なくとも私にとっては、利用可能なさまざまなソリューションの完全なジャングルです。 Apaches独自のmod_proxyとHAproxyは、グーグルですばやく検索して見つけた2つですが、負荷分散の経験がないため、状況に適したものや、解決策を選択する際に何を処理するかがわかりません。可用性の問題。

私たちにとって最良の選択肢は何ですか?予算内にとどまりながら可用性を高くするにはどうすればよいですか?

13
Industrial

私が使用し、VPSで簡単に実装できるソリューションは、次のとおりです。

  • DNSは、6つの異なる有効なIPアドレスにラウンドロビン(sp?)されます。
  • 同じ構成の3つのロードバランサーがあり、 corosync/pacemaker を使用して6つのIPアドレスを均等に分散します(各マシンに2つのアドレスが割り当てられます)。
  • 各ロードバランサーには nginx + varnish 構成があります。 Nginxは、接続の受信と書き換え、および静的な提供を行い、それを負荷分散とキャッシュを行うVarnishに返します。

このArchには、私の偏見に基づいて、次の利点があります。

  1. corosync/pacemakerは、LBの1つに障害が発生した場合に、IPアドレスを再配布します。
  2. nginxを使用すると、SSL、特定の種類のファイルをファイルシステムまたはNFSから直接、キャッシュを使用せずに提供できます(大きなビデオ、オーディオ、または大きなファイル)。
  3. ワニスは、重量、バックエンドヘルスチェックをサポートする非常に優れたロードバランサーであり、リバースプロキシとして優れた役割を果たします。
  4. トラフィックを処理するためにさらに多くのLBが必要な場合は、クラスターにマシンを追加するだけで、IPアドレスがすべてのマシン間でリバランスされます。自動的に行うこともできます(ロードバランサーの追加と削除)。そのため、成長のためのスペースを確保するために、3台のマシンに6つのipを使用しています。

あなたの場合、物理的に分離されたVPSを持つことは良い考えですが、IP共有をより困難にします。目的は、障害に強い冗長システムと、負荷分散/ HAエンドのいくつかの構成で、単一障害点(すべてのトラフィックを受信する単一のロードバランサーなど)を追加することです。

Apacheについて質問されたことも知っていますが、当時はその仕事により適した特定のツール(nginxやvarnishなど)があります。 Apacheに任せて、バックエンドでアプリケーションを実行し、他のツールを使用してサービスを提供します(Apacheが適切な負荷分散やリバースプロキシを実行できないわけではありません。ジョブのさまざまな部分をより多くのサービスにオフロードして、各部分がうまく機能するようにするだけです。それはシェアです)。

6
coredump

HAproxyは優れたソリューションです。設定はかなり簡単です。

少なくとも2つの他のVPSの前に配置するには、別のVPSインスタンスが必要です。したがって、ロードバランシング/フェイルオーバーには、最低3 VPSが必要です。

考慮すべきいくつかのこともです:

  1. SSL終了。 HTTPS://を使用する場合、その接続はロードバランサーで終了する必要があり、ロードバランサーの背後では、暗号化されていない接続を介してすべてのトラフィックを渡す必要があります。

  2. ファイルストレージ。ユーザーが画像をアップロードした場合、それはどこに行きますか? 1台のマシンに座っているだけですか?どういうわけか、マシン間でファイルを即座に共有する必要があります-AmazonのS3サービスを使用してすべての静的ファイルを保存するか、ファイルサーバーとして機能する別のVPSを使用することができますが、冗長でめちゃくちゃ安いのでS3をお勧めします。

  3. セッション情報。ロードバランサー構成内の各マシンは、どのマシンにヒットするかわからないため、ユーザーのセッション情報にアクセスできる必要があります。

  4. db-別のdbサーバーがありますか?現在マシンが1台しかない場合、新しいマシンがデータベースサーバーにアクセスできることをどのように確認しますか。また、別のVPSデータベースサーバーの場合、冗長性はどの程度ですか。高可用性Webフロントエンドと1つのdbサーバーでの単一障害点があることは必ずしも意味がありません。ここで、dbレプリケーションとスレーブプロモーションも考慮する必要があります。

だから私はあなたの立場に立ってきました、それは実際の操作に1日に数百ヒットを行うウェブサイトの問題です。すぐに複雑になります。それがあなたに思考の糧を与えたことを願っています:)

6
bonez

私の投票は、ロードバランサーとしての Linux Virtual Server に対するものです。これにより、LVSディレクターは単一障害点であると同時にボトルネックになりますが、

  1. 私の経験では、ボトルネックは問題ではありません。 LVSリダイレクションステップはレイヤー3であり、非常に(計算上)安価です。
  2. 単一障害点は、2番目のダイレクタを用意して対処する必要があります。2つは Linux HA によって制御されます。

最初のダイレクタを最初のLVSノードと同じマシンに配置し、2番目のダイレクタを2番目のLVSノードと同じマシンに配置することで、コストを抑えることができます。 3番目以降のノードは純粋なノードであり、LVSまたはHAの影響はありません。

これにより、リダイレクトはアプリケーション層の下で行われるため、好きなWebサーバーソフトウェアを自由に実行できます。

3
MadHatter

このチェーンはどうですか?

ラウンドロビンDNS>両方のマシンのhaproxy>静的ファイルを分離するnginx> Apache

おそらく、ucarpまたはheartbeatを使用して、haproxyが常に応答するようにします。 SSLも必要な場合、Stunnelはhaproxyの前に配置されます

1
JamesRyan

適切なクラスタリングソフトウェアの使用を検討してください。 RedHat(またはCentOS) Cluster Suite 、またはOracleの ClusterWare 。これらは、アクティブ/パッシブクラスターのセットアップに使用できます。また、サービスを再起動したり、深刻な問題が発生した場合にノード間で失敗したりするために使用できます。これは本質的にあなたが探しているものです。

これらのクラスターソリューションはすべて、それぞれのOSライセンスに含まれているため、おそらくコスト面で優れています。 NFSマウント、またはクラスター化されたファイルシステムを持つ両方のノードによってアクセスされる物理ディスクのいずれかの、何らかの共有ストレージが必要です。後者の例は、SAN複数のホストアクセスが許可されたディスクで、 OCFS2 または [〜#〜] gfs [〜#〜]でフォーマットされています)です。 。これにはVMWare 共有ディスク を使用できると思います。

クラスタソフトウェアは、ノード上で常に実行される「サービス」を定義するために、またはそのノードが「アクティブ」である場合にのみ使用されます。ノードはハートビートを介して通信し、それらのサービスも監視します。障害に気付いた場合は再起動でき、修正できない場合は再起動できます。

基本的に、トラフィックの送信先となる単一の「共有」IPアドレスを構成します。次に、Apacheおよびその他の必要なサービスも定義でき、アクティブサーバーでのみ実行できます。共有ディスクは、すべてのWebコンテンツ、アップロードされたファイル、およびApache構成ディレクトリに使用されます。 (httpd.confなどを使用)

私の経験では、これは信じられないほどうまく機能します。

  • DNSラウンドロビンやその他の単一障害点ロードバランサーは必要ありません。すべてが1つのIP/FQDNにヒットします。
  • ユーザーがアップロードしたファイルはその共有ストレージに移動するため、マシンがフェイルオーバーしてもかまいません。
  • 開発者は追加のトレーニングなしでその単一のIP/FQDNにコンテンツをアップロードし、フェイルオーバーした場合は常に最新の状態です。
  • 管理者は、オフラインマシンを取得し、パッチを適用して再起動するなどの方法を実行できます。次に、アクティブノードをフェイルオーバーします。アップグレードに必要なダウンタイムは最小限です。
  • 古くなったノードをしばらくの間パッチしないでおくことができるため、フェイルバックも同様に簡単なプロセスになります。 (VMWareスナップショットより高速)
  • Apacheの構成への変更は共有されるため、管理者がオフラインボックスで変更を行うのを忘れたため、フェイルオーバー中に奇妙なことは何も起こりません。


-クリストファー・カレル

1

最適な負荷分散は、非常に費用がかかり、複雑になる可能性があります。基本的な負荷分散では、各サーバーがいつでもほぼ同じ数のヒットを処理していることを確認する必要があります。

最も単純な負荷分散方法は、DNSに複数のAレコードを提供することです。デフォルトでは、IPアドレスはラウンドロビン方式で構成されます。これにより、ユーザーはサーバー間で比較的均等に分散されます。これはステートレスサイトでうまく機能します。ステートフルサイトがある場合は、もう少し複雑な方法が必要です。

ステートフル要件を処理するために、リダイレクトを使用できます。各Webサーバーにwww1、www2、www3などの代替アドレスを割り当てます。最初のwww接続をホストの代替アドレスにリダイレクトします。この方法でブックマークの問題が発生する可能性がありますが、それらはサーバー全体に均等に分散されている必要があります。

または、別のパスを使用してステートフルセッションを処理しているサーバーを示すと、ホストを元のサーバーに切り替えたセッションをプロキシできます。これは、障害が発生したサーバーのセッションが、障害が発生したサーバーから引き継いだサーバーに到着したときに問題になる可能性があります。ただし、クラスタリングソフトウェアを除いて、状態はとにかく失われます。ブラウザのキャッシュにより、サーバーを変更するセッションはそれほど多くない場合があります。

フェイルオーバーは、障害が発生したサーバーのIPアドレスを引き継ぐようにサーバーを構成することで処理できます。これにより、サーバーに障害が発生した場合のダウンタイムが最小限に抑えられます。クラスタリングソフトウェアがないと、サーバーに障害が発生するとステートフルセッションが失われます。

フェイルオーバーがないと、ユーザーはブラウザーが次のIPアドレスにフェイルオーバーするまで遅延が発生します。

ステートフルセッションではなくRestfulサービスを使用すると、フロントエンドでのクラスタリングの問題が解消されます。ストレージ側のクラスタリングの問題は引き続き適用されます。

サーバーの前にロードバランサーが配置されている場合でも、それらの前にラウンドロビンDNSがある可能性があります。これにより、すべてのロードバランサーが確実に利用されます。これらは、設計に別のレイヤーを追加し、複雑さを増し、別の障害点をもたらします。ただし、いくつかのセキュリティ機能を提供できます。

最適なソリューションは、関連する要件によって異なります。

画像、CSSファイル、その他の静的コンテンツなどのコンテンツを提供するために画像サーバーを実装すると、アプリケーションサーバーの負荷を軽減できます。

1
BillThor

私は通常、同一のOpenBSDマシンのペアを使用します。

  • 負荷分散、Webサーバーの監視、および障害が発生したWebサーバーの処理には、RelayDを使用します
  • ロードバランサー自体の高可用性にはCARPを使用します。

OpenBSDは軽く、安定しており、非常に安全です-ネットワークサービスに最適です。

まず、layer3のセットアップをお勧めします。複雑なファイアウォール(PF)のセットアップを回避します。以下は、バックエンドWebサーバーのモニタリングを使用した単純なリレーロードバランサーの設定を示す/etc/relayd.confファイルの例です。

# $OpenBSD: relayd.conf,v 1.13 2008/03/03 16:58:41 reyk Exp $
#
# Macros
#

# The production internal load balanced address
intralbaddr="1.1.1.100"

# The interface on this load balancer with the alias for the intralbaddr address
intralbint="carp0"

# The list of web/app servers serving weblbaddress
intra1="1.1.1.90"
intra2="1.1.1.91"

# Global Options
#
# interval 10
timeout 1000
# prefork 5

log updates

# The "relaylb" interface group is assigned to the intralbint carp interface
# The following forces a demotion in carp if relayd stops
demote relaylb

#
# Each table will be mapped to a pf table.
#
table <intrahosts> { $intra1 $intra2 }

# Assumes local webserver that can provide a sorry page
table <fallback> { 127.0.0.1 }

#
# Relay and protocol for HTTP layer 7 loadbalancing and SSL acceleration
#
http protocol httprelay {
        return error
        header append "$REMOTE_ADDR" to "X-Forwarded-For"
        header append "$SERVER_ADDR:$SERVER_PORT" to "X-Forwarded-By"
        # header change "Connection" to "close"

        # Various TCP performance options
        tcp { nodelay, sack, socket buffer 65536, backlog 128 }

#       ssl { no sslv2, sslv3, tlsv1, ciphers HIGH }
#       ssl session cache disable
}

relay intra-httprelay {
        listen on $intralbaddr port 80
        protocol httprelay

        # Forward to hosts in the intrahosts table using a src/dst hash
        # The example shows use of a page with dynamic content to provide
        # application aware site checking.  This page should return a 200 on success,
        # including database or appserver connection, and a 500 or other on failure
        forward to <intrahosts> port http mode loadbalance \
                check http "/nlbcheck.asp" code 200

}
1
Paul Doom

cloudfoundry または多分 Elastic Beanstalk または単なる古い AWS自動スケーリング 考えでec2を与えましたか?私はそれを使用しており、それはかなりうまくスケーリングし、伸縮自在であることは人間の介入なしにスケールアップ/スケールダウンできます。

負荷分散の経験がまったくないとおっしゃっていることを考えると、これらのオプションは、起動して実行するために最小限の脳の「揚げ物」を必要とするため、お勧めします。

それはあなたの時間をよりよく使うかもしれません。

0
Ankur Chauhan