12FF5B8

hico_horiuchiの技術系な覚え書き.

Ubuntu 13.10でIPVSを使ってロードバランシング

研究でIPVSを使おうと思ったら少し苦労したのでメモ.
IPVSについてはLinux Virtual Serverを参照.

サーバ・ネットワーク構成

サーバ構成は以下の通りで,IPアドレスは仮のもの.
なお,ここで使っているサーバは全てVagrant上のUbuntu 13.10である.

                  |
                  | VIP 192.168.0.2
          +-------+-------+
          | load balancer |
          +-------+-------+
                  | 192.168.0.1
                  |
       +----------+----------+
       |                     |
       | 192.168.0.3         | 192.168.0.4
+------+-------+      +------+-------+ 
| web server 1 |      | web server 2 |
+--------------+      +--------------+

Vagrantfile内で以下のようにして固定IPアドレスの設定をしておく.

Vagrant::Config.run do |config|
  config.vm.network :public_network, ip: "192.168.0.1"
end

各サーバの設定

ロードバランサ

IPVSを管理するコマンド「ipvsadm」をインストール.

$ sudo aptitude install ipvsadm

パケットフォワーディングを有効にするための設定をする.

$ sudo sh -c "echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf"
$ sudo sysctl -p

eth1:vipに仮想IPアドレスを割り当て.

$ sudo ip addr add 192.168.0.2 label eth1:vip dev eth1

ipvsadmの振分先テーブルをクリアしてから,Webサーバへの振分設定を追加.
ここでは,振分アルゴリズムとしてラウンドロビンを用いる.

$ sudo ipvsadm -C
$ sudo ipvsadm -A -t 192.168.0.2:80 -s rr
$ sudo ipvsadm -a -t 192.168.0.2:80 -r 192.168.0.3:80 -g
$ sudo ipvsadm -a -t 192.168.0.2:80 -r 192.168.0.4:80 -g

正しく設定されているか確認.

$ sudo ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.2:http rr
  -> 192.168.0.3:http          Route   1      0          0
  -> 192.168.0.4:http          Route   1      0          0

Webサーバ

Apacheをインストールして,index.htmlを書き換える.
Real 1,Real 2は適宜読み替え.

$ sudo aptitude install apache2
$ sudo sh -c "echo 'Real 1 works!' > /var/www/index.html"

ARPに反応しないように設定.

$ sudo sh -c "echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf"
$ sudo sh -c "echo 'net.ipv4.conf.all.arp_announce = 2' >> /etc/sysctl.conf"
$ sudo sysctl -p

ロードバランサにループバックするよう,/etc/network/interfacesに以下の内容を追加.

auto lo:0
iface lo:0 inet static
        address   192.168.0.2
        netmask   255.255.255.255
        network   192.168.0.2
        broadcast 192.168.0.2

動作確認

外からロードバランサにアクセスして,振り分けられているか確認する.

$ while true; do curl http://192.168.0.2/; sleep 1; done;
Real 1 works!
Real 2 works!
Real 1 works!
Real 2 works!

まとめ

今回は簡単に設定するため,ipvsadmを使った.
ldirectordや,keepalived,heatbeatなどを使うと便利になるようだ.