前回に引き続き、今回はhttp専用サーバを増やしてみました。 前回導入したapacheはアンインストールしています。
keepalivedを導入しているサーバ
- 10.0.0.2
- 10.0.0.3
Apacheを導入しているサーバ
- 10.0.0.5
- 10.0.0.6
keepalivedをApacheの側に導入しないところがポイントです。 ただDR構成を取るとApacheの側でもVirtual_IPを認識させるための手間が必ず必要になります。
keepalived側で必要な設定
前回のkeepalived.confの内容にVirtual_IPの80番ポートにきたリクエストを振り分ける設定を加えます。
vrrp_instance VI {
state BACKUP
interface eth1
garp_master_delay 5
virtual_router_id 200
priority 101
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass XXXXXX
}
virtual_ipaddress {
10.0.0.1/24 dev eth1
}
}
virtual_server 10.0.0.1 80 {
delay_loop 10
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.5 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 5
}
}
real_server 10.0.0.6 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 5
}
}
}
Apacheサーバ側で必要な設定
今回はDR(Direct Routing)構成を取っているので、パケットの受け手になるApacheサーバ側で、10.0.0.1宛てのパケットを自分のものだと認識させる必要があります。
KLabの方が書かれたLVSをNATからDSRへの中では、iptablesを使う方法が書かれています。
$ sudo /sbin/iptables -t nat -A PREROUTING -d 10.0.0.1 -j REDIRECT
これは始めてみる方法で確かに動きます。 ただ、これはlinuxに特化しているようにみえて一般的なのかどうか自信はありません。 DR構成のように、いわゆるMACアドレス変換を行なう場合には、ループバックアドレスにVirtual_IPを設定することで対応するように思えます。
sudo /sbin/ifconfig lo:0 10.0.0.1 netmask 255.255.255.255
いずれかの設定をすれば良いのですが、恒久的にはinterfacesファイルにlo:0の定義を入れるのが簡単そうです。
auto lo:0
iface lo:0 inet static
address 10.0.0.1
netmask 255.255.255.255
2010/02/01追記:
iptablesを使う場合にはinterfacesファイルに次のような一行を加える事で対応する事もできます。
post-up /sbin/iptables -t nat -A PREROUTING -p tcp -d 10.0.30.1 -j REDIRECT
最終的にlo:0の追加かiptablesを使うかは、同時に使用するVirtual_IPの数によって判断するのが良いようです。
debianでiptablesを操作するにはスクリプトを準備して、interfacesファイルのpre-up, post-upを加える必要があるので少し手間がかかります。 iptablesを使う方にアドバンテージがあるのかはわからないです。
2010/02/01追記:
この構成ではクライアントのARPテーブルにVirtual_IP宛てのMACアドレスとして10.0.0.5, 10.0.0.6のMACアドレスが登録されてしまいます。
このためarpリクエストを無視する必要が生じます。
/etc/sysctl.confか/etc/sysctl.d/以下にファイルを作成して次の設定を加えます。
net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.eth0.arp_announce=2
まとめ
今回は単純にするためのフロントエンドと本来は裏側に隠蔽されているApacheサーバ群を同じセグメントに配置しました。 本格的なテストには、セグメントを分けないと現実味が薄いように思えます。 ただとっかかりには、これぐらいの構成からスタートするのが良いのではないでしょうか。
また、keepalivedのベストプラクティスについて、まだよくわかっていないところがあります。 少なくともVRRPの設定は両方ともpriorityを同一にして、nopreemptを設定し、stateに書く起動時の初期状態はBACKUPにしておくのは良いマナーに思えます。
やはり「制御する」ことを考えると、もう少しOSやkeepalivedの挙動について理解が必要そうです。 iptablesを使ってMACアドレスが書き換えられたパケットを受領するとは、予想できませんでした。
それと「サーバ/インフラを支える技術」は間違いなく良い本だけれど、 必要な事が漏れなく書かれているわけではないので、これだけで何とかしようとする人には向かないでしょう。
ブラックボックスとしての技術だけを導入して問題を解決しようとしてもそれは不十分で、システム全体をぐるっと抱えて挙動を見渡すだけの少し高いところから見る技術が必要になると思います。
0 件のコメント:
コメントを投稿