LVSとは

「LVS」はLinux上で動作する、トランスポート層レベルの負荷分散(以下ロードバランサとする)であり、GPL(GNU Public Lisence)下で配布されています。

「LVS」の構成

「LVS」は、2つのモジュールと1つのコマンド群から構成されています。

 

  • ip_vs カーネルモジュール
  • スケジューラカーネルモジュール
  • ipvsadmコマンド

ip_vs カーネルモジュール

提供されるサービスのポート番号宛のパケットを検出し、それと対応する実サーバに対して、パケットの転送処理を行います。TCPコネクションを、あらためて開設する際のパケット(実サーバとの対応づけがされていないパケットを指す)や、UDPパケットの場合には、転送先の実サーバについてどれにすべきか、スケジュールカーネルモジュールに問い合わせを行ってから処理をします。
パケット転送方法には、以下のような種類があります。

 

LVS/NAT
 NATにより宛先IPアドレスを実サーバアドレスに変換して転送する

ロードバランサ宛に到着したパケットは、宛先IPアドレスを実サーバのものに変換することで実サーバに転送します。実サーバからクライアントへの応答パケットは、ロードバランサがソースアドレスを、ロードバランサのIPアドレスに変換してクライアントに転送します。この構成では、ロードバランサ側で、IPアドレス変換を行うという負荷が存在します。しかし、他の構成と異なり、実サーバはロードバランサに組み込むために特別な設定をする必要がありません。

 

LVS/DR
 
宛先IPアドレスはそのままで、MACアドレスのみを実サーバ用に変更し転送する

到着したパケットは、IPレベルでの変換をしません。IPパケットとしてはそのままで、データリンク層レベルの宛先を、実サーバのものにすることで実サーバへの転送を行います。このため、実サーバではダミーのネットワークインターフェースにロードバランサのIPアドレスを付け、ロードバランサのIPアドレス宛のパケット「も」受信できるようにしておく必要があります。この構成では、IPパケットを全く変更せずに実サーバに転送するため、他の構成よりも転送にかかる負荷が圧倒的に低くなります。しかし、実サーバでダミーのインターフェースの設定をする必要があったり、またロードバランサと実サーバを、同一のネットワーク上に置かなければならないという制限もあります。

 

LVS/Tun
 パケットを宛先IPアドレスが実サーバであるIPヘッダでカプセル化して転送
到着したパケットの外側(前)にさらにIPヘッダを追加してカプセル化し、外側のIPヘッダの宛先を実サーバのものとして転送を行います。実サーバにはカプセル化されたパケットが到着するため、実サーバではカプセル化されたパケットを受信できるように設定をする必要があります。

スケジューラカーネルモジュール

クライアントと実サーバの対応づけのポリシーの部分を担当しています。スケジューラカーネルモジュールは、スケジュールポリシーごとに存在しています。
スケジューリングポリシーには、以下のような種類があります。

 

  • rr(Round-Robin)
    順番にすべてのサーバに振分ける方式
  • wr(Wightes Round-Robin)
    設定された重み付けにより振分ける方式
  • lc(Least-Connection)
    確立されているコネクション数がもっとも少ないサーバに振分ける方式
  • wlc(Weighted Least-Connection)
    各サーバに設定された重み付けと、確立されているコネクション数をもとに最も負荷の少ないサーバに振分ける方式
    (現在のコネクション数+1)/重み で各サーバの負荷を計算し、最も小さな数値のサーバに振分ける
  • lblc(Locality-Based Least-Connection)
    メインのサーバが過負荷(コネクション数)になった場合に負荷の少ないサーバに振分ける方式
  • lblcr(Locality-Based Least-Connection with Replication)
    負荷状態(コネクション数)に応じて、振分け先実サーバの構成を動的に変更する方式

ipvsadmコマンド

ipvsadmコマンドはip_vsカーネルモジュールのフロントエンドとして動作します。
このコマンドにより、ロードバランサで仮想的に提供するサービスの設定や、実サーバ上のサービスとロードバランサ上の仮想的なサービスの関連付けを行うことができます。カーネル内に蓄積されたロードバランサの統計情報もこのコマンドにより抽出できます。負荷分散システムの基本構成(図参照)は、「ロードバランサ(仮想サーバ)」と実際に 処理を行う「実サーバ」から構成されます。

ロードバランサは実サーバへ処理を割り振る場合にパケットを利用し、そのパケットヘッダやデータを参照しています。通常、IPアドレスとポート番号を元にして振分け先を決定し、ひとつのコネクション内のパケットは、全て単一の実サーバに振分けられるようにすることで、外部から接続したクライアントと、実サーバ間のコネクションとの一貫性を維持することが可能になっています。
処理の要となるロードバランサが複数の実サーバから、処理を一任するサーバを選択する際には様々な方法があります。