Linux Virtual ServerとKeepalivedで作る冗長化ロードバランサ 2ページ

NATによるパケット転送を使ったロードバランサ環境の構築

 以下ではNATによるパケット転送を使ったロードバランサ環境の構築について紹介していく。今回使用するネットワーク構成は、次の図2のようになる。

図2 LVSを使った最小限のネットワーク構成
図2 LVSを使った最小限のネットワーク構成

ネットワークの設定

 ロードバランサとして使用するマシンには2つのネットワークインターフェイス(NIC)を搭載しており、eth0はWAN(インターネット)に、eth1はLANに接続されている。また、サービスを運用するサーバーは2台で、LAN経由でロードバランサに接続されている。なお、ロードバランサとして使用するマシンにはLVSが使用する専用のIPアドレス(仮想IPアドレス)を用意しておく必要がある。このIPアドレスがクライアントに向けて公開するIPアドレスとなり、クライアントはこのIPアドレスに向けてリクエストを送信する。Linuxには「IPエイリアス」という、1つのNICに2つ以上のIPアドレスを割り当てる機能があり、これを利用してWAN側のNICに対しLVS用のIPアドレスを割り当てておく。今回の構成ではeth0がWAN側のNICになっているので、これに対し203.0.113.100というIPアドレスをLVSに割り当てている。

 eth0にIPエイリアスを利用して203.0.113.100というIPアドレスを付与するには、まず/etc/sysconfig/network-scripts/ディレクトリ内にifcfg-eth0:0というファイルを作成し、次のようにIPアドレスやネットマスクなどの情報を記述しておく。

DEVICE=eth0:0
ONBOOT=yes
NETMASK=255.255.255.0
TYPE=Ethernet
IPADDR=203.0.113.100

 続いてserviceコマンドでネットワークを再起動すると、eth0:0というデバイスに203.0.113.100というIPアドレスが割り当てられ利用できるようになる。eth0:0というのは「eth0の1つめのエイリアス」を意味している。

# sevice network restart

 ネットワークを再起動したら、ifconfigコマンドでeth0:0デバイスが有効になっていることを確認しておこう。

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:22:4D:67:EA:B2
          inet addr:203.0.113.1  Bcast:133.242.98.143  Mask:255.255.255.240
 :
 :
eth0:1    Link encap:Ethernet  HWaddr 00:22:4D:67:EA:B2
          inet addr:203.0.113.100  Bcast:133.242.98.143  Mask:255.255.255.240
 :
 :

 また、IPパケット転送を有効にするようシステム設定の変更も行っておく。具体的には/etc/sysctl.confをエディタで開き、以下のように「net.ipv4.ip_forward」の値を「1」に変更する。

# vi /etc/sysctl.conf
 :
 :
# Controls IP packet forwarding
net.ipv4.ip_forward = 1  ←値を「1」に変更して有効にする

 /etc/sysctl.confファイルの変更後、syscrl -pコマンドを実行すると変更が反映される。

# /sbin/sysctl -p

ロードバランサの設定

 次に、ipvsadmコマンドを使ってロードバランシング設定を行っていく。まず、念のためipvsadm -CコマンドでLVSの設定をクリアしておく。

# ipvsadm -C

 LVSでは、ロードバランシングするIPアドレスおよびポートの組み合わせを「仮想サービス」と呼び、これがクライアントの接続先となる。仮想サービスは「ipvsadm -A」コマンドで登録できる。今回はeth0:0に割り当てられた203.0.113.2というIPアドレスが仮想サービスのIPアドレスとなり、このIPアドレスと利用するポート番号の組み合わせを仮想サービスとして登録しておく。たとえば80番ポートへのリクエストをロードバランシング対象とするには以下のようにする。

# ipvsadm -A -t 203.0.113.100:80

 続いて、「ipvsadm -a」コマンドで仮想サービスに対しパケットの転送先を登録する。たとえば192.168.100.21の80番ポートと、192.168.100.22の80番ポートを転送先とするには以下のようにする。

ipvsadm -a -t 203.0.113.100:80 -r 192.168.100.21:80 -m
ipvsadm -a -t 203.0.113.100:80 -r 192.168.100.22:80 -m

 以上でLVSの設定は完了だ。最後に、ipvsadm -lコマンドでロードバランシング設定を確認しておこう。

# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  203.0.113.100:http wlc
  -> 192.168.100.21:http          Masq    1      0          0
  -> 192.168.100.22:http          Masq    1      0          0

サーバー側の設定

 NATによるパケット転送を利用する場合、ロードバランサがサーバーのネットワークゲートウェイとして設定されている必要がある。サービスを提供する(ロードバランスされる)サーバー側でsystem-config-networkコマンドの実行、もしくは/etc/sysconfig/network-scripts/ifcfg-eth*ファイルの編集などを行い、設定を変更しておこう。今回の例の場合、ロードバランサのLAN側IPアドレスである192.168.100.1をデフォルトゲートウェイに指定する。

 以上の設定が完了したら、クライアントから仮想サービスに接続を行い、正しくサーバーに接続できるかテストしてみよう。また、どのサーバーにリクエストが振り分けられているかは、ipvsadm -lコマンドの出力中「ActiveConn」および「InActConn」項目で確認できる。たとえば以下のように出力された場合、192.168.100.21に対し3つ、192.168.100.22に対し4つの接続が行われていることになる。

# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  203.0.113.100:http wlc
  -> 192.168.100.21:http          Masq    1      3          2
  -> 192.168.100.22:http          Masq    1      4          1

LVS設定の保存と復元

 ipvsadmコマンドで行ったLVSの設定は、そのままではロードバランサとして使用しているLinuxマシンを再起動するとリセットされてしまう。そのため、RHELやその互換環境では設定をファイルに保存しておき、再起動時に自動的に設定を復元する機能が用意されている。設定をファイルに保存するには、以下のように「ipvsadm save」引数付きでserviceコマンドを使用する。

# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]

 すると、「/etc/sysconfig/ipvsadm」ファイルにその時点での設定が保存され、ipvsadmサービスの起動時に自動的に復元される。再起動時に自動的にipvsadmサービスが起動するようにするには、以下のようにchkconfigコマンドでipvsadmサービスを有効にしておけばよい。

# chkconfig ipvsadm on