web-dev-qa-db-ja.com

Apacheフェイルオーバーと負荷分散

私は小さな金融会社でWebアプリケーション開発者として働いています。当社には、PHPでコード化され、Apacheで実行されている内部Webサイトがあります。最近、サーバーがダウンし、Webサイトが数日間ダウンして深刻な問題が発生しました。

Webサイトにサービスを提供するためにさらに2台のサーバーをセットアップするように依頼されました。したがって、3つの異なるマシンで実行される3つのApache Web/Appサーバーが必要です。ユーザーがWebサイトにログインするときは、負荷に応じて3つのサーバーのいずれかを使用する必要があります。また、1つまたは2つのサーバーがダウンした場合、アップしているサーバーがWebサイトの要求を処理する必要があります。

PHPでウェブサイトを作成し、Apacheサーバーでホストすることを知っています。ネットワークの知識がありません。上記のシステムを作成するために何を学ぶ必要があるか教えてください。

スプーンで餌をやるつもりはありません。目標を達成するために学ばなければならないことへのポインタが必要です。私は同時にグーグルしていますが、実装を急いでいるので、ここでこの質問をしました。

6
Cracker

一般的なアプローチは、クラスタリングを認識しているWebアプリケーションを開発することです。データベース、セッション、共有データ、動的データに関連するサイトの基本を作り直す必要があるでしょう。私の質問があなたに興味を持ってくれると確信しています: スケーラブルなWebサービスのためのクラウド/クラスターソリューション 。 Webサイトを「スケーラブル」にするには、スケーラブルなデザインを作成する必要があります。残念ながら、以下に「もっと速くする」というボタンはありません:)

簡単な方法は、これらのサーバー間ですべてのデータを複製し(ファイルには GlusterFS を使用し、MySQL /これらのサーバー間で何でも複製できます)、すべてのサーバーからすべてのセッションを利用できるようにすることです。これは最善の提案ではありませんが、コードを作り直す必要はありません:)

負荷分散はラウンドロビンDNSを使用して簡単に実装できます。異なるサーバーを指す複数の「A」レコードを追加するだけで、クライアントによってランダムに選択されます。たとえば、Googleには次の機能があります。

$ Host -ta google.com 
 google.comのアドレスは74.125.87.147 
 google.comのアドレスは74.125.87.103 
 google.comのアドレスは74.125.87.104 
 google.comのアドレスは74.125.87.99 
 google.comのアドレスは74.125.87.105 
3
kolypto

負荷分散の最も簡単な方法は、o_O Tyncの回答に示されているラウンドロビンDNSのようなものですが、これらのサーバーの1つがダウンし、そのDNSレコードを削除すると、ユーザーの一部が次の場所に誘導されることに注意する必要があります。 DNSレコードのTTLが期限切れになるか、手動でIPを変更するまで、サーバーがダウンします。稼働時間がどれほど重要かによっては、これは受け入れられない場合があります。さらに、ダウンしたサーバーとのセッションの途中で、彼らはそのセッションを失います。

RRDNSは負荷分散には適していますが、高可用性の鍵ではありません。

真の高可用性負荷分散を実装する最も簡単な方法(そして最も簡単な方法は、最も簡単で、必ずしも最も安価ではない)は、インターネット接続とWebサーバーの間にあるハードウェア負荷分散ネットワークアプライアンスを使用することです。このようなデバイスを使用して、システム間で負荷を分割したり、問題が発生した場合にサーバーをローテーションから自動的に(または手動で)削除したりできます。さらに、TCP接続を処理するため、元のデバイスがダウンした場合にユーザーを別のサーバーに自動的に接続できます。このソリューションのもう1つの利点は、通常、ほとんど必要ないことです。または、実装するアプリケーションの変更はありません。trulyの「高可用性」構成では、通常、2つのロードバランサーを使用して単一障害点を減らします。

もう1つのオプションは、通常のサーバーを使用して高可用性の負荷分散シナリオを実現することです。 ここ は、高可用性の負荷分散されたApacheクラスターの構成に関する情報です。 Linux-HA サイトは、Linuxの負荷分散情報の優れたソースです。

さらに別のオプションは、 Linux Virtual Server プロジェクトのようなものです。 LVSは、サーバーとロードバランサーの両方のすべてのコンポーネントにLinuxを使用し、通常、シームレスなソリューションを提供します(一度構成すると)。

結論として、私の一般的な推奨事項は、経験の浅い管理者がそのような状況で負荷分散を設定するように求められるような状況では、ハードウェアロードバランサアプライアンスが最も簡単な方法です。それは明らかにいくらかのお金がかかりますが、多くの時間を節約することができます。もちろん、トレードオフポイントの決定は個人の決定です。

2
phoebus

私がすることは、座って、問題のサーバーで現在実行されているものを確認することです。

明示的には言わなかったが、今のところあなたはLinuxを実行していると仮定するつもりだ。あなたが見たいのはワニスです。これは、高性能のリバースプロキシおよびロードバランサーです。オンラインの例に従って設定できます ここ そしてそれは簡単に動作するはずです。

3台のサーバーのうち2台のワニスノードがある場合は、トラフィックの3分の1を各サーバーにポイントし、ラウンドロビン割り当てとして配置します。これら2つのサーバーには一意のパブリックIPアドレスが必要であり、DNSに複数のAレコードを設定して、ラウンドロビンDNS(RRDNS)を実行できます。

サービスがビジネスにとって非常に重要であり、最後の停止に多額の費用がかかる場合は、より回復力があり冗長なネットワークを主張することをお勧めします。現在、1つのサプライヤが提供する1つのIPに1つのサーバーしかない場合、以前の停止がネットワーク関連であった場合、ネットワークの復元力を高めると稼働時間が改善されることがあります。

監視もよく見てください。サーバーをダウンさせる可能性のあるサーバー上のデータを監視していることを確認してください。SMARTハードディスク上のデータ、空きスワップ領域、空きメモリ、空き/ディスク容量。NagiosとMuninをセットアップします。Nagiosは重要な監視条件が満たされたときにアラートを出し、Muninはこれらのデータをグラフ化します。

おそらく、アプリケーションレベルの変更も行う必要があります。アプリケーションがセッションベースであると仮定すると、常に同じサーバーに送信されるとは限らないユーザーの要求を処理するための何らかの方法が必要になります。それらをクライアント側、またはサーバー側でスティッキーにすることができます。 memcachedがここで大いに役立つことがわかるでしょう。アプリケーションレベルの変更については、コードが多くサーバーが少ないため、StackOverflowで質問することをお勧めします。

1
Tom O'Connor
0
Rajat