高可用負(fù)載均衡實(shí)踐
關(guān)于負(fù)載均衡器已經(jīng)有很多文章,但今天要討論的不是負(fù)載均衡器如何工作,而是如何防止負(fù)載均衡器成為單點(diǎn)故障。
負(fù)載均衡器是系統(tǒng)設(shè)計(jì)工具集中的絕佳工具,可幫助系統(tǒng)進(jìn)行擴(kuò)展。當(dāng)我們需要為大流量提供服務(wù)時(shí),將不可避免遇到單臺(tái)服務(wù)器內(nèi)存和計(jì)算能力不足以為所有流量提供服務(wù)的情況。此時(shí),有以下兩種選擇:
- 通過(guò)增加處理能力和內(nèi)存使服務(wù)器更強(qiáng)大,但有硬件上限約束。
 - 也可以運(yùn)行多個(gè)服務(wù)器實(shí)例,每個(gè)實(shí)例處理部分流量。
 

簡(jiǎn)單來(lái)說(shuō),負(fù)載均衡器會(huì)接收所有進(jìn)入的流量,并智能的將流量分配給服務(wù)器的多個(gè)運(yùn)行實(shí)例。這樣只需要增加越來(lái)越多的服務(wù)器副本,就可以無(wú)限擴(kuò)容。在系統(tǒng)設(shè)計(jì)術(shù)語(yǔ)中,這被稱為水平擴(kuò)容。
雖然負(fù)載均衡器可以在應(yīng)用擴(kuò)容時(shí)規(guī)避內(nèi)存和計(jì)算限制,但并不能解決單點(diǎn)故障問(wèn)題。

從上圖可以看到,所有請(qǐng)求都要經(jīng)過(guò)負(fù)載均衡器,然后由負(fù)載均衡器將請(qǐng)求轉(zhuǎn)發(fā)到后端副本。很明顯,在這種情況下,負(fù)載均衡器本身就是一個(gè)單點(diǎn)。如果負(fù)載均衡器關(guān)閉或由于某種原因無(wú)法訪問(wèn),用戶將無(wú)法使用應(yīng)用程序,從而造成業(yè)務(wù)全面中斷。
那么該如何防止出現(xiàn)這種情況,如何防止負(fù)載均衡器造成單點(diǎn)故障呢?下面我們將討論如何解決這一問(wèn)題。
部署高可用主從負(fù)載均衡器
解決這個(gè)問(wèn)題的一個(gè)辦法是將負(fù)載均衡器部署為高可用對(duì),這意味著要部署兩個(gè)或更多負(fù)載均衡器實(shí)例,一旦其中某個(gè)負(fù)載均衡器出現(xiàn)故障,其他負(fù)載均衡器就能接替并繼續(xù)為客戶提供服務(wù)。
聽起來(lái)似乎是個(gè)合理的解決方案,但馬上想到的第一個(gè)問(wèn)題是,客戶如何知道需要向哪個(gè)負(fù)載均衡器實(shí)例發(fā)出請(qǐng)求?如果負(fù)載均衡器的某個(gè)實(shí)例出現(xiàn)故障,其他負(fù)載均衡器如何知道?
我們來(lái)解決這些問(wèn)題。
如何管理本地網(wǎng)絡(luò)流量
要回答上述問(wèn)題,必須了解以下有關(guān)網(wǎng)絡(luò)路由的要點(diǎn),我們需要深入了解流量是如何在網(wǎng)絡(luò)中路由的。
- 本地網(wǎng)絡(luò)內(nèi)的所有流量都由一臺(tái)名為"交換機(jī)"的設(shè)備管理,而不是路由器。
 - 交換機(jī)通過(guò)主機(jī) MAC 地址向它們發(fā)送流量。
 - 每當(dāng)交換機(jī)收到帶有目標(biāo) IP 地址的 TCP 數(shù)據(jù)包時(shí),都需要知道相應(yīng)主機(jī)的 MAC 地址,以便將 TCP 數(shù)據(jù)包正確轉(zhuǎn)發(fā)給正確的目標(biāo)機(jī)器。
 - 為了解析目標(biāo) IP 地址的 MAC 地址,交換機(jī)將使用地址解析協(xié)議 (ARP,Address Resolution Protocol),向連接到本地網(wǎng)絡(luò)的所有機(jī)器發(fā)送廣播,詢問(wèn)它們是否正在為給定的 IP 提供服務(wù)。
 - 擁有給定 IP 的主機(jī)將回復(fù)其 MAC 地址,而其他主機(jī)將直接忽略 ARP 請(qǐng)求。
 

了解了網(wǎng)絡(luò)路由的工作原理后,讓我們回到最初的問(wèn)題。
第一步是在網(wǎng)絡(luò)中部署兩個(gè)負(fù)載均衡器,其中一個(gè)為主模式,另一個(gè)為從模式,這種主從模式在高可用性系統(tǒng)中非常常見。
這兩個(gè)負(fù)載均衡器同意共享同一個(gè)虛擬 IP 地址(虛擬 IP 地址分配給軟件系統(tǒng),如負(fù)載均衡器,而不是物理設(shè)備,因此可以將其視為一個(gè)虛構(gòu)的 IP 地址),并且互相發(fā)送心跳(liveness ping)。

每當(dāng)交換機(jī)要將數(shù)據(jù)包轉(zhuǎn)發(fā)到虛擬 IP 地址時(shí),首先向網(wǎng)絡(luò)上的所有主機(jī)發(fā)送廣播,詢問(wèn)哪些機(jī)器的 MAC 地址分配了虛擬 IP 地址。主負(fù)載均衡收到廣播后,會(huì)立即以其 MAC 地址作出回應(yīng),這樣交換機(jī)就知道,今后所有屬于虛擬 IP 地址的數(shù)據(jù)包都應(yīng)轉(zhuǎn)發(fā)給主負(fù)載均衡器。從負(fù)載均衡器也會(huì)收到該廣播,但不會(huì)用自己的 MAC 地址做出回應(yīng),因?yàn)樗雷约翰皇侵髫?fù)載均衡器。

兩個(gè)負(fù)載均衡器不斷相互發(fā)送心跳(liveness ping)信息。如果主負(fù)載均衡器發(fā)生故障,從負(fù)載均衡器會(huì)立即開始為虛擬 IP 地址公布自己的 MAC 地址,從而承擔(dān)起主負(fù)載均衡器的角色。

將 IP 地址解析為 MAC 地址的整個(gè)過(guò)程是通過(guò)地址解析協(xié)議(簡(jiǎn)稱 ARP)完成的。
請(qǐng)注意,使用 ARP 將 MAC 地址解析為 IP 地址的過(guò)程相當(dāng)快,因此當(dāng)主負(fù)載均衡器發(fā)生故障時(shí),終端用戶可能不會(huì)看到明顯的停機(jī)時(shí)間。
這就是我們確保負(fù)載均衡器不會(huì)成為單點(diǎn)故障的方法。請(qǐng)注意,還可以使用其他策略來(lái)解決這個(gè)問(wèn)題,例如使用多播,或監(jiān)控負(fù)載均衡器并自動(dòng)更新 DNS 以指向健康的負(fù)載均衡器等。















 
 
 









 
 
 
 