ロードバランサーの動作

アプリケーション層で動作する機器には、ロードバランサーがあります。ロードバランサーは、サーバーにかかる負荷を分散するための装置です。大規模なWebサーバーを公開している企業だどでは、ロードバランサーをサイト全体の窓口に設置し、不特定多数のユーザーからのアクセスを複数のWebサーバーに分散させて処理させます。
また、ロードバランサーには、負荷分散に加えてサービスの可用性維持という機能もあります。ロードバランサーから各Webサーバーに対して、定期的に死活監視を行い、各サーバーが応答可能かどうかを常時チェックしています。故障などでサーバーが利用できない場合は、そのサーバーをリクエストの分散対象から外します。死活監視方法はPingレベルのものから、Webサーバー上で動作するサービスが正常に応答するかどうかを確認するアプリケーションレベルの死活監視まで可能です。

負荷分散装置を使った通信フロー

クライアントが負荷分散装置内の仮想サーバにアクセス

クライアントがWebサーバーにアクセスする場合を考えてみます。まず負荷分散装置内にクライアントからのHTTPアクセスを受け取るための仮想サーバを起動します。クライアントはこの仮想サーバ宛にHTTPコネクションを張りにいきます。この時のあて先IPアドレスは仮想サーバのIPアドレスになります。

負荷分散装置でNATを行う

クライアントからのHTTPアクセスを受け取った仮想サーバは、あて先IPアドレスを事前に設定した物理IPアドレスにNAT変換します。このときに変換する物理IPアドレスは、サーバの状態や負荷状況などから動的に変更します。こうすることで、コネクションを複数のWebサーバに分散させることができます。

戻り通信の処理

コネクションを受け取ったWebサーバは、処理を行った後に負荷分散装置に返信します。負荷分散装置は送信元IPアドレスをNATして、仮想サーバのIPアドレスに変換し、クライアントに返信します。

負荷分散装置では、コネクションごとにセッションを管理しているため、管理情報をもとに通信の制御を行っています。

サーバーの負荷分散方式

サーバーの負荷分散方式にはさまざまな手法がありますが、基本的な分散方式は以下の2つの方式です。

  • ラウンドロビン方式
  • 最小コネクション方式
ラウンドロビン方式

ユーザーからのアクセスに対して、ロードバランサーは順番に登録しているWebサーバーに割り振る方式です。負荷分散の動作は単純ですが、すべてのWebサーバーに均等にアクセスを割り振るため、Webサーバーごとに負荷がばらつく可能性があります。

最小コネクション方式

ユーザーからのアクセスに対して、ロードバランサーは登録しているWebサーバーの中で最もコネクション数が少ないサーバーに割り振る方式です。基本的にWebサーバーの負荷はコネクション数に比例するため、コネクション数を均等にすることで、均等な負荷分散を実現する方式です。

セッション管理やコネクション管理の設計は慎重に

アプリケーション層にありがちなトラブルとして、ロードバランサー上のセッション管理とコネクション管理があります。ロードバランサーを導入する目的は、サーバーの処理能力の平滑化と、可用性の維持の2つがあります。ただし、単純にロードバランサーを導入すればよいわけではなく、事前の詳細な設計が必要です。設計を失敗すると思いがけないトラブルに出くわすこともあります。ここではアプリケーション層でありがちなトラブル事例をいくつかご紹介します。

サーバーの性能設計は障害時を想定しよう

通常時はロードバランサーにWebサーバーを2台登録して、ラウンドロビン方式で負荷分散を行っていたとします。

この構成で1台のWebサーバーが故障でダウンした場合、ロードバランサーはWebサーバーの故障を検出し、障害が発生したWebサーバーを切り離す動作を行います。その後はすべてのアクセスは正常のWebサーバーに集中することになります。そのため複数台のWebサーバーで負荷分散していたとしても、トラブルを想定して1台のWebサーバーに負荷が集中したとしても耐えられる性能を考慮しておくことが重要です。

コネクション管理設計は慎重に

ロードバランサーはアプリケーション層までの情報を基にトラフィックを制御します。具体的にはTCPやUDPのヘッダーやセッションシーケンス番号、データ部の情報などを解析し、場合によっては書き換えを行ってトラフィックを分散させます。そのためロードバランサー内部にはTCP/UDPのコネクションテーブルを持ち、コネクション情報を管理しています。

そのためロードバランサーの運用には、コネクション管理が重要になります。コネクション管理を意識せずに設計を行うと、通信断が発生したり、設計通りの負荷分散ができないなどのトラブルが発生してしまいます。

例えば、通常コネクション情報は一定時間通信が無いと削除されます。これは無駄なメモリー消費を防ぐための機能で、ロードバランサー内のコネクション情報はもちろん、サーバー内でも同様にコネクション情報を保持していて、一定時間通信が無いと削除されます。このコネクション情報の保持時間がロードバランサーとサーバーで異なっていた場合、タイミングによっては通信断が発生してしまいます。

おすすめ記事

関連記事

メールマガジン

ネットワ-ク初心者のみなさま。
ネットワークの基礎知識を疎かにすることは
大変危険です!!

「初心者にも理解できるネットワーク技術」

これを読めばネットワークの基礎が分かる!!
ネットワーク関連の仕事に就きたいとお考えの学生の方や、ネットワークに興味があって転職を考えている社会人の方、まずは登録してみてください。

もちろん無料です!!

↓メールマガジン購読はこちら↓

メールアドレス: