<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【萬字長文】吃透負(fù)載均衡

          共 11371字,需瀏覽 23分鐘

           ·

          2022-01-01 01:28


          大家好,我是雨樂。

          首先告訴大家一件事,在十一國慶期間,引擎的機(jī)器又又。。。又扛不住了流量。

          經(jīng)過監(jiān)控分析,發(fā)現(xiàn)某個服務(wù)的一個實(shí)例所在的虛擬機(jī)扛不住了,所以采取臨時措施流量控制之后,問題解決了,但還是造成了不小的損失。

          經(jīng)過此次故障,以及分析故障的過程中對負(fù)載均衡又有了新的更加深入的認(rèn)識,所以將這部分寫出來,算是做個故障總結(jié)吧

          1寫在前面

          寫本文的目的:

          • 對負(fù)載均衡的理解零零散散,不成體系。

          閱讀這篇文章需要的條件:

          • 對OSI模型有些許了解
          • 有耐心。本文涉及大量的知識點(diǎn),且只能用文字才能講清楚,所以文字比較多。

          收獲:

          • 讀完此篇文章,從宏觀的角度理解了負(fù)載均衡的原理以及實(shí)現(xiàn)機(jī)制。加深對分布式架構(gòu)的了解

          主要內(nèi)容:

          • 本文首先從概念開始,講解什么是負(fù)載均衡,以及負(fù)載均衡在分布式系統(tǒng)中所承擔(dān)的角色以及提供的功能。
          • 講解負(fù)載均衡的分類。分別從 軟硬件角度地域范圍角度 以及 OSI模型角度 進(jìn)行分類講解負(fù)載均衡的實(shí)現(xiàn)方案。
          • 從負(fù)載均衡的策略角度來分析目前業(yè)界的負(fù)載均衡算法以及其優(yōu)缺點(diǎn)

          好了,準(zhǔn)備好了么,讓我們開始這次愉快之旅。

          2引言

          首先 撇開對線上的影響,如果線上突發(fā)來了流量,后端服務(wù)扛不住,我們會怎么做呢?無非兩種方式:

          • 提升機(jī)器配置(CPU、內(nèi)存、硬盤、帶寬等)
          • 加機(jī)器

          上面兩種方式,我們稱之為縱向擴(kuò)展和橫向擴(kuò)展。

          縱向擴(kuò)展,是從單機(jī)的角度通過增加硬件處理能力,比如CPU處理能力,內(nèi)存容量,磁盤等方面,實(shí)現(xiàn)服務(wù)器處理能力的提升,不能滿足大型分布式系統(tǒng)(網(wǎng)站),大流量,高并發(fā),海量數(shù)據(jù)的問題。

          橫向擴(kuò)展,通過添加機(jī)器來滿足大型網(wǎng)站服務(wù)的處理能力。比如:一臺機(jī)器不能滿足,則增加兩臺或者多臺機(jī)器,共同承擔(dān)訪問壓力。

          3概念

          負(fù)載均衡,英文名稱為Load Balance,其含義就是指將負(fù)載(工作任務(wù)或者網(wǎng)絡(luò)請求)進(jìn)行平衡,分?jǐn)偟蕉鄠€操作單元(服務(wù)器或者組件)上進(jìn)行運(yùn)行。目的是盡量將網(wǎng)絡(luò)流量 平均 發(fā)送到多個服務(wù)器上,以保證整個業(yè)務(wù)系統(tǒng)的高可用。

          負(fù)載均衡

          在互聯(lián)網(wǎng)的早期,網(wǎng)絡(luò)還不是很發(fā)達(dá),流量相對較小,業(yè)務(wù)也比較簡單,單臺服務(wù)器或者實(shí)例就有可能滿足訪問需要。但如今在互聯(lián)網(wǎng)發(fā)達(dá)的今天,流量請求動輒百億、甚至上千億,單臺服務(wù)器或者實(shí)例已完全不能滿足需求,這就有了集群。不論是為了實(shí)現(xiàn)高可用還是高性能,都需要用到多臺機(jī)器來擴(kuò)展服務(wù)能力,用戶的請求不管連接到哪臺服務(wù)器,都能得到相同的相應(yīng)處理。

          另一方面,如何構(gòu)建和調(diào)度服務(wù)集群這事情,又必須對用戶一側(cè)保持足夠的透明,即使請求背后是由一千臺、一萬臺機(jī)器來共同響應(yīng)的,也絕非用戶所關(guān)心的事情,用戶需記住的只有一個域名地址而已。調(diào)度后方的多臺機(jī)器,以統(tǒng)一的接口對外提供服務(wù),承擔(dān)此職責(zé)的技術(shù)組件被稱為 負(fù)載均衡

          負(fù)載均衡主要有以下作用:

          • 高并發(fā)。通過采取一定的算法策略,將流量盡可能的均勻發(fā)送給后端的實(shí)例,以此提高集群的并發(fā)處理能力。

          • 伸縮性。根據(jù)網(wǎng)絡(luò)流量的大小,增加或者減少后端服務(wù)器實(shí)例,由負(fù)載均衡設(shè)備進(jìn)行控制,這樣使得集群具有伸縮性。

          • 高可用。負(fù)載均衡器通過算法或者其他性能數(shù)據(jù)來監(jiān)控候選實(shí)例,當(dāng)實(shí)例負(fù)載過高或者異常時,減少其流量請求或者直接跳過該實(shí)例,將請求發(fā)送個其他可用實(shí)例,這使得集群具有高可用的特性。

          • 安全防護(hù)。有些負(fù)載均衡器提供了安全防護(hù)功能。如:黑白名單處理、防火墻等。

          4分類

          根據(jù)載體類型分類

          從支持負(fù)載均衡的載體來看,可以將負(fù)載均衡分為兩類:

          • 硬件負(fù)載均衡
          • 軟件負(fù)載均衡
          硬件負(fù)載均衡

          硬件負(fù)載平衡器是一種硬件設(shè)備,具有專門的操作系統(tǒng)。硬件負(fù)載平衡器位于傳入流量和內(nèi)部服務(wù)器之間,本質(zhì)上充當(dāng)“流量警察”。當(dāng)用戶訪問網(wǎng)站或者使用app某個功能時,它們首先被發(fā)送到負(fù)載均衡器,然后負(fù)載均衡器根據(jù)一定的策略,將流量轉(zhuǎn)發(fā)到后端不同的服務(wù)器。為確保最佳性能,硬件負(fù)載均衡器根據(jù)自定義規(guī)則分配流量,以免后端實(shí)例不堪重負(fù)。

          傳統(tǒng)上,硬件負(fù)載平衡器和應(yīng)用服務(wù)器部署在本地數(shù)據(jù)中心,負(fù)載平衡器的數(shù)量取決于預(yù)期的峰值流量。負(fù)載均衡器通常成對部署,以防其中一個失敗。

          目前業(yè)界領(lǐng)先的兩款硬件負(fù)載均衡器:F5和A10

          硬件負(fù)載均衡

          優(yōu)點(diǎn)

          功能強(qiáng)大:支持全局負(fù)載均衡并提供較全面的、復(fù)雜的負(fù)載均衡算法。

          性能強(qiáng)悍:硬件負(fù)載均衡由于是在專用處理器上運(yùn)行,因此吞吐量大,可支持單機(jī)百萬以上的并發(fā)。

          安全性高:往往具備防火墻,防 DDos 攻擊等安全功能。

          缺點(diǎn)

          成本昂貴:購買和維護(hù)硬件負(fù)載均衡的成本都很高(:F5價格在15w~55w不等,A10價格在55w-100w不等)。

          擴(kuò)展性差:當(dāng)訪問量突增時,超過限度不能動態(tài)擴(kuò)容。

          軟件負(fù)載均衡

          軟件負(fù)載均衡指的是在服務(wù)器的操作系統(tǒng)上安裝負(fù)載均衡軟件,從此服務(wù)器發(fā)出的請求經(jīng)軟件負(fù)載均衡算法路由到后端集群的某一臺機(jī)器上。

          常見負(fù)載均衡軟件有:LVS、Nginx、Haproxy。

          軟件負(fù)載均衡

          優(yōu)點(diǎn)

          擴(kuò)展性好:適應(yīng)動態(tài)變化,可以通過添加軟件負(fù)載均衡實(shí)例,動態(tài)擴(kuò)展到超出初始容量的能力。

          成本低廉:軟件負(fù)載均衡可以在任何標(biāo)準(zhǔn)物理設(shè)備上運(yùn)行,降低了購買和運(yùn)維的成本。

          缺點(diǎn)

          性能略差:相比于硬件負(fù)載均衡,軟件負(fù)載均衡的性能要略低一些。

          軟硬件負(fù)載均衡器的區(qū)別

          • 硬件負(fù)載平衡器與軟件負(fù)載平衡器之間最明顯的區(qū)別在于,硬件負(fù)載平衡器需要專有的機(jī)架堆疊硬件設(shè)備,而軟件負(fù)載平衡器只需安裝在標(biāo)準(zhǔn) x86 服務(wù)器或虛擬機(jī)上。網(wǎng)絡(luò)負(fù)載平衡器硬件通常是過度配置的——換句話說,它們的大小能夠處理偶爾的高峰流量負(fù)載。此外,每個硬件設(shè)備都必須與一個額外的設(shè)備配對以獲得高可用性,以防其他負(fù)載均衡器出現(xiàn)故障。

          • 硬件和軟件負(fù)載平衡器之間的另一個關(guān)鍵區(qū)別在于擴(kuò)展能力。隨著網(wǎng)絡(luò)流量的增長,數(shù)據(jù)中心必須提供足夠的負(fù)載均衡器以滿足峰值需求。對于許多企業(yè)來說,這意味著大多數(shù)負(fù)載均衡器在高峰流量時間(例如黑色星期五)之前一直處于空閑狀態(tài)。

          • 如果流量意外超出容量,最終用戶體驗(yàn)會受到顯著影響。另一方面,軟件負(fù)載平衡器能夠彈性擴(kuò)展以滿足需求。無論網(wǎng)絡(luò)流量是低還是高,軟件負(fù)載平衡器都可以簡單地實(shí)時自動擴(kuò)展,消除過度配置成本和對意外流量激增的擔(dān)憂。

          • 此外,硬件負(fù)載平衡器配置可能很復(fù)雜。基于軟件定義原則構(gòu)建的軟件負(fù)載平衡器跨多個數(shù)據(jù)中心和混合/多云環(huán)境。事實(shí)上,硬件設(shè)備與云環(huán)境不兼容,而軟件負(fù)載均衡器與裸機(jī)、虛擬、容器和云平臺兼容。

          根據(jù)地域范圍分類

          負(fù)載均衡從其應(yīng)用的地理結(jié)構(gòu)上分為本地負(fù)載均衡(Local Load Balance)和全局負(fù)載均衡(Global Load Balance,也叫地域負(fù)載均衡)。

          地域負(fù)載均衡
          本地負(fù)載均衡

          本地負(fù)載均衡是指對本地的服務(wù)器群做負(fù)載均衡。

          本地負(fù)載均衡針對本地范圍的服務(wù)器群做負(fù)載均衡,本地負(fù)載均衡不需要花費(fèi)高額成本購置高性能服務(wù)器,只需利用現(xiàn)有設(shè)備資源,就可有效避免服務(wù)器單點(diǎn)故障造成數(shù)據(jù)流量的損失,通常用來解決數(shù)據(jù)流量過大、網(wǎng)絡(luò)負(fù)荷過重的問題。同時它擁有形式多樣的均衡策略把數(shù)據(jù)流量合理均衡的分配到各臺服務(wù)器。如果需要在現(xiàn)在服務(wù)器上升級擴(kuò)充,不需改變現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)、停止現(xiàn)有服務(wù),僅需要在服務(wù)群中簡單地添加一臺新服務(wù)器。

          本地負(fù)載均衡能有效地解決數(shù)據(jù)流量過大、網(wǎng)絡(luò)負(fù)荷過重的問題,并且不需花費(fèi)昂貴開支購置性能卓越的服務(wù)器,充分利用現(xiàn)有設(shè)備,避免服務(wù)器單點(diǎn)故障造成數(shù)據(jù)流量的損失。

          其有靈活多樣的均衡策略把數(shù)據(jù)流量合理地分配給服務(wù)器群內(nèi)的服務(wù)器共同負(fù)擔(dān)。即使是再給現(xiàn)有服務(wù)器擴(kuò)充升級,也只是簡單地增加一個新的服務(wù)器到服務(wù)群中,而不需改變現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)、停止現(xiàn)有的服務(wù)。

          全局負(fù)載均衡

          全局負(fù)載均衡是指對分別放置在不同的地理位置、有不同網(wǎng)絡(luò)結(jié)構(gòu)的服務(wù)器群間作負(fù)載均衡。

          全局負(fù)載均衡主要用于在一個多區(qū)域擁有自己服務(wù)器的站點(diǎn),為了使全球用戶只以一個IP地址或域名就能訪問到離自己最近的服務(wù)器,從而獲得最快的訪問速度,也可用于子公司分散站點(diǎn)分布廣的大公司通過Intranet(企業(yè)內(nèi)部互聯(lián)網(wǎng))來達(dá)到資源統(tǒng)一合理分配的目的。

          全局負(fù)載均衡,目前實(shí)現(xiàn)方式有以下幾種:

          • 通過運(yùn)營商線路調(diào)度:這個主要是指國內(nèi),由于特殊原因國內(nèi)不同運(yùn)營商互聯(lián)互通存在很大問題,比如聯(lián)通用戶訪問電信機(jī)房服務(wù)器延遲很大,甚至有可能無法訪問的情況。假如您的業(yè)務(wù)部署在不同運(yùn)營商機(jī)房,可以通過運(yùn)營商線路解析來實(shí)現(xiàn)調(diào)度,聯(lián)通線路用戶域名解析到聯(lián)通機(jī)房IP,電信線路用戶域名解析電信機(jī)房IP,這樣保證不同用戶訪問最佳的服務(wù)器。

          • 通過地域線路調(diào)度:

            • 我們都知道,網(wǎng)站服務(wù)器越近,訪問速度越快,比如天津用戶訪問北京服務(wù)器會比廣州服務(wù)器快很多。假如您的業(yè)務(wù)部署在華北,華南兩個Region,可以通過地域線路解析,設(shè)置華北,東北,西北,華中用戶訪問域名解析到北京服務(wù)器IP,華東,華南,西南用戶訪問域名解析到廣州服務(wù)器IP,這樣用戶訪問離自己最近的服務(wù)器可以提升訪問體驗(yàn)。
            • 假如您的業(yè)務(wù)是面向全球的,國內(nèi)部署有業(yè)務(wù),海外也部署有業(yè)務(wù),可以選擇中國用戶訪問域名解析到國內(nèi)服務(wù)器,海外用戶訪問域名解析到海外服務(wù)器。當(dāng)然海外的還可以細(xì)分,比如選擇亞太--新加坡的用戶等,可以具體到洲,國家。
          • 權(quán)重輪詢:比如一個域名解析到多個IP,可以根據(jù)不同IP服務(wù)器的配置,業(yè)務(wù)情況設(shè)置解析比重,比如2:1或者1:1等等。

          • 健康檢查,故障轉(zhuǎn)移:可以創(chuàng)建監(jiān)控任務(wù)實(shí)時監(jiān)控后端服務(wù)器IP的健康狀態(tài),如果發(fā)現(xiàn)后端服務(wù)器異常,可以把解析流量切換到其他正常的服務(wù)器或者備用服務(wù)器,保證業(yè)務(wù)不會中斷。

          CDN的全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其就是采用的全局負(fù)載均衡。假如我們將圖片存儲在CDN上,且該CDN所在廠家在北京、杭州均有服務(wù)器。那么:

          • 當(dāng)天津的用戶需要下載該圖片的時候,會自動將流量請求轉(zhuǎn)發(fā)至距離其最近的CDN服務(wù)器,也就是北京
          • 當(dāng)安徽的用戶需要下載圖片的時候,就會將流量請求轉(zhuǎn)發(fā)至杭州。

          根據(jù)OSI網(wǎng)絡(luò)模型分類

          OSI是一個開放性的通信系統(tǒng)互連參考模型,如上圖所示。在OSI參考模型中,分別有:

          • 應(yīng)用層
          • 表示層
          • 會話層
          • 傳輸層
          • 網(wǎng)絡(luò)層
          • 數(shù)據(jù)鏈路層
          • 物理層

          從上圖可以看出:

          TELNET、HTTP、FTP、NFS、SMTP、DNS等屬于第七層應(yīng)用層的概念。

          TCP、UDP、SPX等屬于第四層傳輸層的概念。

          IP、IPX等屬于第三層網(wǎng)絡(luò)層的概念。

          ATM、FDDI等屬于第二層數(shù)據(jù)鏈路層的概念。

          根據(jù)負(fù)載均衡技術(shù)實(shí)現(xiàn)在OSI七層模型的不同層次,我們給負(fù)載均衡分類:

          • 七層負(fù)載均衡:工作在應(yīng)用層的負(fù)載均衡稱
          • 四層負(fù)載均衡:工作在傳輸層的負(fù)載均衡稱
          • 三層負(fù)載均衡:工作在網(wǎng)絡(luò)層的負(fù)載均衡,
          • 二層負(fù)載均衡:工作在數(shù)據(jù)鏈路層的負(fù)載均衡。

          其中最常用的是四層和七層負(fù)載均衡

          下面我們將從OSI模型從下往上的順序,來詳細(xì)講解上述幾種負(fù)載均衡。

          二層負(fù)載均衡

          工作在數(shù)據(jù)鏈路層的負(fù)載均衡稱之為二層負(fù)載均衡(又稱為數(shù)據(jù)鏈路層負(fù)載均衡),通過在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址進(jìn)行負(fù)載均衡。

          二層負(fù)載均衡是基于數(shù)據(jù)鏈路層的負(fù)載均衡,即讓負(fù)載均衡服務(wù)器和業(yè)務(wù)服務(wù)器綁定同一個虛擬IP(即VIP),客戶端直接通過這個VIP進(jìn)行請求集群。集群中不同的機(jī)器采用相同IP地址,但是機(jī)器的MAC地址不一樣。當(dāng)負(fù)載均衡服務(wù)器接受到請求之后,通過改寫報文的目標(biāo)MAC地址的方式將請求轉(zhuǎn)發(fā)到目標(biāo)機(jī)器實(shí)現(xiàn)負(fù)載均衡。

          數(shù)據(jù)鏈路層負(fù)載均衡所做的工作,是修改請求的數(shù)據(jù)幀中的 MAC 目標(biāo)地址,讓用戶原本是發(fā)送給負(fù)載均衡器的請求的數(shù)據(jù)幀,被二層交換機(jī)根據(jù)新的 MAC 目標(biāo)地址轉(zhuǎn)發(fā)到服務(wù)器集群中對應(yīng)的服務(wù)器(真實(shí)服務(wù)器)的網(wǎng)卡上,這樣真實(shí)服務(wù)器就獲得了一個原本目標(biāo)并不是發(fā)送給它的數(shù)據(jù)幀。

          為了便于理解,我們假設(shè)負(fù)載均衡器所在的ip地址為192.168.1.1,后端服務(wù)實(shí)例的mac地址分別為52:54:00:A1:CB:F7,61:52:00:A2:BD, 71:63:52:A3:CA。如下圖所示:

          二層負(fù)載均衡

          在上圖中,用戶的請求首先到達(dá)ip為192.168.1.1的二層負(fù)載均衡器,然后二層負(fù)載均衡器通過采取一定的策略,選中了mac地址為71:63:52:A3:CA,然后將流量轉(zhuǎn)發(fā)至該服務(wù)實(shí)例。

          需要注意的是,上述只有請求經(jīng)過負(fù)載均衡器,而服務(wù)的響應(yīng)無須從負(fù)載均衡器原路返回的工作模式,整個請求、轉(zhuǎn)發(fā)、響應(yīng)的鏈路形成一個“三角關(guān)系”,所以這種負(fù)載均衡模式也常被很形象地稱為“三角傳輸模式”,也有叫“單臂模式”或者“直接路由”。

          二層負(fù)載均衡器直接改寫目標(biāo) MAC 地址的工作原理決定了它與真實(shí)的服務(wù)器的通信必須是二層可達(dá)的,通俗地說就是必須位于同一個子網(wǎng)當(dāng)中,無法跨 VLAN。優(yōu)勢(效率高)和劣勢(不能跨子網(wǎng))共同決定了數(shù)據(jù)鏈路層負(fù)載均衡最適合用來做數(shù)據(jù)中心的第一級均衡設(shè)備,用來連接其他的下級負(fù)載均衡器。

          三層負(fù)載均衡

          三層負(fù)載均衡是基于網(wǎng)絡(luò)層的負(fù)載均衡,因此又叫網(wǎng)絡(luò)層負(fù)載均衡。通俗的說就是按照不同機(jī)器不同IP地址進(jìn)行轉(zhuǎn)發(fā)請求到不同的機(jī)器上。

          根據(jù) OSI 七層模型,在第三層網(wǎng)絡(luò)層傳輸?shù)膯挝皇欠纸M數(shù)據(jù)包,這是一種在分組交換網(wǎng)絡(luò)中傳輸?shù)慕Y(jié)構(gòu)化數(shù)據(jù)單位。以IP協(xié)議為例,一個IP 數(shù)據(jù)包由 Headers 和 Payload 兩部分組成, Headers 長度最大為60Bytes,其中包括了20Bytes的固定數(shù)據(jù)和最長不超過40Bytes 的可選的額外設(shè)置組成。

          三層負(fù)載均衡服務(wù)器對外依然提供一個VIP(虛IP),但是集群中不同的機(jī)器采用不同的IP地址。當(dāng)負(fù)載均衡服務(wù)器接受到請求之后,根據(jù)不同的負(fù)載均衡算法,通過IP將請求轉(zhuǎn)發(fā)至不同的真實(shí)服務(wù)器。

          學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)的都知道,在IP分組的數(shù)據(jù)報header中有 源IP目標(biāo)IP。源IP和目標(biāo)IP代表分組交換中數(shù)據(jù)是從哪臺機(jī)器到哪臺機(jī)器的,那么,我們可以采用跟修改二層負(fù)載均衡中MAC地址的方式一樣,直接修改目標(biāo)IP,以達(dá)到數(shù)據(jù)轉(zhuǎn)發(fā)的目的。

          修改目標(biāo)IP的方式有兩種:1、原有的數(shù)據(jù)包保持不變,生成一個新的數(shù)據(jù)包,原數(shù)據(jù)包的Header和Payload作為新數(shù)據(jù)包的Payload,在這個新數(shù)據(jù)包的 Headers 中寫入真實(shí)服務(wù)器的 IP 作為目標(biāo)地址,然后把它發(fā)送出去。

          真實(shí)服務(wù)器收到數(shù)據(jù)包后,必須在接收入口處設(shè)計(jì)一個針對性的拆包機(jī)制,把由負(fù)載均衡器自動添加的那層 Headers 扔掉,還原出原來的數(shù)據(jù)包來進(jìn)行使用。這樣,真實(shí)服務(wù)器就同樣拿到了一個原本不是發(fā)給它(目標(biāo) IP 不是它)的數(shù)據(jù)包,達(dá)到了流量轉(zhuǎn)發(fā)的目的。這種數(shù)據(jù)傳輸方式叫做 IP隧道 傳輸。

          盡管因?yàn)橐庋b新的數(shù)據(jù)包,IP 隧道的轉(zhuǎn)發(fā)模式比起直接路由模式效率會有所下降,但由于并沒有修改原有數(shù)據(jù)包中的任何信息,所以 IP 隧道的轉(zhuǎn)發(fā)模式仍然具備三角傳輸?shù)奶匦裕簇?fù)載均衡器轉(zhuǎn)發(fā)來的請求,可以由真實(shí)服務(wù)器去直接應(yīng)答,無須在經(jīng)過均衡器原路返回。而且由于 IP 隧道工作在網(wǎng)絡(luò)層,所以可以跨越 VLAN,因此擺脫了直接路由模式中網(wǎng)絡(luò)側(cè)的約束。

          此模式從請求到響應(yīng)如下圖所示:

          IP隧道模式負(fù)載均衡

          優(yōu)點(diǎn):

          • 可以跨越 VLAN 缺點(diǎn):
          • 要求真實(shí)服務(wù)器必須支持IP隧道協(xié)議,也就是說服務(wù)器需要自己會拆包
          • 必須通過專門的配置,必須保證所有的真實(shí)服務(wù)器與均衡器有著相同的虛擬 IP 地址,因?yàn)榛貜?fù)該數(shù)據(jù)包時,需要使用這個虛擬 IP 作為響應(yīng)數(shù)據(jù)包的源地址,這樣客戶端收到這個數(shù)據(jù)包時才能正確解析。

          基于以上原因,就有了第二種修改方式。2、改變目標(biāo)數(shù)據(jù)包。

          直接把數(shù)據(jù)包 Headers 中的目標(biāo)地址改為真實(shí)服務(wù)器地址,修改后原本由用戶發(fā)給均衡器的數(shù)據(jù)包,也會被三層交換機(jī)轉(zhuǎn)發(fā)送到真實(shí)服務(wù)器的網(wǎng)卡上,而且因?yàn)闆]有經(jīng)過 IP 隧道的額外包裝,也就無須再拆包了。

          因?yàn)檫@種模式是通過修改目標(biāo) IP 地址才到達(dá)真實(shí)服務(wù)器的,如果真實(shí)服務(wù)器直接將應(yīng)答包返回客戶端的話,這個應(yīng)答數(shù)據(jù)包的源 IP 是真實(shí)服務(wù)器的 IP,也即均衡器修改以后的 IP 地址,客戶端不可能認(rèn)識該 IP,自然就無法再正常處理這個應(yīng)答了。因此,只能讓應(yīng)答流量繼續(xù)回到負(fù)載均衡,由負(fù)載均衡把應(yīng)答包的源 IP 改回自己的 IP,再發(fā)給客戶端,這樣才能保證客戶端與真實(shí)服務(wù)器之間的正常通信。

          這種修改目標(biāo)IP的方式叫NAT模式,這種通過修改目標(biāo)IP的方式達(dá)到負(fù)載均衡目的的方式叫做NAT負(fù)載均衡。如下圖所示:

          NAT模式負(fù)載均衡
          四層負(fù)載均衡

          所謂四層負(fù)載均衡,也就是主要通過報文中的目標(biāo)地址和端口,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器。

          由于四層負(fù)載均衡是作用在傳輸層,因此,我們就以常見的TCP進(jìn)行舉例。

          負(fù)載均衡設(shè)備在接收到第一個來自客戶端的SYN 請求時,即通過上述方式選擇一個最佳的服務(wù)器,并對報文中目標(biāo)IP地址進(jìn)行修改(改為后端服務(wù)器IP),直接轉(zhuǎn)發(fā)給該服務(wù)器。TCP的連接建立,即三次握手是客戶端和服務(wù)器直接建立的,負(fù)載均衡設(shè)備只是起到一個類似路由器的轉(zhuǎn)發(fā)動作。在某些部署情況下,為保證服務(wù)器回包可以正確返回給負(fù)載均衡設(shè)備,在轉(zhuǎn)發(fā)報文的同時可能還會對報文原來的源地址進(jìn)行修改。

          四層負(fù)載均衡

          四層負(fù)載均衡主要是基于tcp協(xié)議報文,可以做任何基于tcp/ip協(xié)議的軟件的負(fù)載均衡,比如Haproxy、LVS等。

          七層負(fù)載均衡

          所謂七層負(fù)載均衡,也稱為“內(nèi)容交換”,也就是主要通過報文中的真正有意義的應(yīng)用層內(nèi)容,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器。

          應(yīng)用層協(xié)議較多,常用http、radius、dns等。七層負(fù)載就可以基于這些協(xié)議來負(fù)載。

          我們?nèi)匀灰訲CP為例。負(fù)載均衡設(shè)備如果要根據(jù)真正的應(yīng)用層內(nèi)容再選擇服務(wù)器,只能先代理最終的服務(wù)器和客戶端建立連接(三次握手)后,才可能接受到客戶端發(fā)送的真正應(yīng)用層內(nèi)容的報文,然后再根據(jù)該報文中的特定字段,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器。負(fù)載均衡設(shè)備在這種情況下,更類似于一個代理服務(wù)器。負(fù)載均衡和前端的客戶端以及后端的服務(wù)器會分別建立TCP連接。所以從這個技術(shù)原理上來看,七層負(fù)載均衡明顯的對負(fù)載均衡設(shè)備的要求更高,處理七層的能力也必然會低于四層模式的部署方式。

          七層負(fù)載均衡器會與客戶端 以及 后端的服務(wù)實(shí)例分別建立連接

          七層負(fù)載均衡

          七層負(fù)載均衡基本都是基于http協(xié)議的,適用于web服務(wù)器的負(fù)載均衡,比如Nginx等。

          對比(四層和七層)

          • 智能性

            • 七層負(fù)載均衡由于具備OIS七層的所有功能,所以在處理用戶需求上能更加靈活,從理論上講,七層模型能對用戶的所有跟服務(wù)端的請求進(jìn)行修改。例如對文件header添加信息,根據(jù)不同的文件類型進(jìn)行分類轉(zhuǎn)發(fā)。
            • 四層模型僅支持基于網(wǎng)絡(luò)層的需求轉(zhuǎn)發(fā),不能修改用戶請求的內(nèi)容。
          • 安全性

            • 七層負(fù)載均衡由于具有OSI模型的全部功能,能更容易抵御來自網(wǎng)絡(luò)的攻擊
            • 四層模型從原理上講,會直接將用戶的請求轉(zhuǎn)發(fā)給后端節(jié)點(diǎn),無法直接抵御網(wǎng)絡(luò)攻擊。
          • 復(fù)雜度

            • 四層模型一般比較簡單的架構(gòu),容易管理,容易定位問題
            • 七層模型架構(gòu)比較復(fù)雜,通常也需要考慮結(jié)合四層模型的混用情況,出現(xiàn)問題定位比較復(fù)雜。
          • 效率比

            • 四層模型基于更底層的設(shè)置,通常效率更高,但應(yīng)用范圍有限
            • 七層模型需要更多的資源損耗,在理論上講比四層模型有更強(qiáng)的功能,現(xiàn)在的實(shí)現(xiàn)更多是基于http應(yīng)用。

          6算法與實(shí)現(xiàn)

          常用的負(fù)載均衡算法分為以下兩類:

          • 靜態(tài)負(fù)載均衡
          • 動態(tài)負(fù)載均衡

          常見的靜態(tài)均衡算法:輪詢法、隨機(jī)法、源地址哈希法、一致性哈希法、加權(quán)輪詢法、加權(quán)隨機(jī)法。

          常見的動態(tài)負(fù)載均衡算法:最小連接數(shù)法、最快響應(yīng)速度法。

          隨機(jī)法(Random)

          將請求隨機(jī)分配到各個節(jié)點(diǎn)。由概率統(tǒng)計(jì)理論得知,隨著客戶端調(diào)用服務(wù)端的次數(shù)增多,其實(shí)際效果越來越接近于平均分配,也就是輪詢的結(jié)果。

          隨機(jī)策略會導(dǎo)致配置較低的機(jī)器Down機(jī),從而可能引起雪崩,一般采用隨機(jī)算法時建議后端集群機(jī)器配置最好同等的,隨機(jī)策略的性能取決于隨機(jī)算法的性能。

          • 優(yōu)點(diǎn):簡單高效,易于水平擴(kuò)展,每個節(jié)點(diǎn)滿足字面意義上的均衡;
          • 缺點(diǎn):沒有考慮機(jī)器的性能問題,根據(jù)木桶最短木板理論,集群性能瓶頸更多的會受性能差的服務(wù)器影響。
          隨機(jī)法

          實(shí)現(xiàn):

          std::string?Select(const?std::vector?&ips)?{
          ??size_t?size?=?ips.size();
          ??if?(size?==?0)?{
          ????return?"";
          ??}
          ??
          ??return?ips[random()?%?size];
          }

          輪詢法(Round Robin)

          每一次來自網(wǎng)絡(luò)的請求輪流分配給內(nèi)部中的服務(wù)器,從1至N然后重新開始。此種均衡算法適合于服務(wù)器組中的所有服務(wù)器都有相同的軟硬件配置并且平均服務(wù)請求相對均衡的情況。

          假設(shè)10臺機(jī)器,從0-9,請求來臨時從0號機(jī)器開始,后續(xù)每來一次請求對編號加1,這樣一直循環(huán),上面的隨機(jī)策略其實(shí)最后就變成輪詢了,這兩種策略都不關(guān)心機(jī)器的負(fù)載和運(yùn)行情況,而且對變量操作會引入鎖操作,性能也會下會下降。

          • 優(yōu)點(diǎn):簡單高效,易于水平擴(kuò)展,每個節(jié)點(diǎn)滿足字面意義上的均衡;
          • 缺點(diǎn):沒有考慮機(jī)器的性能問題,根據(jù)木桶最短木板理論,集群性能瓶頸更多的會受性能差的服務(wù)器影響。
          輪詢法

          代碼實(shí)現(xiàn):

          static?int?idx?=?0;
          std::string?Select(const?std::vector?&ips)?{
          ??size_t?size?=?ips.size();
          ??if?(size?==?0)?{
          ????return?"";
          ??}
          ??
          ??if?(idx?==?ips.size())?{
          ????idx?=?0;
          ??}
          ??
          ??return?ips[idx++];
          }

          加權(quán)輪詢法(Weighted Round Robin)

          不同的后端服務(wù)器可能機(jī)器的配置和當(dāng)前系統(tǒng)的負(fù)載并不相同,因此它們的抗壓能力也不相同。給配置高、負(fù)載低的機(jī)器配置更高的權(quán)重,讓其處理更多的請求;而配置低、負(fù)載高的機(jī)器,給其分配較低的權(quán)重,降低其系統(tǒng)負(fù)載,加權(quán)輪詢能很好地處理這一問題,并將請求順序且按照權(quán)重分配到后端。

          假設(shè)后端有3臺服務(wù)器,分別為a b c,現(xiàn)在在負(fù)載均衡器中配置a服務(wù)器的權(quán)重為7,b服務(wù)的權(quán)重為2,c服務(wù)的權(quán)重為1。當(dāng)來了10次請求的時候,其中有7次請求a,2次請求b,1次請求c。即最終結(jié)果是

          aaaaaaabbc
          • 優(yōu)點(diǎn):可以將不同機(jī)器的性能問題納入到考量范圍,集群性能最優(yōu)最大化;
          • 缺點(diǎn):生產(chǎn)環(huán)境復(fù)雜多變,服務(wù)器抗壓能力也無法精確估算,靜態(tài)算法導(dǎo)致無法實(shí)時動態(tài)調(diào)整節(jié)點(diǎn)權(quán)重,只能粗糙優(yōu)化。
          加權(quán)輪詢

          加權(quán)隨機(jī)法(Weighted Random)

          與加權(quán)輪詢法一樣,加權(quán)隨機(jī)法也根據(jù)服務(wù)器的配置,系統(tǒng)的負(fù)載分配不同的權(quán)重。不同的是,它是按照權(quán)重隨機(jī)請求后端服務(wù)器,而非順序。


          在之前的文章權(quán)重隨機(jī)分配器我們有詳細(xì)講過各種實(shí)現(xiàn)方案,此處我們不再贅述,從里面摘抄了一種實(shí)現(xiàn)方案作為本方案的實(shí)現(xiàn)。

          加權(quán)隨機(jī)
          • 優(yōu)點(diǎn):可以將不同機(jī)器的性能問題納入到考量范圍,集群性能最優(yōu)最大化;
          • 缺點(diǎn):生產(chǎn)環(huán)境復(fù)雜多變,服務(wù)器抗壓能力也無法精確估算,靜態(tài)算法導(dǎo)致無法實(shí)時動態(tài)調(diào)整節(jié)點(diǎn)權(quán)重,只能粗糙優(yōu)化。

          代碼實(shí)現(xiàn)

          srtuct?Item?{
          ??std::string?ip;
          ??int?weight;
          };
          std::string?select(const?std::vector?&items)?{
          ??int?sum?=?0;
          ??for?(auto?elem?:?items)?{
          ????sum?+=?elem.weight;
          ??}
          ??
          ??int?rd?=?rand()?%?sum;
          ??int?s?=?0;
          ??std::string?res;
          ??for?(auto?elem?:?items)?{
          ????s?+=?elem.weight;
          ????if?(s?>=?rd)?{
          ??????res?=?elem.ip;
          ??????break;
          ????}
          ??}
          ??return?res;
          }

          最快響應(yīng)速度法(Response Time)

          根據(jù)請求的響應(yīng)時間,來動態(tài)調(diào)整每個節(jié)點(diǎn)的權(quán)重,將響應(yīng)速度快的服務(wù)節(jié)點(diǎn)分配更多的請求,響應(yīng)速度慢的服務(wù)節(jié)點(diǎn)分配更少的請求

          負(fù)載均衡設(shè)備對內(nèi)部各服務(wù)器發(fā)出一個探測請求(例如Ping),然后根據(jù)內(nèi)部中各服務(wù)器對探測請求的最快響應(yīng)時間來決定哪一臺服務(wù)器來響應(yīng)客戶端的服務(wù)請求。此種均衡算法能較好的反映服務(wù)器的當(dāng)前運(yùn)行狀態(tài),但這最快響應(yīng)時間僅僅指的是負(fù)載均衡設(shè)備與服務(wù)器間的最快響應(yīng)時間,而不是客戶端與服務(wù)器間的最快響應(yīng)時間。

          • 優(yōu)點(diǎn):動態(tài),實(shí)時變化,控制的粒度更細(xì),更靈敏;
          • 缺點(diǎn):復(fù)雜度更高,每次需要計(jì)算請求的響應(yīng)速度;
          最快響應(yīng)速度

          最少連接數(shù)法(Least Connections)

          將請求分發(fā)到連接數(shù)/請求數(shù)最少的候選服務(wù)器,已達(dá)到負(fù)載均衡的目的

          客戶端的每一次請求服務(wù)在服務(wù)器停留的時間可能會有較大的差異,隨著工作時間加長,如果采用簡單的輪循或隨機(jī)均衡算法,每一臺服務(wù)器上的連接進(jìn)程可能會產(chǎn)生極大的不同,并沒有達(dá)到真正的負(fù)載均衡。最少連接數(shù)均衡算法對內(nèi)部中需負(fù)載的每一臺服務(wù)器都有一個數(shù)據(jù)記錄,記錄當(dāng)前該服務(wù)器正在處理的連接數(shù)量,當(dāng)有新的服務(wù)連接請求時,將把當(dāng)前請求分配給連接數(shù)最少的服務(wù)器,使均衡更加符合實(shí)際情況,負(fù)載更加均衡。此種均衡算法適合長時處理的請求服務(wù),如FTP。

          • 優(yōu)點(diǎn):動態(tài),根據(jù)節(jié)點(diǎn)狀況實(shí)時變化
          • 缺點(diǎn):提高了復(fù)雜度,每次連接斷開需要進(jìn)行計(jì)數(shù)
          最少連接數(shù)

          源地址哈希法(Source Hashing)

          根據(jù)請求源 IP,通過哈希計(jì)算得到一個數(shù)值,用該數(shù)值在候選服務(wù)器列表的進(jìn)行取模運(yùn)算,得到的結(jié)果便是選中的服務(wù)器。

          能夠讓同一客戶端的請求或者同一用戶的請求總是請求在后端同一臺機(jī)器上,這種算法根據(jù)客戶端IP求出Hash值然后對端集群總數(shù)求余得到值就是服務(wù)器集合的下標(biāo),一般這種算法用于緩存命中,或者同一會話請求等,但這種算法也有一定的缺點(diǎn),某一用戶訪問量(黑產(chǎn))非常高時可能造成服務(wù)端壓力過大或者后端服務(wù)Down掉,那么客戶端就會無法訪問,所以也需要一定的降級策略。

          • 優(yōu)點(diǎn):將來自同一IP地址的請求,同一會話期內(nèi),轉(zhuǎn)發(fā)到相同的服務(wù)器;實(shí)現(xiàn)會話粘滯
          • 缺點(diǎn):目標(biāo)服務(wù)器宕機(jī)后,會話會丟失
          源地址哈希

          一致性哈希(Consistency hash)

          一些場景希望同樣的請求盡量落到一臺機(jī)器上,比如訪問緩存集群時,我們往往希望同一種請求能落到同一個后端上,以充分利用其上已有的緩存,不同的機(jī)器承載不同的穩(wěn)定請求量(也可以理解為固定批用戶的請求)。而不是隨機(jī)地散落到所有機(jī)器上,那樣的話會迫使所有機(jī)器緩存所有的內(nèi)容,最終由于存不下形成顛簸而表現(xiàn)糟糕。我們都知道hash能滿足這個要求,比如當(dāng)有n臺服務(wù)器時,輸入x總是會發(fā)送到第hash(x) % n臺服務(wù)器上。但當(dāng)服務(wù)器變?yōu)閙臺時,hash(x) % n和hash(x) % m很可能都不相等,這會使得幾乎所有請求的發(fā)送目的地都發(fā)生變化,如果目的地是緩存服務(wù),所有緩存將失效,繼而對原本被緩存遮擋的數(shù)據(jù)庫或計(jì)算服務(wù)造成請求風(fēng)暴,觸發(fā)雪崩。一致性哈希是一種特殊的哈希算法,在增加服務(wù)器時,發(fā)向每個老節(jié)點(diǎn)的請求中只會有一部分轉(zhuǎn)向新節(jié)點(diǎn),從而實(shí)現(xiàn)平滑的遷移。

          一致性哈希

          優(yōu)點(diǎn):

          • 平衡性: 每個節(jié)點(diǎn)被選到的概率是O(1/n)。
          • 單調(diào)性: 當(dāng)新節(jié)點(diǎn)加入時, 不會有請求在老節(jié)點(diǎn)間移動, 只會從老節(jié)點(diǎn)移動到新節(jié)點(diǎn)。當(dāng)有節(jié)點(diǎn)被刪除時,也不會影響落在別的節(jié)點(diǎn)上的請求。
          • 分散性: 當(dāng)上游的機(jī)器看到不同的下游列表時(在上線時及不穩(wěn)定的網(wǎng)絡(luò)中比較常見), 同一個請求盡量映射到少量的節(jié)點(diǎn)中。
          • 負(fù)載: 當(dāng)上游的機(jī)器看到不同的下游列表的時候, 保證每臺下游分到的請求數(shù)量盡量一致。

          缺點(diǎn):

          • 在機(jī)器數(shù)量較少的時候,區(qū)間大小會不平衡。
          • 當(dāng)一臺機(jī)器故障的時候,它的壓力會完全轉(zhuǎn)移到另外一臺機(jī)器, 可能無法承載。

          7結(jié)語

          負(fù)載均衡并不是真正確保網(wǎng)絡(luò)流量能夠"均勻"的分配到后端服務(wù)實(shí)例。它只是抱著在意外情況發(fā)生時候,也能保證用戶體驗(yàn)。良好的架構(gòu)設(shè)計(jì)和彈性擴(kuò)容,能夠使得負(fù)載均衡的功能 事半功倍

          瀏覽 37
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一本大道久久久综合精品 | 在线视频日本不卡 | 国产男女啪啪视频 | 99中文视频 | 日日夜夜撸撸 |