hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2009-08-27

NAT構成ネットワークでkeepalivedによるロードバランサの実験

libvirtでNAT構成にするための設定ApacheのServer-Side Includesの設定の準備ができたところで、いよいよロードバランサの実験です。

ホストOS上の/etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface br0
    virtual_router_id 50
    priority 200
    advert_int 1
    garp_master_delay 10
    virtual_ipaddress {
        192.168.11.100
    }
}

virtual_server 192.168.11.100 80 {
    delay_loop 1
    lvs_sched rr
    lvs_method NAT #DR
    protocol TCP
    real_server 192.168.122.11 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
        }
    }
    real_server 192.168.122.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
        }
    }
}

実験用スクリプト

$ while :; do curl http://192.168.11.100; env LANG=C date; sleep 1; done

実行結果はこんな感じ。

Hello, this is vm11.
Thu Aug 27 02:47:03 JST 2009
Hello, this is vm10.
Thu Aug 27 02:47:05 JST 2009
Hello, this is vm11.
Thu Aug 27 02:47:06 JST 2009
Hello, this is vm10.
...(略)...

vm10でhttpdを止めてみるとvm11のみにいくようになりました。その前に

curl: (52) Empty reply from server

が1回出るときと1回も出ずにスムーズにvm11に切り替わるときがありました。

その後、vm10でhttpdを再開してみたのですが、引き続きvm11にしかいきません。ホストOSで

# /etc/init.d/keepalived reload

と実行してみると再びvm10とvm11に交互に投げるようになりました。inhibit_on_failureというオプションがあるぐらいなので指定しない場合は復活するのかと思っていたのですが。これはこういうものなのかは今後調査したいと思います。

ApacheのServer-Side Includesの設定

背景

ロードバランサの実験用にゲストOSのホスト名を入れたindex.htmlを

Hello, this is vm10.

といった感じで作っていたのですが、ゲストOSごとに書き換えずに済ませたいので Server-Side Includesを使う事にしました。

設定

mod_includeを参考にしました。CentOSの/etc/httpd/conf/httpd.confには

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
は設定済みだったので、<Directory "/var/www/html">セクションのOptions行に
    Options Indexes Includes FollowSymLinks
のようにIncludesを追加し、DirectoryIndexの行に
DirectoryIndex index.html index.shtml index.html.var
のようにindex.shtmlを追加しました。

そして、index.htmlをindex.shtmlに改名して

Hello, this is <!--#exec cmd="echo -n `hostname`"-->.
のように変更しました。

最初は

Hello, this is <!--#echo var="SERVER_NAME"-->.
にしたのですが、ロードバランサ経由だとリクエストURLのホスト名もしくはIPアドレスになってしまうのでだめでした。

次は

Hello, this is <!--#exec cmd="hostname"-->.
としたのですが、ドットの前に改行が入ってしまうことが判明したので、echo -n `hostname`に変更しました。

ブログ アーカイブ