備忘録として、DSRによるLVSとkeepalivedの設定を段階的に書く。
前提は以下とする。
- LVSの転送方式はDSR
- ネットワークは単一セグメントで超簡単なもの
- OSはCentOS6.5
今回はkeepalivedを冗長化(2台構成)にする。
ネットワーク構成
今回は以下の構成。
LVSの設定
基本的な設定は「LVS + Keepalivedの設定 2」と同じ。違いは3つ
- keepalivedの起動オプションの変更
- keepalived.confの変更
- iptablesの設定
なので以下、差分のみ書く。
起動オプションの変更
パッケージでインストールすると起動オプションは空である。運用上、VRRPと監視プロセスを起動しなければならないのと、ログを取った方がよいのでオプションを変更する。
/etc/init.d/keepalivedに以下の一行追加する。
KEEPALIVED_OPTIONS="-S 0 -vrrp -check"
これで、keepalivedのログが/var/log/messagesに書き込まれる。
iptablesの設定
LVS同士はVRRPで互いに監視しあうので、iptablesでVRRPパケットの出入りを可能にしておく。
# iptables -A INPUT -p vrrp -j ACCEPT # iptables -A OUTPUT -p vrrp -j ACCEPT
LVS1、LVS2でどちらも実行する。確認方法はこちら:
# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere … 略 … 9 ACCEPT vrrp -- anywhere anywhere … 略 … Chain OUTPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT vrrp -- anywhere anywhere
削除するなら「iptables -D INPUT 9」「iptables -D OUTPUT 1」など。番号は”-L —line-numbers”で表示されたもの。
CentOSではiptablesの設定ファイルは/etc/sysconfig/iptablesで、これはiptablesを実行しても書き変わらない。よって設定を永続的にするには以下のようにする。
root> services iptables save
keepalived.conf
どちらをマスターとするか、3つのパラメータで制御する。
- preempt or nopreempt
- priority
- state
これらの場合分け別挙動はこちらによくまとまっている。
今回は以下のポリシーで設定する。
- LVS1が常にマスタ
- LVS1がダウンしたらLVS2が引き継ぐ
- LVS1が復活したら、マスタはLVS2からLVS1に戻る
よって、
- LVS1
- preempt
- priority 100
- state MASTER
- LVS2
- preempt
- priority 100
- state BACKUP
とする。
LVS1のkeepalived.conf 抜粋
# cat /etc/keepalived/keepalived.conf … 略 … # VirtualIP管理+LVS相互監視のための設定 vrrp_instance VI_1 { state MASTER interface eth0 garp_master_delay 3 virtual_router_id 1 priority 100 preemp advert_int 5 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.10/24 dev eth0 } … 略 …
LVS2のkeepalived.conf 抜粋
# cat /etc/keepalived/keepalived.conf … 略 … # VirtualIP管理+LVS相互監視のための設定 vrrp_instance VI_1 { state BACKUP interface eth0 garp_master_delay 3 virtual_router_id 1 priority 100 preemp advert_int 5 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.10/24 dev eth0 } … 略 …
動作確認
keepalivedを起動させたら、ログファイルを確認する。
こちらはLVS1のログ:
grep Keepalived /var/log/messages … 略 … Dec 19 23:00:41 localhost Keepalived[4153]: Stopping Keepalived v1.2.7 (02/21,2013) Dec 19 23:00:41 localhost Keepalived_vrrp[4156]: VRRP_Instance(VI_1) sending 0 priority Dec 19 23:00:42 localhost Keepalived[4228]: Starting Keepalived v1.2.7 (02/21,2013) Dec 19 23:00:42 localhost Keepalived[4229]: Starting Healthcheck child process, pid=4230 Dec 19 23:00:42 localhost Keepalived[4229]: Starting VRRP child process, pid=4231 ## これらを気にする必要は無い。 Dec 19 23:00:42 localhost Keepalived_vrrp[4231]: Interface queue is empty Dec 19 23:00:42 localhost Keepalived_healthcheckers[4230]: Interface queue is empty Dec 19 23:00:42 localhost Keepalived_vrrp[4231]: No such interface, eth3 Dec 19 23:00:42 localhost Keepalived_vrrp[4231]: No such interface, pan0 Dec 19 23:00:42 localhost Keepalived_vrrp[4231]: Registering Kernel netlink reflector Dec 19 23:00:42 localhost Keepalived_vrrp[4231]: Registering Kernel netlink command channel Dec 19 23:00:42 localhost Keepalived_vrrp[4231]: Registering gratuitous ARP shared channel Dec 19 23:00:42 localhost Keepalived_healthcheckers[4230]: No such interface, eth3 Dec 19 23:00:42 localhost Keepalived_healthcheckers[4230]: No such interface, pan0 Dec 19 23:00:42 localhost Keepalived_healthcheckers[4230]: Registering Kernel netlink reflector Dec 19 23:00:42 localhost Keepalived_healthcheckers[4230]: Registering Kernel netlink command channel … 略 … ## ここで、狙い通り MASTERになっているかどうか確認。 Dec 19 23:00:45 localhost Keepalived_vrrp[4231]: VRRP_Instance(VI_1) Transition to MASTER STATE …
こちらはLVS2のログ:
grep Keepalived /var/log/messages … Dec 19 23:01:49 localhost Keepalived[15170]: Starting Keepalived v1.2.7 (02/21,2013) Dec 19 23:01:49 localhost Keepalived[15171]: Starting Healthcheck child process, pid=15172 … ## ここで狙い通りBACKUPになっているかどうか確認。 Dec 19 23:01:49 localhost Keepalived_vrrp[15174]: VRRP_Instance(VI_1) Entering BACKUP STATE Dec 19 23:01:49 localhost Keepalived_healthcheckers[15172]: Using LinkWatch kernel netlink reflector... Dec 19 23:01:49 localhost Keepalived_healthcheckers[15172]: Activating healthchecker for service [192.168.1.201]:80 Dec 19 23:01:49 localhost Keepalived_healthcheckers[15172]: Activating healthchecker for service [192.168.1.202]:80
もしもどちらもMASTERになっている場合、VRRPが通っていない可能性が99.9999%である。よくiptablesの設定を見直すこと。
MySQL:Slaveの設定
MySQL:Slave側の設定は「LVS + Keepalivedの設定 2」と変わらず。
動作確認
LVS1とLVS2を交互に落として、狙い通りにMASTERが切り替わっているか、ログで確認するとよい。