故障現象:bash

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

VIP爲 192.168.14.201ssh

先啓動主節點keepalived服務,後啓動備節點keepalived,發現主備節點都配置了vip。tcp

keepalived_1.png

keepalived_2.png

分析與解決過程:

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

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

keepalived_3.png

而備vrrp實例切換爲MASTER的緣由一般是必定時間內沒有收到MASTER節點發出的vrrp廣播報文,所以在備節點物理網卡上tcpdump抓包可見,主節點192.168.14.128發出的vrrp廣播報文已經到達備節點。這種狀況下,keepalived仍認爲主節點是down,極可能是OS對物理網卡收到的vrrp廣播報文並未送進內核,keepalived進程沒法從捕獲主節點發出的vrrp報文。.net

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