??使用Keepalived可以很方便的配置LVS间狂,而Keepalived實(shí)現(xiàn)高可用往往都是一主多從的模式攻泼,這樣的話備機(jī)就處于standby狀態(tài),浪費(fèi)了資源鉴象。我們可以將LVS和RS節(jié)點(diǎn)合設(shè)在一起忙菠,這樣備機(jī)雖然不會(huì)作為L(zhǎng)VS節(jié)點(diǎn)轉(zhuǎn)發(fā),但是也可以作為真實(shí)服務(wù)器提供服務(wù)纺弊,充分利用資源牛欢。
一、Keepalived配置LVS-DR模式
! Configuration File for keepalived
global_defs {
}
vrrp_instance VI_1 {
state BACKUP //nopreempt不搶占要求節(jié)點(diǎn)都為BACKUP
interface wlan
virtual_router_id 51 //同一個(gè)集群節(jié)點(diǎn)的virtual_router_id要一致
priority 100 //主節(jié)點(diǎn)要比備節(jié)點(diǎn)的priority高
advert_int 1 //vrrp組播時(shí)間間隔
nopreempt //主機(jī)從故障狀態(tài)恢復(fù)后不搶占備機(jī)
notify_master "/etc/keepalived/master.sh"
notify_backup "/etc/keepalived/backup.sh"
notify_fault "/etc/keepalived/fault.sh"
virtual_ipaddress {
192.168.1.1/27 dev wlan
}
}
virtual_server 192.168.1.10 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.1.11 80 {
weight 100
HTTP_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
??上面是一份常見(jiàn)的Keepalived LVS-DR模式的配置淆游。在LVS不與RS合設(shè)的情況下傍睹,這份配置是沒(méi)有問(wèn)題的。
??但是犹菱,如果LVS與RS合設(shè)拾稳,這個(gè)配置就會(huì)帶來(lái)一個(gè)非常嚴(yán)重的問(wèn)題: 乒乓現(xiàn)象。
二腊脱、乒乓現(xiàn)象
- 什么是乒乓現(xiàn)象
??客戶端消息發(fā)送給主機(jī)LVS后访得,調(diào)度給備機(jī);而備機(jī)的LVS收到主機(jī)轉(zhuǎn)發(fā)的消息后陕凹,又調(diào)度回給主機(jī)悍抑;主機(jī)因?yàn)橹暗恼{(diào)度記錄,會(huì)再次轉(zhuǎn)發(fā)給備機(jī)杜耙,雙方之間來(lái)回踢皮球搜骡,形成一個(gè)無(wú)法自動(dòng)停止的環(huán)路,很容易就引發(fā)網(wǎng)卡流量風(fēng)暴泥技,把網(wǎng)卡打爆浆兰。 - 出現(xiàn)乒乓現(xiàn)象的必要條件
?1. LVS和RS合設(shè)
?2. 使用DR模式,備機(jī)LO網(wǎng)卡上要綁定VIP
?3. 備機(jī)要加載LVS轉(zhuǎn)發(fā)規(guī)則
??而很不幸珊豹,為了加快故障切換的速度簸呈,Keepalived會(huì)在master和所有backup節(jié)點(diǎn)同時(shí)都加載LVS規(guī)則。所以店茶,Keepalived LVS-DR與RS合設(shè)的場(chǎng)景下蜕便,滿足上述3個(gè)條件,必然有1/4的概率會(huì)出現(xiàn)乒乓現(xiàn)象贩幻。 -
Keepalived LVS+DR合設(shè)乒乓現(xiàn)象
LVS主機(jī)請(qǐng)求數(shù)
??如上所示轿腺,僅僅是一個(gè)telnet發(fā)起的syn請(qǐng)求两嘴,就已經(jīng)能造成如此巨大的轉(zhuǎn)發(fā)量了,如果是生產(chǎn)環(huán)境族壳,必然會(huì)引起網(wǎng)卡流量風(fēng)暴憔辫。
三、如何解決合設(shè)帶來(lái)的乒乓問(wèn)題
??要想解決乒乓問(wèn)題仿荆,只需要將引發(fā)乒乓現(xiàn)象的必要條件給破壞掉贰您。很顯然條件1和2都是不能改變的,不然這個(gè)問(wèn)題本身也沒(méi)有存在的意義了拢操。那我們只能拿條件3開(kāi)刀了锦亦。
??既然備機(jī)加載了LVS轉(zhuǎn)發(fā)規(guī)則就會(huì)引發(fā)乒乓,那么能否讓備機(jī)不加載規(guī)則呢令境?
- 方法一:避免備機(jī)加載LVS規(guī)則
??Keepalived都是通過(guò)/etc/keepalived/keepalived.conf這個(gè)配置文件進(jìn)行規(guī)則加載的杠园。我們可以不將virtual_server的配置直接寫(xiě)死到keepalived.conf中,而是通過(guò)include引用的形式來(lái)引用其他路徑下的文件:
include /etc/keepalived/*.conf
??而對(duì)于備機(jī)舔庶,我們可以在/etc/keepalived下創(chuàng)建一個(gè)目錄抛蚁,如vs_dir,利用notify_backup腳本將virtual_server配置挪到vs_dir中隱藏起來(lái)栖茉,避免Keepalived加載篮绿。當(dāng)backup節(jié)點(diǎn)切換到master狀態(tài)時(shí),由notify_master節(jié)點(diǎn)將目錄中隱藏的vs配置挪到/etc/keepalived下吕漂,使Keepalived可以正常加載亲配。
??上面的辦法雖然能解決問(wèn)題,但是比較繁瑣惶凝,也不利于故障快速切換吼虎。那么我們換個(gè)思路,在備機(jī)加載了LVS規(guī)則的情況下苍鲜,要想解決問(wèn)題思灰,只需保證主機(jī)上轉(zhuǎn)發(fā)過(guò)來(lái)的消息不進(jìn)入備機(jī)的LVS轉(zhuǎn)發(fā),而是直接由備機(jī)的真實(shí)服務(wù)進(jìn)行處理混滔。
- 方法二:使用fwmark標(biāo)記
??iptables的mangle表可以對(duì)目標(biāo)數(shù)據(jù)包加上mark標(biāo)記洒疚,用于實(shí)現(xiàn)策略路由控制數(shù)據(jù)包的流向。我們?cè)谝?guī)則中指定對(duì)端LVS節(jié)點(diǎn)的mac地址坯屿,如果不是對(duì)端mac地址的請(qǐng)求油湖,說(shuō)明是來(lái)自客戶端的請(qǐng)求,需要打上mark標(biāo)記领跛;如果是來(lái)自對(duì)端mac地址的請(qǐng)求乏德,則說(shuō)明是主機(jī)轉(zhuǎn)發(fā)的請(qǐng)求,就不打標(biāo)記。
??而剛好LVS也支持通過(guò)fwmark配置虛擬服務(wù)喊括,替代場(chǎng)景的VIP:PORT方式胧瓜,只對(duì)打了fwmark標(biāo)記的數(shù)據(jù)包進(jìn)行轉(zhuǎn)發(fā)。二者結(jié)合起來(lái)即可實(shí)現(xiàn)只針對(duì)客戶端過(guò)來(lái)的請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)郑什,乒乓問(wèn)題迎刃而解府喳!
??一次完整的客戶端請(qǐng)求處理流程如下:
?? 首先客戶端的請(qǐng)求到達(dá)LVS主機(jī),先由主機(jī)上的iptables對(duì)請(qǐng)求數(shù)據(jù)包打上一個(gè)mark值為1的標(biāo)記(mark值可為任意正整數(shù))蘑拯,然后LVS上配置了fwmark為1的虛擬服務(wù)劫拢,這樣被打上mark的數(shù)據(jù)包就可以正常被主機(jī)的LVS捕獲,進(jìn)入虛擬服務(wù)轉(zhuǎn)發(fā)强胰;如果請(qǐng)求被轉(zhuǎn)發(fā)給了備機(jī),因?yàn)槭莵?lái)自主機(jī)mac地址的請(qǐng)求妹沙,所以備機(jī)不會(huì)打mark偶洋,也就不會(huì)進(jìn)入備機(jī)的虛擬服務(wù)轉(zhuǎn)發(fā),而是直接由備機(jī)的RS服務(wù)處理距糖。
?? iptables配置方法:
?LVS主機(jī)上配置iptables玄窝,其中$MAC_Director_B 表示備機(jī)的mac地址
# iptables -t mangle -I PREROUTING -p tcp -m tcp -d $VIP --dport $VPORT -m mac ! --mac-source $MAC_Director_B -j MARK --set-mark 0x1
??LVS備機(jī)上配置iptables,其中$MAC_Director_A 表示主機(jī)的mac地址
# iptables -t mangle -I PREROUTING -p tcp -m tcp -d $VIP --dport $VPORT -m mac ! --mac-source $MAC_Director_A -j MARK --set-mark 0x1
??keepalived.conf中virtual_server的配置
virtual_server fwmark 1 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 192.168.1.10 80 {
weight 100
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.1.11 80 {
weight 100
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
??注意悍引,iptables中給數(shù)據(jù)包打上的mark值只是一個(gè)系統(tǒng)內(nèi)核中數(shù)據(jù)結(jié)構(gòu)恩脂,并不會(huì)實(shí)際改變數(shù)據(jù)包的內(nèi)容,數(shù)據(jù)包ip頭部中也沒(méi)有mark的字段趣斤。所以備機(jī)上收到來(lái)自主機(jī)轉(zhuǎn)發(fā)的請(qǐng)求中俩块,是沒(méi)有mark標(biāo)記的,而備機(jī)的iptables中也限定了來(lái)自主機(jī)mac的請(qǐng)求不會(huì)打標(biāo)記浓领,所以請(qǐng)求是不會(huì)進(jìn)入備機(jī)的LVS虛擬服務(wù)中玉凯,而是被RS服務(wù)直接處理。
圖片內(nèi)容參考來(lái)自 https://www.frozentux.net/iptables-tutorial/chunkyhtml/x4389.html
??下面介紹的mark標(biāo)記和lvs工作分別對(duì)應(yīng)netfilter框架中的位置联贩,應(yīng)該會(huì)有助于理解fwmark為什么能解決乒乓問(wèn)題
??如上圖所示漫仆,對(duì)數(shù)據(jù)包打上mark標(biāo)記是在mangle表的PREROUTING鏈中,而LVS捕獲數(shù)據(jù)包是在filter表的INPUT鏈中泪幌。在netfilter框架中盲厌,數(shù)據(jù)包的流向是先經(jīng)過(guò)PREROUTING鏈,再到INPUT鏈祸泪,所以打mark標(biāo)記會(huì)先于LVS處理吗浩。
圖片內(nèi)容參考來(lái)自 http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.filter_rules.html
- 方法3:使用REDIRECT重定向
??除了使用fwmark,還有一個(gè)辦法讓備機(jī)上收到主機(jī)轉(zhuǎn)發(fā)的數(shù)據(jù)包不再進(jìn)入備機(jī)的虛擬服務(wù)浴滴,那就是在備機(jī)LVS捕獲到數(shù)據(jù)包之前拓萌,使用nat表中的REDIRECT直接將數(shù)據(jù)包目的地址重定向到本機(jī)127.0.0.1,這樣備機(jī)的LVS也就無(wú)法捕獲到這個(gè)數(shù)據(jù)包了升略,而是由備機(jī)的RS服務(wù)直接處理微王。注意屡限,這個(gè)方法要求RS服務(wù)是全網(wǎng)監(jiān)聽(tīng),即必須同時(shí)監(jiān)聽(tīng)在127.0.0.1才行炕倘。否則REDIRECT后備機(jī)無(wú)法處理钧大。
??在備機(jī)的NAT表中配置REDIRECT規(guī)則,主機(jī)中無(wú)需配置罩旋。
# iptables -t nat -A PREROUTING -p tcp -m tcp -d $VIP --dport $PORT -j REDIRECT
??如果發(fā)生了主備切換啊央,則需要在腳本中調(diào)整主備機(jī)中的這條iptables配置,將新主機(jī)中的配置清除涨醋,新備機(jī)中加上該配置瓜饥。
??綜合來(lái)看以上各種方法,更傾向于使用fwmark浴骂。方法一實(shí)現(xiàn)過(guò)于繁瑣乓土,也不利于故障快速切換。方法3需要在切換時(shí)更改對(duì)應(yīng)角色的iptables配置溯警,增加了切換的不穩(wěn)定性趣苏。而fwmark在部署階段配置好后則無(wú)需再變動(dòng),更為可靠梯轻。只是要注意防止系統(tǒng)重啟導(dǎo)致iptables規(guī)則失效食磕。