大家好,,我是魚皮。 周末在家寫代碼,,無意中跟女朋友提了下 LB,還說 LB 好的呱呱叫,。 她笑了笑,,問我 LB 是誰,? 我急忙解釋道:LB 它可不是活人,,而是目前企業(yè)開發(fā)中常用的技術(shù) —— 負(fù)載均衡,,下面讓我給你講講吧! 負(fù)載均衡介紹假如我們剛剛上線一個網(wǎng)站,,最多只有 10 個人同時訪問,,那么只需要把網(wǎng)站放到一臺服務(wù)器上就夠了,又叫 單機部署 : 隨著我們網(wǎng)站的不斷宣傳,,可能出現(xiàn)上萬用戶同時訪問的情況。由于一臺服務(wù)器的 CPU,、內(nèi)存,、帶寬等資源都是有限的,無法同時支撐那么多用戶,。因此可能需要多臺服務(wù)器一起來扛,,分?jǐn)傆脩舻恼埱螅阋话胛乙话?,又?集群部署: 但這樣有個問題,每個服務(wù)器都有一個不同的 IP 地址,,想把用戶的請求分?jǐn)偟讲煌姆?wù)器上,,總不能讓用戶自己去輸入不同的 IP 訪問吧? 因此,,我們還需要一臺 代理服務(wù)器 ,,對外提供 唯一 的入口,統(tǒng)一 接受用戶的請求,。再根據(jù)請求(或流量)的 特征 ,,依據(jù)一定的 算法 ,將請求轉(zhuǎn)發(fā)到內(nèi)部的服務(wù)器集群中,,如圖: 這樣對于用戶來說,始終通過一個域名訪問網(wǎng)站即可,,他完全感知不到你的網(wǎng)站到底部署到多少臺服務(wù)器上,、也不關(guān)心它是如何部署的。 這便是 負(fù)載均衡(Load Balancing 簡稱 LB),,是企業(yè)中最重要的高并發(fā)解決方案之一,。 作用負(fù)載均衡最直觀的作用就是提高系統(tǒng)的并發(fā)度,說人話就是允許更多人同時訪問了,。 它還可以提高整個系統(tǒng)的可用性,,假如集群中有一臺服務(wù)器掛了,,代理服務(wù)器只要不再把請求轉(zhuǎn)發(fā)給它就行了,集群中的其他服務(wù)器仍然能夠正常地接受和處理請求,。 此外,,負(fù)載均衡還能夠減少用戶等待響應(yīng)的時間、通過并行提高整個系統(tǒng)的處理能力等,。 分類雖然通過代理服務(wù)器轉(zhuǎn)發(fā)請求能夠提升整個系統(tǒng)的并發(fā)訪問數(shù),但不要忘了,,代理服務(wù)器本身的資源也是有限的?。∠癖容^常用的 Nginx 代理,,能有個幾萬并發(fā)就撐死了,。如果同時訪問的用戶量再大一點,不就忍不下了么,?,! 而且代理服務(wù)器也存在掛掉的可能性,,一旦它掛了,,后果不堪設(shè)想。 因此,,我們可以將負(fù)載均衡進行分類,,針對不同的場景來選擇相對合適的實現(xiàn)方式。 比較常見的分類方法是:根據(jù) 計算機網(wǎng)絡(luò)七層模型 ,,按照負(fù)載均衡所屬的網(wǎng)絡(luò)層次去區(qū)分,。 下面這張計算機網(wǎng)絡(luò)模型圖還是很棒的: 計算機網(wǎng)絡(luò)模型 有關(guān)計算機網(wǎng)絡(luò)的知識非本文重點,,大家可以自行去了解,,不懂也沒關(guān)系,可以接著往下看,。 無論是哪層負(fù)載均衡,,都需要有代理服務(wù)器,并且對外提供唯一的 IP 地址,,然后根據(jù)算法將請求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器(實際處理請求的服務(wù)器),。只不過實現(xiàn)轉(zhuǎn)發(fā)的原理和邏輯不同罷了。 二層負(fù)載均衡二層指數(shù)據(jù)鏈路層,,數(shù)據(jù)以數(shù)據(jù)幀的形式通過交換機進行傳輸,。 這一層是沒有 IP 地址概念的,只能用 MAC 地址對機器進行區(qū)分。因此負(fù)載均衡服務(wù)器會通過一個虛擬 MAC 地址接受請求,,并通過改寫報文目標(biāo) MAC 地址的方式將請求轉(zhuǎn)發(fā)到具有不同 MAC 地址的目標(biāo)機器,。 二層負(fù)載均衡最原始,、性能極高。但只能通過硬件設(shè)備實現(xiàn),,比如 F5,、Array 等,價格十分昂貴,。 主要的底層實現(xiàn)方式就是 PPP 捆綁和鏈路聚合技術(shù),,這里不做贅述,對于開發(fā)同學(xué)來說,,大家一般也接觸不到二層負(fù)載均衡,。 三層負(fù)載均衡三層即網(wǎng)絡(luò)層,這一層開始有了 IP 地址的概念,,可以根據(jù) IP 地址路由網(wǎng)絡(luò),。 這一層的負(fù)載均衡設(shè)備會對外提供一個虛擬的 IP 地址(VIP)以接收請求,然后根據(jù)算法將請求轉(zhuǎn)發(fā)到 IP 地址不同的目標(biāo)機器,。 和二層一樣,三層負(fù)載均衡也是通過硬件設(shè)備實現(xiàn),,成本也比較高,。 四層負(fù)載均衡四層即傳輸層,除了包含三層的 IP 地址信息之外,,還多了源目端口號的概念,,可以區(qū)分同一機器上不同的應(yīng)用。 由于得到了更多的信息,,這一層的負(fù)載均衡會更加靈活,,對外提供一個虛擬的 IP 地址 端口號來接收請求,然后根據(jù)算法將請求轉(zhuǎn)發(fā)到不同目標(biāo)機器的不同端口上,。 四層負(fù)載均衡可以通過軟件實現(xiàn),比如主流且開源的 LVS(Linux Virtual Server),,底層可選多種負(fù)載模式,,比如 NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)、DR(直接路由),、TUN(隧道),。 四層負(fù)載均衡的優(yōu)點是:一方面是性能很高、比較穩(wěn)定,支撐個十幾萬,、幾十萬并發(fā)不成問題,;另一方面是成本低、純軟件實現(xiàn),,因此在企業(yè)中的應(yīng)用很廣泛,。 七層負(fù)載均衡七層指應(yīng)用層,是計算機網(wǎng)絡(luò)模型的最上層,,因此能得到請求最為詳細的信息,,比如 HTTP 請求頭等。 可以根據(jù)域名或主機 IP 端口接收請求,,并通過應(yīng)用層信息(請求頭,、Cookie 等)靈活地轉(zhuǎn)發(fā)請求,比如將手機端用戶轉(zhuǎn)發(fā)到服務(wù)器 A,、桌面端用戶轉(zhuǎn)發(fā)到服務(wù)器 B 等,。 這種方式實現(xiàn)成本最低,,也最為靈活,,因此也是我們應(yīng)用開發(fā)人員最常用的了。 實現(xiàn)方式多種多樣,,比如主流的 Nginx,、HAProxy 都可以,寫個配置基本就能轉(zhuǎn)發(fā)請求了,,大部分情況下性能也夠用了,。 再提一下所屬于這層的 DNS 負(fù)載均衡 ,基于 DNS 域名解析服務(wù),,可以將同一個域名解析為不同的 IP 地址,,從而讓用戶訪問到不同服務(wù)器上的項目。 這種方式實現(xiàn)起來不難,,但轉(zhuǎn)發(fā)邏輯不夠靈活,,而且 DNS 存在緩存,不利于修改,。 除了上面講到的這些,,負(fù)載均衡還有很多學(xué)問,比如負(fù)載均衡算法(比如常用的靜態(tài)輪詢,、動態(tài)連接數(shù)等),、高可用等,這些大家自行了解和實踐下就好了,,具體場景具體分析,。 |
|