LVS+Keepalived時主備負載均衡器都有VIP的問題
編輯:狂族晨曦 來源:系統運維,經驗雜筆 日期:2016-08-30 閱讀: 8,342 次 8 條評論 » 百度已收錄
先森在模擬搭建LVS+Keepalived的環境,LVS是做負載均衡的,Keepalived是做高可用的。在搭建好之后,先森遇到了一個奇怪的問題,兩個負載均衡器MASTER和BACKUP都搶占到了VIP。不過還好的是,實際上同一時間內只有一個VIP在起作用。下面就來談談先森的解決過程。
解決過程
通過不停的查找問題,我發現,只需要關閉備用負載均衡器的防火墻,那么主備服務器都有VIP的情況就會得以解決。由此可以肯定,問題就是出現在了防火墻這里。
首先用tcpdump查看一下vrrp的組播情況,這個隨便在同網絡的任意一臺服務器抓包即可:
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的狀態:
getenforce
可能的結果有三個:
Enforcing #強制開啟 Permissive #寬容模式 Disabled #關閉
如果是Enforcing強制模式,就需要關閉:
setenforce 0 #設置為寬容模式
但這樣只在本次生效,重啟服務器后將失效。如果要永久關閉,還需要修改配置文件:
sed -i 's/=enforcing/=disabled/g' /etc/sysconfig/selinux
iptables防火墻
如果將SElinux關閉問題依舊存在,則可能是防火墻將MASTER的VRRP組播給擋住了。首先將防火墻關閉,確定防火墻是否為罪魁禍首。
service iptables stop
如果關閉防火墻,keepalived問題解決了,那么問題就簡單了,我們只需要讓VRRP組播其通過防火墻即可。
我們只需要在防火墻中增加一條規則即可:
-A INPUT -p vrrp -j ACCEPT
但是這里有個坑,默認的防火墻中基本是如下配置:
# 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
添加規則一定不要在
-A INPUT -j REJECT --reject-with icmp-host-prohibited
之后,一定要加在其前面。

防火墻配置
這時候重啟防火墻后查看BACKUP的ip,就會發現VIP已經不在了。
再關閉一下MASTER的keepalived,并打開BACKUP的日志,就可以看到正確的內容:
tail -f /var/log/messages

Keepalived切換VIP
總結
如果不是防火墻的原因,那么久應該仔細查看配置文件中的vrrp_sync_group中設置的VRRP組等設置是否相同,當然還有其他的可能性,但大多都是VRRP組播信號的問題。
在解決問題的過程中,排除法無疑是最簡單粗暴定位問題的方法,要靈活運用。
Keepalived是個很好玩也很好用的軟件,建議朋友們多研究研究。
歷史上的今天:
轉載請注明出處來自http://www.cnidcc.cn/keepalived_vip.html

川公網安備 51011202000104號
土豪的玩具,屌絲只有繞道了。
又是一個后援團成員,我也是做運維 到時候遇到問題了一塊解決哈!
深圳SEO到此一游
學習了
service iptables stop防火墻直接關了,tcpdump vrrp -n 兩臺服務器只打印自己廣播的數據,對方服務器都沒收到對方廣播信息,為啥?
@瑤: 你看看你的SElinux是不是沒有關閉?getenforce查看,如果沒關,用setenforce 0關閉。
@狂族晨曦: 關了還是不行,我的環境是,一臺實體機上部署了兩臺虛擬機,keepalived分別不是在這兩臺虛擬機上,分別啟動keepalived,tcpdump vrrp 查看vrrp組播包,雙方都沒收到對方發來的組播包,配置也看了一個虛擬路由id,兩臺虛擬機互相ping也通,就是vrrp組播包收不到對方的?
@瑤: 再確定下,網卡接口是不是同一個?比如eth 0,接口綁定的IP是同網段的。然后,再次確定路由id相同,如果確定還是相同的話,試著改成其它id(默認51),比如都改成60。很明顯,你這個是vrrp方面出了問題。