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などを使うと便利になるようだ.