サーバー負荷分散
アクセスが多くなると、1台のサーバーでは負荷が高すぎて通信できなくなってしまいます。
本項では、複数のサーバーに処理を振り分けるサーバー負荷分散について説明します。
サーバー負荷分散とは
例えば、Webサーバーに多数のアクセスがあった場合、1台のサーバーではまかないきれなくなってしまいます。サーバー負荷分散は、アクセスを複数のサーバーに分散させる機能です。
サーバー負荷分散の実現方法は他にもありますが、ここでは負荷分散装置を導入する場合について説明します。
なお、サーバー負荷分散はサーバーロードバランス(Server Load Balance)とも言われ、略してSLBと言われます。
負荷分散装置の動作
パソコンからWebサーバーにアクセスする場合、DNSによりFQDNからWebサーバーのIPアドレスを調べ、そのIPアドレスに対して通信を行います。
通常、このIPアドレスはWebサーバーのIPアドレスであるか、NATしている場合はWebサーバーのIPアドレスに1対1で対応したIPアドレスになります。
負荷分散装置を導入するとこのIPアドレスは負荷分散装置に設定し、負荷分散装置がWebサーバーの実際のIPアドレスに対して分散して通信を行うようになります。
負荷分散装置に設定するIPアドレスを仮想IPアドレスと言い、DNSにはこのアドレスを登録します。
また、NATしている場合は変換するアドレスは仮想IPアドレスにします。NATして仮想IPアドレスを宛先とすることで負荷分散装置でサーバー負荷分散ができます。
振り分け方法
負荷分散装置がWebサーバーに振り分ける方法はさまざまです。
ラウンドロビンは1つ目の通信は1台目、2つ目の通信は2台目、3つ目の通信は1台目と順番に振り分ける方法です。
この他にも、コネクション数が少ないサーバーに振り分ける方法、アクセスしているパソコン数が少ないサーバーに振り分ける方法などがあります。
セッション維持
負荷分散装置は、単純にパケットを振り分けているのではありません。
例えば、3ウェイハンドシェイクの間に異なるWebサーバーにパケットが送信されると、通信が成り立たなくなってしまいます。
このため、負荷分散装置はパソコンとサーバー間のコネクションを管理していて、1コネクションの間は同じサーバーに振り分けるようにしています。
また、例えばWebサーバーにログインして利用する場合などは、コネクションが終了した次の通信であっても異なるWebサーバーに振り分けられるとそちらのWebサーバーではログインしていないため、アクセスを拒否される可能性があります。
このような場合は、一定時間同じサーバーに振り分けるような仕組みが必要です。
例えば、同じIPアドレスから通信が来たら一定時間同じサーバーに割り振るようにします。通常はこれで問題ありませんが、接続元でNAPTをしている場合などに上手くいかない可能性があります。NAPTでは、コネクションのたびに送信元のIPアドレスが変わる可能性があるためです。
同じパソコンからの通信を同じサーバーに、より確実に振り分ける方法はCookieを使う方法です。
パソコンから通信が発生すると、サーバーまたは負荷分散装置でセッションIDを含むCookieを返します。ブラウザでは、Cookieを返したサーバーへの通信はCookieを含めて通信するため、負荷分散装置はCookieに含まれるセッションIDを見て同じサーバーに振り分けることができます。
Cookieには有効期限を示すこともできるため、その時間は同じサーバーに振り分けられます。
しかし、Cookieが有効でないパソコンや携帯電話などではこの方法は使えません。この場合は、URLにセッションIDを埋め込みます。
以下のように、URLに?がついている長いURLを見たことがあると思います。
http://example.com/index.html?jsessionid=1234567890abcghijk
jsessionid以降がセッションIDになります。
ログインした後、次のページを示す時にこのようなURLをサーバーまたは負荷分散装置から返信することでパソコンはそのURLにアクセスします。負荷分散装置はURLの内、セッションIDを見て同じサーバーに割り振るようにし、Webサーバーは?より前の情報を見て該当するページを応答します。
このように、負荷分散装置はセッションを維持する機能を持っています。これを、パーシステンスとも呼びます。
なお、一定時間同じサーバーに振り分けると書きましたが、この時間をどの位にするかは非常に重要です。
短すぎると、ユーザーがページを見ている間にタイムアウトして、次のページを見る時に違うサーバーに振り分けられる可能性があります。
逆に、長すぎると多数の通信がある場合は負荷分散装置で管理できるセッション数を超えて、管理できなくなってしまいます。
また、アプリケーション自体が複数台のサーバー間でログイン情報を同期して、どのサーバーに接続してもアクセスが拒否されないような作りになっている場合もあります。
このような仕組みがあれば、コネクション単位にサーバーを振り分けてもセッションは維持されます。
信頼性
3台のWebサーバーに負荷分散していたとして1台が故障した場合、残りの2台だけに振り分けるように負荷分散装置はサーバーを監視することが可能です。
以下は、監視の例です。
- L3監視
- pingの応答で監視します。
- L4監視
- pingに応答してもサービスがダウンしている可能性があります。例えば、Webサーバーの機能を提供しているアプリケーションがダウンして、ポート80番に応答しない場合などです。このため、ポート番号に対しても3ウェイハンドシェイクを行い、成功するとサーバーが正常であると判断する方法です。
- L7監視
- 3ウェイハンドシェイクの後、サービスに応じたコマンド、例えばHTTPであればコンテンツを要求するgetコマンドに正常に応答があった場合にサーバーが正常と判断する方法です。
負荷分散装置ではこのような監視を一定時間単位で行って、障害が発生したサーバーは切り離して正常なサーバーだけでサービスを継続することが可能です。これには、残ったサーバーだけでサービスを継続できる台数が必要なため、負荷分散対象のサーバーは余裕を持った台数にする必要があります。
サーバーを修理して応答が正常に返ってくるようになると、再度振り分け対象に戻すことができます。
サーバーが複数台ある場合、このようにして信頼性の向上が図れますが、負荷分散装置が1台の場合は負荷分散装置がダウンするとすべてのサービスが停止してしまいます。
このため、負荷分散装置自体の冗長化も検討が必要です。
Webサーバー以外の負荷分散
これまでWebサーバーへの負荷分散を示してきましたが、SMTP、POP3、IMAP、DNS、FTPなどさまざまなサービスでサーバー負荷分散はサポートされています。
負荷分散装置はこれらのサービスを認識し、例えばSMTPであれば3ウェイハンドシェイクを行った後、HELLOコマンドに応答するまでを監視するなど、一般的に高いレイヤーでの監視が可能です。
データの一致性
サーバー負荷分散をして異なるサーバーに振り分けた時、アクセスするサーバーによってデータが異ならないようにする必要があります。
一番簡単な方法は、1つのサーバーのデータを他のサーバーにコピーする方法です。
これで、どのサーバーにアクセスしても同じデータが参照できますが、サーバーの台数が増えるとコピーする手間がかかります。また、コピーするまではデータが一致せず、一致するまでタイムラグが発生してしまいます。
このため、頻繁に書き換えがあるサーバーには不向きです。
これを防ぐためにはNAS(Network Attached Storage)を導入し、負荷分散対象のサーバーからNASをマウントして自分のディスクのように見せ、すべてのサーバーで同じデーターが参照できるようにします。
マウントすると、例えば/aaaディレクトリには何もファイルがない場合でも、NASを/aaaにマウントすることでNASにあるディレクトリやファイルが/aaa配下に見れるようになります。
つまり、NASのディレクトリやファイルが/aaa配下に結合され、本来あった/aaa配下のディレクトリやファイルは見えなくなります。
NASは、複数のサーバーから同時に書き込みが発生しないよう排他制御もできます。したがって、Webメーラーのようにメールを受信したり消したりして書き込みが発生する場合にも対応可能です。また、インターフェースが冗長化されており、2台のLANスイッチに接続して冗長化できるものもあります。
他の方法として、ファイバーチャネルによりDAS(Direct Attached Storage)接続する方法もあります。
ファイバーチャネルは、1000Base-SXや1000Base-LXと同様の光ケーブルでサーバーと接続しますが、NASとは違って排他制御ができません。
このため、ストレージをマウントしているサーバーに振り分けるよう負荷分散装置で設定してActive/Standby構成にします。
負荷分散装置では信頼性で示したようにActive側の監視を行って、ダウンするとStandby側に分散を切り替えることができます。ただし、WebサーバーのストレージへのマウントはActive側がダウンしたことを検知してStandby側でマウントする仕組みは一般的に自動化されていないため、別途仕組みを作るかアプリケーションなどが必要になります。
DAS構成では1台のサーバーしかActiveにできませんが、一般的にNASと比較して高速で安価です。
メンテナンス性の向上
サーバーをメンテナンスする際、メンテナンス対象のサーバーに振り分けないようにすることも可能です。
例えば、既に発生しているセッションはそのまま残し、これから発生するセッションはメンテナンスするサーバーに振り分けないようにすれば、そのサーバーへのアクセスはセッション維持の時間を過ぎればなくなります。
他のサーバーでサービスは継続できるため、サービスを停止することなくサーバーのメンテナンスが可能になりますが、故障時の切り離しと同様、残ったサーバーだけで処理可能なサーバーの台数が必要です。
メンテナンスが完了すれば、手動で振り分け対象に組み入れることで再度振り分けされるようになります。
関連ページ
- トラブル対応「同一サブネット内で負荷分散不可」
- 同一サブネット内の通信で、負荷分散できないトラブル事例と対処方法を説明しています。
- トラブル対応「URL単位の負荷分散が出来ない」
- URL単位に負荷分散するサーバーを変えることもできます。その負荷分散ができないトラブル事例と対処方法を説明しています。