LVS+keepalived の設定 3

備忘録として、DSRによるLVSkeepalivedの設定を段階的に書く。

前提は以下とする。

  • LVSの転送方式はDSR
  • ネットワークは単一セグメントで超簡単なもの
  • OSはCentOS6.5

今回はkeepalived冗長化(2台構成)にする。

ネットワーク構成

今回は以下の構成。


  • LVS1はeth0 = 192.168.1.100、LVS2はeth0 = 192.168.1.101。VirtualIPはeth0:0 = 192.168.1.10を設定。クライアントはこのアドレス(VIP)にアクセスする。
  • WEB1はeth0 = 192.168.1.201、WEB2はeth0 = 192.168.1.202
  • 全サーバ(LVS + WEB1 + WEB2)は NetworkManagerとSELinuxをoffにする。

LVSの設定

基本的な設定は「LVS + Keepalivedの設定 2」と同じ。違いは3つ

  1. keepalivedの起動オプションの変更
  2. keepalived.confの変更
  3. iptablesの設定

なので以下、差分のみ書く。

起動オプションの変更

パッケージでインストールすると起動オプションは空である。運用上、VRRPと監視プロセスを起動しなければならないのと、ログを取った方がよいのでオプションを変更する。

/etc/init.d/keepalivedに以下の一行追加する。

KEEPALIVED_OPTIONS="-S 0 -vrrp -check"

これで、keepalivedのログが/var/log/messagesに書き込まれる。

iptablesの設定

LVS同士はVRRPで互いに監視しあうので、iptablesVRRPパケットの出入りを可能にしておく。

# 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が切り替わっているか、ログで確認するとよい。