負(fù)載均衡的初學(xué)者指南
當(dāng)個(gè)人電腦剛開始發(fā)展的時(shí)候,一個(gè)家庭可能只有一臺(tái)(或更少)的電腦。孩子們白天玩電腦游戲,家長們晚上在業(yè)務(wù)支撐系統(tǒng)上做會(huì)計(jì)、編程,或者漫游。然而,想象一下今天一個(gè)只有一臺(tái)電腦的家庭,你可以預(yù)想到這樣會(huì)產(chǎn)生什么樣的沖突。每個(gè)人都想使用電腦,而只有一副鍵盤和鼠標(biāo)。
隨著計(jì)算機(jī)變得越來越普遍,IT 行業(yè)或多或少也出現(xiàn)了同樣的情況。對(duì)服務(wù)和服務(wù)器的需求已經(jīng)增長到了會(huì)因?yàn)橛昧窟^大而停機(jī)的程度。幸運(yùn)的是,我們現(xiàn)在有了負(fù)載均衡的概念來幫助我們處理需求。
負(fù)載均衡是什么?
負(fù)載均衡是一個(gè)通用術(shù)語,指的是為了確保高效分配所管理的資源而做的事情。對(duì)于 Web 服務(wù)器的系統(tǒng)管理員來說,負(fù)載均衡通常意味著確保 Web 服務(wù)器軟件(例如 ??Nginx??)配置了足夠的工作節(jié)點(diǎn)來處理激增的訪客。換言之,如果一個(gè)網(wǎng)站突然變得非常受歡迎,其訪問者在幾分鐘內(nèi)增加了四倍,那么運(yùn)行服務(wù)器的軟件必須能夠響應(yīng)每個(gè)訪問者,并不能讓任何訪問者發(fā)現(xiàn)服務(wù)質(zhì)量下降。對(duì)于簡單的網(wǎng)站,這就像修改一行配置選項(xiàng)一樣簡單,但對(duì)于具有動(dòng)態(tài)內(nèi)容的復(fù)雜站點(diǎn),每個(gè)用戶都有多個(gè)數(shù)據(jù)庫查詢,這可能是一個(gè)嚴(yán)重的問題。
這個(gè)問題本應(yīng)隨著云計(jì)算的發(fā)展而解決,但當(dāng) Web 應(yīng)用程序遇到意外激增時(shí),無法擴(kuò)展也不是不可能。
在進(jìn)行負(fù)載均衡時(shí),需要記住的重要一點(diǎn)是,高效地分配資源并不一定意味著平均地分配資源。并非所有任務(wù)都在任何時(shí)候都需要所有的可用資源。一個(gè)智能的負(fù)載均衡策略僅在需要資源時(shí)才為用戶和任務(wù)提供資源。這通常是應(yīng)用程序開發(fā)人員的領(lǐng)域,而不是 IT 基礎(chǔ)架構(gòu)的責(zé)任。異步應(yīng)用程序?qū)τ诖_保離開計(jì)算機(jī)休息的用戶不占用服務(wù)器上的寶貴資源至關(guān)重要。
負(fù)載均衡是怎么工作的?
負(fù)載均衡通過在多個(gè)計(jì)算節(jié)點(diǎn)上分配工作負(fù)載來避免瓶頸。這些節(jié)點(diǎn)可能是數(shù)據(jù)中心中的物理服務(wù)器、云環(huán)境中的容器、用于邊緣計(jì)算而戰(zhàn)略性放置的服務(wù)器、復(fù)雜應(yīng)用程序框架中的獨(dú)立 Java 虛擬機(jī)(JVM),或在單個(gè) Linux 服務(wù)器上運(yùn)行的守護(hù)進(jìn)程。
這個(gè)想法是把一個(gè)大問題分成幾個(gè)小任務(wù),并把每個(gè)任務(wù)分配給一臺(tái)專用計(jì)算機(jī)。例如,對(duì)于一個(gè)要求用戶登錄的網(wǎng)站,該網(wǎng)站可能托管在服務(wù)器 A 上,而登錄頁面和所有隨附的身份驗(yàn)證查詢都托管在服務(wù)器 B 上。這樣,新用戶登錄帳戶時(shí)就不會(huì)占用其它使用該站點(diǎn)的用戶的資源。
云計(jì)算負(fù)載均衡
云計(jì)算使用 ??容器??,因此通常沒有單獨(dú)的物理服務(wù)器來處理不同的任務(wù)(實(shí)際上,有許多單獨(dú)的服務(wù)器,但它們被聚集在一起作為一個(gè)計(jì)算“大腦”)。相反,“容器莢pod” 是由幾個(gè)容器創(chuàng)建的。當(dāng)一個(gè)容器莢由于其用戶或任務(wù)負(fù)載而開始耗盡資源時(shí),會(huì)生成一個(gè)相同的容器莢。容器莢共享存儲(chǔ)和網(wǎng)絡(luò)資源,每個(gè)容器莢在創(chuàng)建時(shí)被分配給一個(gè)計(jì)算節(jié)點(diǎn)。可以根據(jù)負(fù)載需要?jiǎng)?chuàng)建或銷毀容器莢,這樣無論有多少用戶,用戶都可以體驗(yàn)到一致的服務(wù)質(zhì)量。
邊緣計(jì)算
邊緣計(jì)算 在負(fù)載均衡時(shí)考慮到了現(xiàn)實(shí)世界。云計(jì)算自然是一個(gè)分布式系統(tǒng),但實(shí)際上,云計(jì)算的節(jié)點(diǎn)通常集中在幾個(gè)數(shù)據(jù)中心。用戶離運(yùn)行云計(jì)算的數(shù)據(jù)中心越遠(yuǎn),他們?yōu)楂@得最佳服務(wù)所必須克服的物理障礙就越多。即使有光纖連接和適當(dāng)?shù)呢?fù)載均衡,位于 3000 英里外的服務(wù)器的響應(yīng)時(shí)間也可能比僅僅 300 英里外的響應(yīng)時(shí)間長。
邊緣計(jì)算將計(jì)算節(jié)點(diǎn)帶到云計(jì)算的“邊緣”,試圖彌合地理鴻溝,為云計(jì)算形成一種衛(wèi)星網(wǎng)絡(luò),因此它也在良好的負(fù)載均衡工作中發(fā)揮了作用。
什么是負(fù)載均衡算法?
有許多負(fù)載均衡策略,它們的復(fù)雜性取決于所涉及的技術(shù)和需求。負(fù)載均衡不必復(fù)雜,而且從一開始就負(fù)載均衡很重要,即使在使用 ??Kubernetes??? 和 ??Keepalived?? 這樣的專用軟件時(shí)也是如此。
當(dāng)你可以設(shè)計(jì)應(yīng)用程序,自己為它采取簡單的預(yù)防措施時(shí),不要依賴容器來均衡負(fù)載。如果你從一開始就將應(yīng)用程序設(shè)計(jì)為模塊化和臨時(shí)性的,那么你將受益于通過巧妙的網(wǎng)絡(luò)設(shè)計(jì)、容器編排和其他未來技術(shù)帶來的負(fù)載均衡機(jī)會(huì)。
可以指導(dǎo)應(yīng)用程序開發(fā)人員或網(wǎng)絡(luò)工程師工作的一些流行算法包括:
- 按順序?qū)⑷蝿?wù)分配給服務(wù)器(這通常被稱為輪詢調(diào)度)。
- 將任務(wù)分配給當(dāng)前最不繁忙的服務(wù)器。
- 將任務(wù)分配給具有響應(yīng)最快的服務(wù)器。
- 隨機(jī)分配任務(wù)。
舉個(gè)例子,在分配特別復(fù)雜的任務(wù)時(shí),可以組合或加權(quán)這些原則以分配到組中最強(qiáng)大的服務(wù)器。通常使用 ??編排??,這樣管理員就不必為負(fù)載均衡尋找完美的算法或策略,盡管有時(shí)需要由管理員選擇使用哪種負(fù)載均衡方案組合。
預(yù)料意料之外
負(fù)載均衡實(shí)際上并不是要確保在整個(gè)網(wǎng)絡(luò)中均勻使用所有資源。負(fù)載均衡實(shí)際上是確保即使發(fā)生意外情況也能提供可靠的用戶體驗(yàn)。良好的基礎(chǔ)設(shè)施可以承受計(jì)算機(jī)崩潰、應(yīng)用程序過載、網(wǎng)絡(luò)流量沖擊和用戶錯(cuò)誤。思考你的服務(wù)如何才能具有彈性,并從頭開始相應(yīng)地設(shè)計(jì)負(fù)載均衡策略。