lvs を試してみる

VirtualBox で実験。
DSAS ブログに書いてあることをやるだけなので素振りですね。
DSAS開発者の部屋:こんなに簡単! Linuxでロードバランサ (1)

サーバを用意する

まずはサーバを 3 つ用意する。
ロードバランサ用に 1 つ。
こいつは家の中の LAN に参加させるので、nic は bridge にしておく。
VirtualBox 内のネットワーク用の nic ももちろん必要。

$ VBoxManage createvm --name vmlv00 --ostype Debian_64 --register
$ VBoxManage createvdi --filename vmlv00-root.vdi --size `expr 10 \* 1000 \* 1000` --variant Standard --remember
$ VBoxManage modifyvm vmlv00 \
--memory 128 \
--vram 8 \
--hwvirtex on \
--vtxpid on \
--cpus 1 \
--scsi on \
--scsiport1 vmlv00-root.vdi \
--scsitype LsiLogic \
--nic1 bridged --nic2 bridged --nic3 intnet --nic4 intnet \
--nictype1 82540EM --nictype2 82540EM --nictype3 82540EM --nictype 82540EM \
--bridgeadapter1 eth0 --bridgeadapter eth1 \
--intnet3 intnet --intnet4 intnet \
--macaddress1 auto --macaddress2 auto --macadress3 auto --macaddress4 auto \
--vrdp off

debian のネットインストール用の iso はここから探しておく。インストールはそれなりに。

web サーバ用に 2 つ。
構成はちょっと変える。
家の中の LAN は直接見えないようにする。
apt が外に行けないのは面倒なので NAT + ホストネットワーク にする。
インストールは面倒なのでディスクを複製してから設定をいじる。

$ VBoxManage clonevdi vmlv00-root.vdi vmsv01-root.vdi
$ VBoxManage createvm --name vmsv01 --ostype Debian_64 --register
$ VBoxManage modifyvm vmsv01 \
--memory 128 \
--vram 8 \
--hwvirtex on \
--vtxpid on \
--cpus 1 \
--scsi on \
--scsiport1 vmsv01-root.vdi \
--scsitype LsiLogic \
--nic1 nat --nic2 intnet --nic3 intnet \
--nictype1 Am79C973 --nictype2 Am79C973 --nictype3 Am79C973 \
--intnet2 intnet --intnet3 intnet --natnet1 default \
--macaddress1 auto --macaddress2 auto --macadress3 auto \
--vrdp off
$ # vmsv02 も同じように

起動してからやること。

  • ゲスト側
    1. /etc/udev/rules.d/70-persistent-net.rules の書き換え
      • vmlv00 で作った nic の情報があるから、それを消してやる
    2. /etc/hostname /etc/hosts /etc/mailname の書き換え
      • vmlv00 を vmsv01 に書き換え、他に何かあったら困るけど
  • ホスト側
    1. ssh 用の穴開け
$ VBoxManage setextradata vmsv01 "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
$ VBoxManage setextradata vmsv01 "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
$ VBoxManage setextradata vmsv01 "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 10122

興味があったので bonding にしてみたけど、ifenslave-2.6 を install してから /etc/network/interfaces に設定書くだけだったので省略。

ついでに linux-headers とかも入れていみたけど省略。

準備だけで 2 時間くらいかかってしまうあたりがいやなかんじです。

ipvsadm のインストール

$ sudo aptitude install ipvsadm
$ sudo dpkg-reconfigure ipvsadm
# 起動時に boot しない
# daemon を master として動作させる
# nic は bond0
Starting IPVS Connection Synchronization Daemon: master. 
$ grep IP_VS_VERSION_CODE /usr/src/linux-headers-2.6.26-2-amd64/include/net/ip_vs.h 
#define IP_VS_VERSION_CODE      0x010201
$ sudo ipvsadm --version
ipvsadm v1.24 2005/12/10 (compiled with popt and IPVS v1.2.0)

なんか古いね

ロードバランスの設定

サービスの url として、vmsv01 vmsv02 共に http://www.localdomain.com となるように virtualhost の設定をしておきました。

# vip はなんとなく 10.0.1.150 にします。
$ sudo ip addr add 10.0.1.150 label bond0:100 dev bond0
$ ip addr show bond0 label bond0:100
    inet 10.0.1.150/32 scope global bond0:100
# 初期化して
$ sudo ipvsadm -C
# ラウンドロビンさせます
$ sudo ipvsadm -A -t 10.0.1.150:80 -s rr
# vip と real ip を関連付けます
$ sudo ipvsadm -a -t 10.0.1.150:80 -r 192.168.0.101 -m
$ sudo ipvsadm -a -t 10.0.1.150:80 -r 192.168.0.102 -m
# 確認
$ sudo ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.1.150:80 rr
  -> 192.168.0.102:80             Masq    1      0          0         
  -> 192.168.0.101:80             Masq    1      0          0         

nat 方式なので、web サーバのデフォルトゲートウェイをロードバランサに変更したけど省略。

ロードバランスの確認

mac-mini からアクセスしてみる。

$ curl -L 'Host: www.localdomain.com' http://10.0.1.150/

はい、帰ってきません。
つながってない ?

$ ping -c 3 10.0.1.150
PING 10.0.1.150 (10.0.1.150): 56 data bytes
64 bytes from 10.0.1.150: icmp_seq=0 ttl=64 time=1.533 ms
64 bytes from 10.0.1.150: icmp_seq=1 ttl=64 time=0.946 ms
64 bytes from 10.0.1.150: icmp_seq=2 ttl=64 time=0.932 ms

--- 10.0.1.150 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.932/1.137/1.533/0.280 ms

そういうわけでもないみたい。
httpd が落ちてるわけでもないし、vmlv00 から直接見ることはできるのに、どうなってるんだろう。


ログを追う前に明日の準備をしないといかんのでここらへんでギブアップ。
わりと簡単にいろいろできることは分かったのでよしとします。

その後

virtualbox のホスト pc からならうまくいってたので追記
いったんここまでの要点を整理します。

ネットワーク構成

外部ネットワークは 10.0.1.0/32 です。
lvs の内側ネットワークは 192.168.0.0/32 です。

            |  外部ネットワーク |
            +---------+---------+
                      |bond0:1 [10.0.1.150] (サービス用仮想IPのつもり)
                      |bond0   [10.0.1.200]
                 +----+----+
                 |  vmlv00 |
                 +----+----+
                      |bond1 [192.168.0.100]
                      |
 -----+---------------+-------------+------------------
      |                             |
      |bond0 [192.168.0.101]        |bond0 [192.168.0.102]
 +----+----+                   +----+----+
 |  vmsv01 |                   |  vmsv02 |
 +---------+                   +---------+
やりたいこと
  • ロードバランス ! ロードバランス !
  • vmlv00 へのリクエストを vmsv01 と vmsv02 に振り分けたい
やったこと
  • 外部ネットワークのホストから vmlv00 に http リクエストを投げてみた
結果
  • うまくいった、けど何かおかしい
  • vmsv01 はすぐに応答帰る
  • vmsv02 からの応答が帰ってこないことがある
    • vmlv00 までは来てるから、時々何かはまるみたい
まとめ

VirtualBox だからなのか、ネットワーク周りの動きが何かあやしいものでした。
とりあえず、構築とかお手軽なことも分かったのでよしとします。