LVS+Keepalived時(shí)主備負(fù)載均衡器都有VIP的問(wèn)題
編輯:狂族晨曦 來(lái)源:系統(tǒng)運(yùn)維,經(jīng)驗(yàn)雜筆 日期:2016-08-30 閱讀: 8,343 次 8 條評(píng)論 » 百度已收錄
先森在模擬搭建LVS+Keepalived的環(huán)境,LVS是做負(fù)載均衡的,Keepalived是做高可用的。在搭建好之后,先森遇到了一個(gè)奇怪的問(wèn)題,兩個(gè)負(fù)載均衡器MASTER和BACKUP都搶占到了VIP。不過(guò)還好的是,實(shí)際上同一時(shí)間內(nèi)只有一個(gè)VIP在起作用。下面就來(lái)談?wù)勏壬慕鉀Q過(guò)程。
解決過(guò)程
通過(guò)不停的查找問(wèn)題,我發(fā)現(xiàn),只需要關(guān)閉備用負(fù)載均衡器的防火墻,那么主備服務(wù)器都有VIP的情況就會(huì)得以解決。由此可以肯定,問(wèn)題就是出現(xiàn)在了防火墻這里。
首先用tcpdump查看一下vrrp的組播情況,這個(gè)隨便在同網(wǎng)絡(luò)的任意一臺(tái)服務(wù)器抓包即可:
tcpdump vrrp -n # -n:不把主機(jī)的網(wǎng)絡(luò)地址轉(zhuǎn)換成名字
查看下抓包的結(jié)果:

tcpdump抓包
由上圖可以看到,192.168.2.79和192.168.2.53兩個(gè)IP在輪流發(fā)送組播信號(hào)。而正常的應(yīng)該是由MASTER服務(wù)器發(fā)送組播,如果BACKUP收不到MASTER的組播信號(hào)了,那么判定MASTER宕機(jī)了,BACKUP就會(huì)接手VIP。
2016年12月01日更新
SElinux
首先,先確定服務(wù)器的SElinux是否設(shè)置為關(guān)閉。一般都是將其關(guān)閉的,在CentOS先森嘗試了啟用,但是也沒(méi)有firewall-cmd這個(gè)命令,無(wú)法添加端口,所以還是將其關(guān)閉吧。
查看SElinux的狀態(tài):
getenforce
可能的結(jié)果有三個(gè):
Enforcing #強(qiáng)制開(kāi)啟 Permissive #寬容模式 Disabled #關(guān)閉
如果是Enforcing強(qiáng)制模式,就需要關(guān)閉:
setenforce 0 #設(shè)置為寬容模式
但這樣只在本次生效,重啟服務(wù)器后將失效。如果要永久關(guān)閉,還需要修改配置文件:
sed -i 's/=enforcing/=disabled/g' /etc/sysconfig/selinux
iptables防火墻
如果將SElinux關(guān)閉問(wèn)題依舊存在,則可能是防火墻將MASTER的VRRP組播給擋住了。首先將防火墻關(guān)閉,確定防火墻是否為罪魁禍?zhǔn)住?/p>
service iptables stop
如果關(guān)閉防火墻,keepalived問(wèn)題解決了,那么問(wèn)題就簡(jiǎn)單了,我們只需要讓VRRP組播其通過(guò)防火墻即可。
我們只需要在防火墻中增加一條規(guī)則即可:
-A INPUT -p vrrp -j ACCEPT
但是這里有個(gè)坑,默認(rèn)的防火墻中基本是如下配置:
# 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
添加規(guī)則一定不要在
-A INPUT -j REJECT --reject-with icmp-host-prohibited
之后,一定要加在其前面。

防火墻配置
這時(shí)候重啟防火墻后查看BACKUP的ip,就會(huì)發(fā)現(xiàn)VIP已經(jīng)不在了。
再關(guān)閉一下MASTER的keepalived,并打開(kāi)BACKUP的日志,就可以看到正確的內(nèi)容:
tail -f /var/log/messages

Keepalived切換VIP
總結(jié)
如果不是防火墻的原因,那么久應(yīng)該仔細(xì)查看配置文件中的vrrp_sync_group中設(shè)置的VRRP組等設(shè)置是否相同,當(dāng)然還有其他的可能性,但大多都是VRRP組播信號(hào)的問(wèn)題。
在解決問(wèn)題的過(guò)程中,排除法無(wú)疑是最簡(jiǎn)單粗暴定位問(wèn)題的方法,要靈活運(yùn)用。
Keepalived是個(gè)很好玩也很好用的軟件,建議朋友們多研究研究。
歷史上的今天:
轉(zhuǎn)載請(qǐng)注明出處來(lái)自http://www.cnidcc.cn/keepalived_vip.html

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