読者です 読者をやめる 読者になる 読者になる

Keepalived + LVS + CentOS4 でロードバランサー(DSR)

Keepalived

keepalived は、1.1.15からinclude が使えるようになったので、設定が簡単になったのでお勧め。ありがとうid:stanaka さん。

VIP は、 10.0.7.100

設定は以下のとおり。(NATの時とほとんど同じだけどVIPを持っているマシンは無い。)
WebDB Press vol37 では、ロードバランサーに設定したVIPの設定を消すという部分が抜けているのでそのまま試すと、NATではうまくいくがDSRの時にうまくいかない。

種別 ホスト名 IPアドレス デフォルトゲートウェイ 備考
クライアント cl0 10.0.0.173 通常通り VIPあてのルートをロードバランサーのeth0 にする。
ロードバランサー lb0 eth0:10.0.31.11/16 なし ロードバランサーのdefault g/w をすべて削除。
eth1:192.168.31.11/16
リアルサーバー web100 eth0:192.168.31.100/16 192.168.31.11 default g/w をロードバランサーの内側のIP(192.168.31.11)に変更。
リアルサーバー web101 eth0:192.168.31.101/16 192.168.31.11 default g/w をロードバランサーの内側のIP(192.168.31.11)に変更。
# yum -y install ipvsadm iproute curl
# rpm -ivh keepalived-1.1.15-5.i386.rpm

keepalived-1.1.15-5.i386.rpm は、ここからダウンロード。

これで、VIPあてのパケットを自分宛として処理できるようになる。

# iptables -t mangle -A PREROUTING -d 10.0.7.100 -j MARK --set-mark 1
# ip rule add prio 100 fwmark 1 table 100
# ip route add local 0/0 dev lo table 100
  • 各リアルサーバー上で以下の設定

これで、VIPあてのパケットを自分宛として処理できるようになる。

# iptables -t nat -A PREROUTING -d 10.0.7.100 -j REDIRECT

/etc/keepalived/keepalived.conf を以下のように作成。(includeは、 keepalived-1.1.15 以降しか使えないので注意。)

! Configuration File for keepalived

global_defs {
   notification_email {
     yoshifumi1975@example.org
   }
   notification_email_from yoshifumi1975@example.org
   smtp_server 10.0.7.250
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

include web.conf
  • includeされる /etc/keepalived/web.conf の内容。
virtual_server_group HTTP100 {
  10.0.7.100  80
}

virtual_server group HTTP100 {
  delay_loop   3
  lvs_sched    rr
  lvs_method   DR
  protocol     TCP
  virtualhost  example.org
  sorry_server 192.168.31.102 80

  real_server  192.168.31.100 80 {
    weight 1                      
    inhibit_on_failure            
    HTTP_GET {                    
      url {                       
        path /
        status_code 200           
      }                           
      connect_timeout 3           
    }                             
  }                               
  real_server  192.168.31.101 80 {
    weight 1                      
    inhibit_on_failure            
    HTTP_GET {                    
      url {                       
        path /         
        status_code 200           
      }                           
      connect_timeout 3           
    }                             
  }                               
}
# service keepalived restart
  • 設定の確認
# ipvsadm -Ln
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.7.100:80 rr
  -> 192.168.31.100:80            Route   1      0          0
  -> 192.168.31.101:80            Route   1      0          0

/etc/sysctl.confを以下のように編集。

(前略)
net.ipv4.ip_forward = 1
(中略)
net.ipv4.conf.default.rp_filter = 0
(後略)

設定をリロードする。(またはサーバー再起動しちゃえ。)

# sysctl -p
  • テスト

クライアントから以下を実行して動作を確認。

# curl 'http://10.0.7.100/'
<html>
<body>
192.168.31.101
</body>
</html>

# curl 'http://10.0.7.100/'
<html>
<body>
192.168.31.100
</body>
</html>

# curl 'http://10.0.7.100/'
<html>
<body>
192.168.31.101
</body>
</html>

# curl 'http://10.0.7.100/'
<html>
<body>
192.168.31.100
</body>
</html>

このページを参考にしました。
DSAS開発者の部屋:こんなに簡単! Linuxでロードバランサ (1)