女朋友問我 LB 是誰?
科普一下 LB(負(fù)載均衡)技術(shù)
我的編程導(dǎo)航網(wǎng)站:www.code-nav.cn
大家好,我是魚皮。
周末在家寫代碼,無意中跟女朋友提了下 LB,還說 LB 好的呱呱叫。
她笑了笑,問我 LB 是誰?

我急忙解釋道:LB 它可不是活人,而是目前企業(yè)開發(fā)中常用的技術(shù) —— 負(fù)載均衡,下面讓我給你講講吧!
負(fù)載均衡
介紹
假如我們剛剛上線一個(gè)網(wǎng)站,最多只有 10 個(gè)人同時(shí)訪問,那么只需要把網(wǎng)站放到一臺(tái)服務(wù)器上就夠了,又叫 單機(jī)部署 :

隨著我們網(wǎng)站的不斷宣傳,可能出現(xiàn)上萬用戶同時(shí)訪問的情況。由于一臺(tái)服務(wù)器的 CPU、內(nèi)存、帶寬等資源都是有限的,無法同時(shí)支撐那么多用戶。因此可能需要多臺(tái)服務(wù)器一起來扛,分?jǐn)傆脩舻恼?qǐng)求,你一半我一半,又叫 集群部署:

但這樣有個(gè)問題,每個(gè)服務(wù)器都有一個(gè)不同的 IP 地址,想把用戶的請(qǐng)求分?jǐn)偟讲煌姆?wù)器上,總不能讓用戶自己去輸入不同的 IP 訪問吧?
因此,我們還需要一臺(tái) 代理服務(wù)器 ,對(duì)外提供 唯一 的入口,統(tǒng)一 接受用戶的請(qǐng)求。再根據(jù)請(qǐng)求(或流量)的 特征 ,依據(jù)一定的 算法 ,將請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)部的服務(wù)器集群中,如圖:

這樣對(duì)于用戶來說,始終通過一個(gè)域名訪問網(wǎng)站即可,他完全感知不到你的網(wǎng)站到底部署到多少臺(tái)服務(wù)器上、也不關(guān)心它是如何部署的。
這便是 負(fù)載均衡(Load Balancing 簡(jiǎn)稱 LB),是企業(yè)中最重要的高并發(fā)解決方案之一。
作用
負(fù)載均衡最直觀的作用就是提高系統(tǒng)的并發(fā)度,說人話就是允許更多人同時(shí)訪問了。
它還可以提高整個(gè)系統(tǒng)的可用性,假如集群中有一臺(tái)服務(wù)器掛了,代理服務(wù)器只要不再把請(qǐng)求轉(zhuǎn)發(fā)給它就行了,集群中的其他服務(wù)器仍然能夠正常地接受和處理請(qǐng)求。
此外,負(fù)載均衡還能夠減少用戶等待響應(yīng)的時(shí)間、通過并行提高整個(gè)系統(tǒng)的處理能力等。

分類
雖然通過代理服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求能夠提升整個(gè)系統(tǒng)的并發(fā)訪問數(shù),但不要忘了,代理服務(wù)器本身的資源也是有限的?。∠癖容^常用的 Nginx 代理,能有個(gè)幾萬并發(fā)就撐死了。如果同時(shí)訪問的用戶量再大一點(diǎn),不就忍不下了么?!

而且代理服務(wù)器也存在掛掉的可能性,一旦它掛了,后果不堪設(shè)想。
因此,我們可以將負(fù)載均衡進(jìn)行分類,針對(duì)不同的場(chǎng)景來選擇相對(duì)合適的實(shí)現(xiàn)方式。
比較常見的分類方法是:根據(jù) 計(jì)算機(jī)網(wǎng)絡(luò)七層模型 ,按照負(fù)載均衡所屬的網(wǎng)絡(luò)層次去區(qū)分。
下面這張計(jì)算機(jī)網(wǎng)絡(luò)模型圖還是很棒的:

有關(guān)計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí)非本文重點(diǎn),大家可以自行去了解,不懂也沒關(guān)系,可以接著往下看。
無論是哪層負(fù)載均衡,都需要有代理服務(wù)器,并且對(duì)外提供唯一的 IP 地址,然后根據(jù)算法將請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器(實(shí)際處理請(qǐng)求的服務(wù)器)。只不過實(shí)現(xiàn)轉(zhuǎn)發(fā)的原理和邏輯不同罷了。
二層負(fù)載均衡
二層指數(shù)據(jù)鏈路層,數(shù)據(jù)以數(shù)據(jù)幀的形式通過交換機(jī)進(jìn)行傳輸。
這一層是沒有 IP 地址概念的,只能用 MAC 地址對(duì)機(jī)器進(jìn)行區(qū)分。因此負(fù)載均衡服務(wù)器會(huì)通過一個(gè)虛擬 MAC 地址接受請(qǐng)求,并通過改寫報(bào)文目標(biāo) MAC 地址的方式將請(qǐng)求轉(zhuǎn)發(fā)到具有不同 MAC 地址的目標(biāo)機(jī)器。

二層負(fù)載均衡最原始、性能極高。但只能通過硬件設(shè)備實(shí)現(xiàn),比如 F5、Array 等,價(jià)格十分昂貴。
主要的底層實(shí)現(xiàn)方式就是 PPP 捆綁和鏈路聚合技術(shù),這里不做贅述,對(duì)于開發(fā)同學(xué)來說,大家一般也接觸不到二層負(fù)載均衡。
三層負(fù)載均衡
三層即網(wǎng)絡(luò)層,這一層開始有了 IP 地址的概念,可以根據(jù) IP 地址路由網(wǎng)絡(luò)。
這一層的負(fù)載均衡設(shè)備會(huì)對(duì)外提供一個(gè)虛擬的 IP 地址(VIP)以接收請(qǐng)求,然后根據(jù)算法將請(qǐng)求轉(zhuǎn)發(fā)到 IP 地址不同的目標(biāo)機(jī)器。

和二層一樣,三層負(fù)載均衡也是通過硬件設(shè)備實(shí)現(xiàn),成本也比較高。
四層負(fù)載均衡
四層即傳輸層,除了包含三層的 IP 地址信息之外,還多了源目端口號(hào)的概念,可以區(qū)分同一機(jī)器上不同的應(yīng)用。
由于得到了更多的信息,這一層的負(fù)載均衡會(huì)更加靈活,對(duì)外提供一個(gè)虛擬的 IP 地址 + 端口號(hào)來接收請(qǐng)求,然后根據(jù)算法將請(qǐng)求轉(zhuǎn)發(fā)到不同目標(biāo)機(jī)器的不同端口上。

四層負(fù)載均衡可以通過軟件實(shí)現(xiàn),比如主流且開源的 LVS(Linux Virtual Server),底層可選多種負(fù)載模式,比如 NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)、DR(直接路由)、TUN(隧道)。
四層負(fù)載均衡的優(yōu)點(diǎn)是:一方面是性能很高、比較穩(wěn)定,支撐個(gè)十幾萬、幾十萬并發(fā)不成問題;另一方面是成本低、純軟件實(shí)現(xiàn),因此在企業(yè)中的應(yīng)用很廣泛。
七層負(fù)載均衡
七層指應(yīng)用層,是計(jì)算機(jī)網(wǎng)絡(luò)模型的最上層,因此能得到請(qǐng)求最為詳細(xì)的信息,比如 HTTP 請(qǐng)求頭等。
可以根據(jù)域名或主機(jī) IP + 端口接收請(qǐng)求,并通過應(yīng)用層信息(請(qǐng)求頭、Cookie 等)靈活地轉(zhuǎn)發(fā)請(qǐng)求,比如將手機(jī)端用戶轉(zhuǎn)發(fā)到服務(wù)器 A、桌面端用戶轉(zhuǎn)發(fā)到服務(wù)器 B 等。

這種方式實(shí)現(xiàn)成本最低,也最為靈活,因此也是我們應(yīng)用開發(fā)人員最常用的了。
實(shí)現(xiàn)方式多種多樣,比如主流的 Nginx、HAProxy 都可以,寫個(gè)配置基本就能轉(zhuǎn)發(fā)請(qǐng)求了,大部分情況下性能也夠用了。
再提一下所屬于這層的 DNS 負(fù)載均衡
,基于 DNS 域名解析服務(wù),可以將同一個(gè)域名解析為不同的 IP 地址,從而讓用戶訪問到不同服務(wù)器上的項(xiàng)目。
這種方式實(shí)現(xiàn)起來不難,但轉(zhuǎn)發(fā)邏輯不夠靈活,而且 DNS ?存在緩存,不利于修改。
除了上面講到的這些,負(fù)載均衡還有很多學(xué)問,比如負(fù)載均衡算法(比如常用的靜態(tài)輪詢、動(dòng)態(tài)連接數(shù)等)、高可用等,這些大家自行了解和實(shí)踐下就好了,具體場(chǎng)景具體分析。
以上,我是魚皮,本文有用還請(qǐng) 點(diǎn)贊 支持下。
歡迎閱讀 我自學(xué)進(jìn)入騰訊的編程學(xué)習(xí)和求職經(jīng)歷,不再迷茫!
指路:https://t.1yb.co/w66s