双机热备的原理
轉(zhuǎn)載自?雙機(jī)熱備的原理
夜半驚魂
上次的文章《負(fù)載均衡的原理》中講到,張大胖在Bill的指導(dǎo)下,成功地開發(fā)了一個(gè)四層的負(fù)載均衡軟件, 把流量“均勻地”分發(fā)到了后面的幾個(gè)服務(wù)器中, 獲得了老板的1000塊錢獎(jiǎng)勵(lì)。
但是張大胖心中隱隱不安,總覺得系統(tǒng)埋著一顆定時(shí)炸彈,隨時(shí)會(huì)引爆,這個(gè)炸彈就是: ?Load Balancer 只有一臺服務(wù)器,萬一這個(gè)服務(wù)器掛掉了怎么辦?
沒有了Load Balancer這個(gè)入口,用戶的請求無法分發(fā)過來,后面的這些服務(wù)器只能干瞪眼了。
系統(tǒng)有“單點(diǎn)失敗(Single Point of Failure)”的風(fēng)險(xiǎn)就是這個(gè)意思。
有一天晚上張大胖做了一個(gè)夢,夢見這個(gè)Load Balancer在高峰期掛掉了,導(dǎo)致整個(gè)系統(tǒng)癱瘓,看到損失了無數(shù)的訂單, 憤怒的老板不停地向他咆哮:扣你小子半年工資。
嚇得張大胖半夜醒來,出了一身冷汗。
不想單點(diǎn)失敗該怎么辦? 張大胖稍微思索下就能想到解決方案: 上兩臺Load Balancer !
可問題是:客戶端究竟要訪問哪一個(gè)?
還用DNS輪詢的方式? 那就回到最原始的問題了。
在這兩個(gè)Load Balancer之前再加一個(gè)Load Balancer? ?那豈不又是單點(diǎn)失敗?
不,這個(gè)路子是走不通的。
張大胖準(zhǔn)備另辟蹊徑。
在客戶端看來,這兩個(gè)Load Balancer 最好是一個(gè)整體,就像一個(gè)虛擬的服務(wù)器, 這個(gè)虛擬的服務(wù)對外提供一個(gè)IP (簡稱VIP)。
兩個(gè)Load Balancer中,一個(gè)叫做Master, 另外一個(gè)可以叫做Backup?, 平時(shí)Master 負(fù)責(zé)干活, Backup待命,一旦Master掛掉, Backup 服務(wù)器立刻接管。 ?在外界看來,那個(gè)虛擬的服務(wù)器還在工作,并不知道內(nèi)部發(fā)生的“大地震”。
想到這里,張大胖激動(dòng)起來,竟然睡不著了, 干脆爬起來看郵件,寫代碼。
詳細(xì)設(shè)計(jì)
第二天,張大胖七點(diǎn)就來到了公司,想著把昨晚的方案給Bill 匯報(bào)下。
可是他來得太早了,公司空無一人。 罷了,很多細(xì)節(jié)還沒有完善,先不著急。
首先是這個(gè)虛擬的VIP , 怎么才能實(shí)現(xiàn)在兩個(gè)服務(wù)器之間的“IP漂移”呢?
張大胖曾經(jīng)記得,一個(gè)網(wǎng)卡可以設(shè)置多個(gè)地址,比如在Linux上eth0表示網(wǎng)卡1,它可以綁定一個(gè)IP, 與此同時(shí),還可以設(shè)置一個(gè)ip alias ?或者 secondary ip 。
eth0 --> 192.168.1.10
eth0:1 ?--> 192.168.1.100
張大胖想: 我可以讓這個(gè)192.168.1.100為VIP,如果服務(wù)器是Master, 就可以把這個(gè)IP給綁定上, 如果是Backup,那就不綁定。
換句話說,通過動(dòng)態(tài)地綁定/解綁 就可以讓這個(gè)VIP在兩個(gè)服務(wù)器之間來回“漂移”了。
“IP漂移”的問題可以這么解決, 但是那個(gè)Backup 怎么知道Master 掛掉了呢?
從道理上說,很簡單,只需要讓Master不斷地給Backup發(fā)“心跳”消息即可(可以采用廣播的方式發(fā)消息), 這個(gè)Backup(LoadBalancer2)得有個(gè)定時(shí)器, 如果在一個(gè)特定的時(shí)間(嗯,這個(gè)時(shí)間應(yīng)該可以設(shè)置)內(nèi)收不到心跳,那就認(rèn)為Master完蛋了,就需要挺身而出,擦干眼淚,繼承前任的遺志,很Happy地綁定VIP , 繼續(xù)偉大的革命事業(yè)。
可是那個(gè)之前的Master(LoadBalancer1)如果又活了呢?
LoadBalancer2 該怎么辦?革命的康莊大道還沒走幾步, 就要拱手讓出還沒捂熱乎的VIP嗎?
如果LoadBalancer1是個(gè)性能更加強(qiáng)悍的機(jī)器,同志們肯定希望由他來統(tǒng)領(lǐng)全局。
這里得定義一個(gè)策略,每個(gè)機(jī)器都得有個(gè)優(yōu)先級(一個(gè)整數(shù)),在允許搶占的情況下,誰的優(yōu)先級高,誰就是Master!
張大胖想到: 看來需要我開發(fā)一個(gè)軟件了,實(shí)現(xiàn)這些通信“協(xié)議”和策略, 這個(gè)軟件需要安裝運(yùn)行在每個(gè)Load Balancer上,讓他們組成單個(gè)虛擬的Load Balancer, 對外提供服務(wù)。
在每個(gè)Load Balancer中,狀態(tài)轉(zhuǎn)換是這樣的, 張大胖畫了一張圖:
匯報(bào)工作
到了9點(diǎn)鐘, CTO Bill 準(zhǔn)時(shí)上班, 張大胖趕忙跑去向領(lǐng)導(dǎo)匯報(bào)昨晚和今早的思想動(dòng)態(tài)。
Bill 聽完,沉吟片刻,說道:“這個(gè)主意不錯(cuò),我支持! 可是。。。。。。”
張大胖立刻緊張起來, 自己想得挺完善的啊,難道還有問題?
只聽Bill 說道:“你可以讓那個(gè)IP地址在兩個(gè)主機(jī)之間漂移,實(shí)現(xiàn)主備切換, 但是MAC地址怎么辦? ”
張大胖說:“MAC地址 ? 關(guān)MAC地址什么事? ”
啊 ! 他突然明白了,確實(shí)是忽略了, IP包是被封裝在以太網(wǎng)幀中發(fā)送的,其中需要MAC地址。
在發(fā)送第一個(gè)請求的時(shí)候,客戶端(確切說是直接向Load Balancer發(fā)數(shù)據(jù)的那個(gè)機(jī)器)先是知道了VIP(如:192.168.1.100), 接下來它需要知道這個(gè)VIP的MAC地址,這樣才能發(fā)送數(shù)據(jù)。
為了拿到MAC地址,它需要發(fā)起ARP查詢: 這個(gè)VIP(192.168.1.100)的 MAC的地址是什么?
如果Load Balancer 1是Master ,就會(huì)回復(fù): 是23:39:8D:9C:0A:33 ?(記為 MAC1)
這時(shí)候客戶端就會(huì)緩存,記下來。
然后Load Balancer 1 掛掉, Load Balancer 2 成為 Master。
此時(shí)客戶端如果再次發(fā)送數(shù)據(jù),還會(huì)往MAC1去放送,于是就出錯(cuò)了。
想通了這一層, 張大胖犯了愁, 這可怎么辦?
Bill 提醒道:“你不是有個(gè)虛擬的IP地址嗎? 是不是也可以搞一個(gè)虛擬的MAC地址啊!”
張大胖如夢方醒: “對對, 無論是哪個(gè)機(jī)器成為Master, 每次響應(yīng)ARP請求的時(shí)候,都返回這個(gè)虛擬的MAC地址。這樣客戶端面對的MAC地址就唯一了。”
看來虛擬IP + 虛擬的MAC 地址才能完整地解決問題!
申請機(jī)器
張大胖把軟件開發(fā)出來了,小心翼翼地向摳門的老板去申請機(jī)器,老板看了方案,提了一個(gè)讓張大胖大跌眼鏡的問題: “你這里整了兩個(gè)Load Balancer服務(wù)器, 但是平時(shí)只用一個(gè),另外一個(gè)一直空閑,是不是極大的浪費(fèi)啊?”
怎么辦?張大胖撓了撓頭,犯難了。
總結(jié)
- 上一篇: 防止鸟撞玻璃,腾讯宣布为深圳滨海大厦总部
- 下一篇: java爬虫之基于httpclient的