LVS+Keepalived時主備負載均衡器都有VIP的問題
先森在模擬搭建LVS+Keepalived的環境,LVS是做負載均衡的,Keepalived是做高可用的。在搭建好之後,先森遇到了一個奇怪的問題,兩個負載均衡器MASTER和BACKUP都搶佔到了VIP。不過還好的是,實際上同一時間內只有一個VIP在起作用。下面就來談談先森的解決過程。
解決過程
通過不停的查詢問題,我發現,只需要關閉備用負載均衡器的防火牆,那麼主備伺服器都有VIP的情況就會得以解決。由此可以肯定,問題就是出現在了防火牆這裡。
首先用tcpdump檢視一下vrrp的組播情況,這個隨便在同網路的任意一臺伺服器抓包即可:
1 | tcpdump vrrp -n # -n:不把主機的網路地址轉換成名字 |
檢視下抓包的結果:
tcpdump抓包
由上圖可以看到,192.168.2.79和192.168.2.53兩個IP在輪流傳送組播訊號。而正常的應該是由MASTER伺服器傳送組播,如果BACKUP收不到MASTER的組播訊號了,那麼判定MASTER宕機了,BACKUP就會接手VIP。
2016年12月01日更新
SElinux
首先,先確定伺服器的SElinux是否設定為關閉。一般都是將其關閉的,在CentOS先森嘗試了啟用,但是也沒有firewall-cmd這個命令,無法新增埠,所以還是將其關閉吧。
檢視SElinux的狀態:
1 | getenforce |
可能的結果有三個:
123 | Enforcing #強制開啟 Permissive #寬容模式 Disabled #關閉 |
如果是Enforcing強制模式,就需要關閉:
1 | setenforce 0 #設定為寬容模式 |
但這樣只在本次生效,重啟伺服器後將失效。如果要永久關閉,還需要修改配置檔案:
1 | sed -i 's/=enforcing/=disabled/g' /etc/sysconfig/selinux |
iptables防火牆
如果將SElinux關閉問題依舊存在,則可能是防火牆將MASTER的VRRP組播給擋住了。首先將防火牆關閉,確定防火牆是否為罪魁禍首。
1 | service iptables stop |
如果關閉防火牆,keepalived問題解決了,那麼問題就簡單了,我們只需要讓VRRP組播其通過防火牆即可。
我們只需要在防火牆中增加一條規則即可:
1 | -A INPUT -p vrrp -j ACCEPT |
但是這裡有個坑,預設的防火牆中基本是如下配置:
12345678910111213 | # Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT |
新增規則一定不要在
1 | -A INPUT -j REJECT --reject-with icmp-host-prohibited |
之後,一定要加在其前面。
防火牆配置
這時候重啟防火牆後檢視BACKUP的ip,就會發現VIP已經不在了。
再關閉一下MASTER的keepalived,並開啟BACKUP的日誌,就可以看到正確的內容:
1 | tail -f /var/log/messages |
Keepalived切換VIP
總結
如果不是防火牆的原因,那麼久應該仔細檢視配置檔案中的vrrp_sync_group中設定的VRRP組等設定是否相同,當然還有其他的可能性,但大多都是VRRP組播訊號的問題。
在解決問題的過程中,排除法無疑是最簡單粗暴定位問題的方法,要靈活運用。