Linuxでロードバランサ

 Webサーバ一台のダウンで夜中に呼び出されるなんて(実話)堪らないので、コスト重視のロードバランサを勝手に調べてみる。興味半分実用半分。

 実ははてなとかKLabの人が2年位前から資料を公開してくれていた。知るのが遅かったけど、試してみた。ネットで手順を調べたら、結構簡単。専用機の方がラクなんだろうけど、価格のハードルが高いからなー。人力復旧に全てを任せているウチの会社にちょうどいいんじゃあないのか。コストかからないし。

 ロードバランサのNAT方式は知ってけれど、DSR方式って意味がわからなかった。戻りパケットはクライアントが受け付けないんじゃなと思っていた。DSRの解説見た瞬間、目からうろこ。ループバックにVIPアドレスを割り当てるとかよく考えたなー。確かにループバックならpublicなLANじゃないし、IPアドレス重複も無い。httpsアクセラレータ機能もなんとかならないかな。

 ロードバランサがSPOF(Single Point of Failure )なんで、冗長化も考えようかと。他もSPOFだらけだけど、やらないよりはいいだろう。

現在編集中

[lb1] 
192.168.0.11
 |
                                        • -
(VIP:192.168.0.25) | | [web1] [web2] 192.168.0.21 192.168.0.22

○ipvsadmをパッケージからインストール

yum install ipvsadm

○ルーティングを有効に

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

○ipvsのルールを作成

/sbin/ipvsadm -A -t 192.168.0.25:80 -s rr
/sbin/ipvsadm -a -t 192.168.0.25:80 -r 192.168.0.21:80 -g -w 1
/sbin/ipvsadm -a -t 192.168.0.25:80 -r 192.168.0.22:80 -g -w 1

○ipvsのルールを保存する
ipvsadmでは、保存するためのコマンドはこれしかない。

ipvsadm -S 現在の設定内容を標準出力に表示する。
ipvsadm -R 設定内容を標準出力から適用する。

これだけだとどうにもならないので、Linuxの起動スクリプトと併せ技で保存している。パッケージからのインストールでは、起動スクリプト(/etc/init.d/ipvsadm)が作られているので、まず有効にする。

chkconfig --add ipvsadm
chkconfig ipvsadm on

起動スクリプトの中を見てみると、先頭にコンフィグファイルの読込先が設定されています。

「/etc/init.d/ipvsadm」
# set the configuration file
if [ -f "/etc/sysconfig/ipvsadm"  ]; then
  IPVSADM_CONFIG="/etc/sysconfig/ipvsadm"
elif [ -f "/etc/ipvsadm.rules"  ]; then
  IPVSADM_CONFIG="/etc/ipvsadm.rules"
else
  IPVSADM_CONFIG="/etc/sysconfig/ipvsadm"
fi

保存用のコマンドも同様に用意されてます。

「/etc/init.d/ipvsadm」
  save)
        echo -n "Saving IPVS table to $IPVSADM_CONFIG: "
        ipvsadm-save -n > $IPVSADM_CONFIG  2>/dev/null && \
          success "Saving IPVS table to $IPVSADM_CONFIG" || \
          failure "Saving IPVS table to $IPVSADM_CONFIG"
        echo
        ;;

ファイルへの保存は下記のようなコマンドで行います。

/etc/init.d/ipvsadm save

中身を確認します。

cat /etc/sysconfig/ipvsadm
-A -t 192.168.0.25:80 -s rr
-a -t 192.168.0.25:80 -r 192.168.0.22:80 -g -w 1
-a -t 192.168.0.25:80 -r 192.168.0.21:80 -g -w 1

再起動したら、リストが中途半端。

[root@lb1 ~]# 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.25:http rr

よく読んでみると、ランレベルの関係で、ネットワークが有効化される前に、ipvsadmが実行されてしまうと、駄目らしい。起動スクリプトのchkconfigのコメント部分を直すと直る。
[chkconfig: - 08 92] を [chkconfig: - 11 89]に変える。

「/etc/init.d/ipvsadm」
 # chkconfig: - 11 89

[chkconfig: ランレベル 起動時優先順位 停止時優先順位]らいしいが、数字の意味が良くわかってない。どこかにリファレンスないかな。

直った。

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.25:http rr
  -> 192.168.0.21:http            Route   1      0          0
  -> 192.168.0.22:http            Route   1      0          0

○仮想IPアドレスをlb1のeth0のエイリアスに設定する。

○仮想IPアドレスをweb1 , web2のループバックのエイリアスに設定する。

参考書籍

サーバインフラを支える技術
Linuxアドバンスドネットワークサーバ構築ガイド