Keepalived LVS+DR合設(shè)配置方法以及存在的問(wèn)題

??使用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ù)
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ù)直接處理。

MARK target介紹

圖片內(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)題

netfilter框架

??如上圖所示漫仆,對(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ī)則失效食磕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喳挑,隨后出現(xiàn)的幾起案子彬伦,更是在濱河造成了極大的恐慌,老刑警劉巖伊诵,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媚朦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡日戈,警方通過(guò)查閱死者的電腦和手機(jī)询张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浙炼,“玉大人份氧,你說(shuō)我怎么就攤上這事⊥淝” “怎么了蜗帜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)资厉。 經(jīng)常有香客問(wèn)我厅缺,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任湘捎,我火速辦了婚禮诀豁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窥妇。我一直安慰自己舷胜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布活翩。 她就那樣靜靜地躺著烹骨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪材泄。 梳的紋絲不亂的頭發(fā)上沮焕,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音拉宗,去河邊找鬼遇汞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛簿废,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播络它,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼族檬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了化戳?” 一聲冷哼從身側(cè)響起单料,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎点楼,沒(méi)想到半個(gè)月后扫尖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掠廓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年换怖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟀瞧。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沉颂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悦污,到底是詐尸還是另有隱情铸屉,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布切端,位于F島的核電站彻坛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昌屉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一钙蒙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怠益,春花似錦仪搔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抢呆,卻和暖如春煮嫌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抱虐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工昌阿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恳邀。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓懦冰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谣沸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刷钢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359