web-dev-qa-db-ja.com

Keepalivedはマルチキャストアドバタイズメントを送信しません

私は2つのシステムを持っています。両方ともVMです。は、ブリッジネットワークを使用するように構成されています。 VIP-10.190.1.230の所有権を管理するためにkeepalivedを取得しようとしています。ソースからビルドされたkeepalived-1.2.2とkeepalived-1.2.1の2つのバージョンを試しました。

ServerA - RHEL5.2 x64 - 10.190.1.228 - PRIORITY 50
ServerB - RHEL6 x64 - 10.190.1.229 - PRIORITY 101
VIP - 10.190.1.230

私の問題はServerBで維持されているようですが、マルチキャストアドバタイズメントを送信していません。マルチキャストアドバタイズメントが表示されています。 ServerAから:

[root@ServerB~]# tcpdump -vv -c 3 -i eth0 vrrp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
10:18:10.760577 IP (tos 0x0, ttl 255, id 856, offset 0, flags [none], proto VRRP (112), length 40)
10.190.1.228 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 50, authtype none, intvl 1s, length 20, addrs: 10.190.1.230
10:18:11.762039 IP (tos 0x0, ttl 255, id 857, offset 0, flags [none], proto VRRP (112), length 40)
10.190.1.228 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 50, authtype none, intvl 1s, length 20, addrs: 10.190.1.230
10:18:12.762883 IP (tos 0x0, ttl 255, id 858, offset 0, flags [none], proto VRRP (112), length 40)
10.190.1.228 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 50, authtype none, intvl 1s, length 20, addrs: 10.190.1.230
3 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@ServerB~]# 

ServerAでkeepalivedを強制終了し、tcpdumpを実行し続けると、パケットが表示されません。私は次の単純なkeepalived構成を使用しています。

サーバーA-10.190.1.228

 vrrp_instance VI_1 {
    interface eth0
    state BACKUP 
    virtual_router_id 151
    priority 50 
    virtual_ipaddress {
            10.190.1.230
    }
}

サーバーB-10.190.1.229

vrrp_instance VI_1 {
    interface eth0
    state MASTER
    virtual_router_id 151
    priority 100 
    virtual_ipaddress {
        10.190.1.230
    }
}

ServerAは、正しくは、ServerBでキープアライブされた優先度の高いVRRPv2アドバタイズを見ることができないため、VIPを保持していると思います。

[root@ServerA~]# ip add sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:59:58:c0 brd ff:ff:ff:ff:ff:ff
inet 10.190.1.228/24 brd 10.190.1.255 scope global eth0
inet 10.190.1.230/32 scope global eth0
inet6 fe80::a00:27ff:fe59:58c0/64 scope link 
   valid_lft forever preferred_lft forever
[root@ServerA~]# 

ネットワーク構成

ファイアウォールは両方のマシンで無効になっています。両方のインターフェイスにMULTICASTフラグが設定されています。

Iperfを使用してVRRPグループに公開しました。

[root@ServerB~]# iperf -u -c 224.0.0.18
------------------------------------------------------------
Client connecting to 224.0.0.18, UDP port 5001
Sending 1470 byte datagrams
Setting multicast TTL to 1
UDP buffer size:  122 KByte (default)
------------------------------------------------------------
[  3] local 10.190.1.229 port 32929 connected with 224.0.0.18 port 5001
^C[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 0.6 sec  73.2 KBytes  1.05 Mbits/sec
[  3] Sent 51 datagrams
[root@ServerB~]# 

ServerAはこのトラフィックを見ることができます:

[root@ServerA~]# tcpdump -c 3 -i eth0 Host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:37:30.460427 IP 10.190.1.229.33088 > vrrp.mcast.net.commplex-link: UDP, length 1470
10:37:30.472247 IP 10.190.1.229.33088 > vrrp.mcast.net.commplex-link: UDP, length 1470
10:37:30.482908 IP 10.190.1.229.33088 > vrrp.mcast.net.commplex-link: UDP, length 1470
3 packets captured
10 packets received by filter
0 packets dropped by kernel
[root@ServerA~]# 

以上のことから、これはネットワークの問題ではないと思います。ルーティングテーブルにマルチキャストルートがありませんが、上記は必要ないことを示しています。マルチキャストトラフィックはeth0を使用しています。

最後に、ServerBのkeepalivedからログアウトします。

May 18 10:40:46 ServerB Keepalived: Starting Keepalived v1.2.1 (05/17,2011)
May 18 10:40:46 ServerB Keepalived: Remove a zombie pid file /var/run/keepalived.pid
May 18 10:40:46 ServerB Keepalived: Registering Kernel netlink reflector
May 18 10:40:46 ServerB Keepalived: Registering Kernel netlink command channel
May 18 10:40:46 ServerB Keepalived: Registering gratutious ARP shared channel
May 18 10:40:46 ServerB Keepalived: Configuration is using : 55219 Bytes
May 18 10:40:46 ServerB Keepalived: Using LinkWatch kernel netlink reflector...

-Dスイッチを使用して実行したことはありません。これはメモリデバッグのようで、私にはほとんど意味がありません。 strace出力を ここ にアップロードしました。

-nフラグを指定してkeepalivedをstraceすると(フォークしないでください)、上記のリンクの出力の後に次の出力が表示されます。

sendto(3, "<30>May 18 10:58:50 Keepalived: "..., 68, MSG_NOSIGNAL, NULL, 0) = 68
sendto(3, "<30>May 18 10:58:50 Keepalived: "..., 75, MSG_NOSIGNAL, NULL, 0) = 75
rt_sigaction(SIGCHLD, {0x411b60, [], SA_RESTORER|SA_RESTART, 0x3db5a32a20}, {SIG_DFL, [], 0}, 8) = 0
select(1024, [4 6], [], [], {1, 0})     = 0 (Timeout)
select(1024, [4 6], [], [], {1, 0})     = 0 (Timeout)
select(1024, [4 6], [], [], {1, 0})     = 0 (Timeout)
select(1024, [4 6], [], [], {1, 0})     = 0 (Timeout)
[ etc ..]

これは、sendto()、sendmdg()、およびrecmsg()の呼び出しが行われていることを確認できるServerAで動作しているkeepalivedのstrace出力とは対照的です。

6
The_Viper

少年は私が愚かだと感じますか。 keepalived.confファイルをkeepalived.cfgとして/ etc/keepalived /に保存しました(これをhaproxy.cfgから取得したと考えてください)。 Keepalivedは/etc/keepalived/keepalive.confを探します。 -fフラグなしでkeepalivedを開始していたので、構成なしで開始していました。

-dオプション(confをsyslogにダンプ)を使用した場合、デフォルトの構成を使用していて、設定を取得していないことがわかります。

4
The_Viper