故障現象:

主機名 director-A director-B
IP 192.168.14.128 192.168.14.131
默認主備 MASTER BACKUP 
優先級 90 80

VIP為 192.168.14.201

先啟動主節點keepalived服務,后啟動備節點keepalived,發現主備節點都配置了vip。

keepalived_1.png

keepalived_2.png

分析與解決過程:

理應主節點啟動keepalived后發送vrrp廣播報文,備節點啟動keepalived后因為配置同一個廣播域,能收到vrrp廣播報文,從而運行在BACKUP狀態,一直監聽着MASTER發送的vrrp廣播。

首先檢查BACKUP節點message日志,發現keepalived先進入BACKUP狀態(根據keepalived.conf配置,正常行為),但間隔4s后vrrp實例切換為MASTER狀態,這行為不符合正常邏輯。

keepalived_3.png

而備vrrp實例切換為MASTER的原因通常是一定時間內沒有收到MASTER節點發出的vrrp廣播報文,因此在備節點物理網卡上tcpdump抓包可見,主節點192.168.14.128發出的vrrp廣播報文已經到達備節點。這種情況下,keepalived仍認為主節點是down,很可能是OS對物理網卡收到的vrrp廣播報文並未送進內核,keepalived進程無法從捕獲主節點發出的vrrp報文。

keepalived_4.png

因此要檢查Linux防火牆Selinux和iptables規則

[root@director-B keepalived]# getenforce Enforcing #說明selinux也是開着,由於其安全設置級別較強,使用不當容易影響正常業務,一般建議關閉selinux。 #SELinux共有3個狀態enforcing (執行中)、permissive (不執行但產生警告)、disabled(關閉) [root@director-B keepalived]# vim /etc/selinux/config SELINUX=disabled #將該配置改為disabled,保存退出后reboot
 

跟蹤iptables規則發現,默認的iptables規則僅允許22端口和icmp報文通過

[root@director-A ~]# iptables -vnL INPUT Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 471 44874 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 192 14016 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 19 1456 INPUT_direct all -- * * 0.0.0.0/0 0.0.0.0/0 19 1456 INPUT_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0 19 1456 INPUT_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID 18 1404 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited ##默認拒絕所有報文,並告知訪問者主機已被限制 [root@director-B ~]# iptables -vnL INPUT_direct Chain INPUT_direct (1 references) pkts bytes target prot opt in out source destination [root@director-B ~]# iptables -vnL INPUT_ZONES_SOURCE Chain INPUT_ZONES_SOURCE (1 references) pkts bytes target prot opt in out source destination [root@director-B ~]# iptables -vnL INPUT_ZONES Chain INPUT_ZONES (1 references) pkts bytes target prot opt in out source destination 55 4210 IN_public all -- ens33 * 0.0.0.0/0 0.0.0.0/0 [goto] 0 0 IN_public all -- + * 0.0.0.0/0 0.0.0.0/0 [goto] [root@director-B ~]# iptables -vnL IN_public Chain IN_public (2 references) pkts bytes target prot opt in out source destination 28 2158 IN_public_log all -- * * 0.0.0.0/0 0.0.0.0/0 28 2158 IN_public_deny all -- * * 0.0.0.0/0 0.0.0.0/0 28 2158 IN_public_allow all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 ######允許ICMP報文訪問 [root@director-B ~]# iptables -vnL IN_public_log Chain IN_public_log (1 references) pkts bytes target prot opt in out source destination [root@director-B ~]# iptables -vnL IN_public_deny Chain IN_public_deny (1 references) pkts bytes target prot opt in out source destination [root@director-B ~]# iptables -vnL IN_public_allow Chain IN_public_allow (1 references) pkts bytes target prot opt in out source destination 1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW ######允許ssh報文訪問
 

 

嘗試通過另一個客戶端192.168.14.129訪問備節點80端口,在客戶端就能抓包icmp 通知報文。

keepalived_5.png

此iptables鏈表結構為系統默認配置,該鏈結構太過復雜,且多有iptables鏈為空鏈。因此將多余的iptables規則清理掉,多余的iptables鏈刪除,允許所有報文通過即可。

 

[root@director-B ~]# iptables -F #刪除所有iptables規則
 
[root@director-B ~]# iptables -X #刪除除默認鏈之外的所有iptables鏈
 

此時問題已解決,keepalived只有MASTER節點配置vip,且主備節點之間切換vip正常。

 

不過vip切換的問題雖然解決了,但iptables的遺留問題是在配置文件/etc/sysconfig/iptables中並未配置以上復雜的iptables規則,且重啟系統之后,也仍然會生成以上復雜的iptables規則。修改了/etc/sysconfig/iptables-config配置也在重啟系統后被復原。定是那系統啟動腳本搞得鬼,還得繼續排查。

原文轉載至:

http://blog.51cto.com/13599730/2161622