掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
單服務(wù)器無論如何優(yōu)化,無論采用多好的硬件,總會(huì)有一個(gè)性能天花板,當(dāng)單服務(wù)器的性能無法滿足業(yè)務(wù)需求時(shí),就需要設(shè)計(jì)高性能集群來提升系統(tǒng)整體的處理性能。

成都創(chuàng)新互聯(lián)專注服務(wù)器托管服務(wù)十載,提供服務(wù)器租用、虛擬空間、申請域名、云服務(wù)器、云主機(jī)租用、成都IDC機(jī)房托管、建站等服務(wù)
高性能集群的本質(zhì)很簡單,通過增加更多的服務(wù)器來提升系統(tǒng)整體的計(jì)算能力。由于計(jì)算本身存在一個(gè)特點(diǎn):同樣的輸入數(shù)據(jù)和邏輯,無論在哪臺(tái)服務(wù)器上執(zhí)行,都應(yīng)該得到相同的輸出。因此高性能集群設(shè)計(jì)的復(fù)雜度主要體現(xiàn)在任務(wù)分配這部分,需要設(shè)計(jì)合理的任務(wù)分配策略,將計(jì)算任務(wù)分配到多臺(tái)服務(wù)器上執(zhí)行。
高性能集群的復(fù)雜性主要體現(xiàn)在需要增加一個(gè)任務(wù)分配器,以及為任務(wù)選擇一個(gè)合適的任務(wù)分配算法。對于任務(wù)分配器,現(xiàn)在更流行的通用叫法是“負(fù)載均衡器”。但這個(gè)名稱有一定的誤導(dǎo)性,會(huì)讓人潛意識(shí)里認(rèn)為任務(wù)分配的目的是要保持各個(gè)計(jì)算單元的負(fù)載達(dá)到均衡狀態(tài)。
而實(shí)際上任務(wù)分配并不只是考慮計(jì)算單元的負(fù)載均衡,不同的任務(wù)分配算法目標(biāo)是不一樣的,有的基于負(fù)載考慮,有的基于性能(吞吐量、響應(yīng)時(shí)間)考慮,有的基于業(yè)務(wù)考慮??紤]到“負(fù)載均衡”已經(jīng)成為了事實(shí)上的標(biāo)準(zhǔn)術(shù)語,這里我也用“負(fù)載均衡”來代替“任務(wù)分配”,但請你時(shí)刻記住,負(fù)載均衡不只是為了計(jì)算單元的負(fù)載達(dá)到均衡狀態(tài)。
常見的負(fù)載均衡系統(tǒng)包括3種:DNS負(fù)載均衡、硬件負(fù)載均衡和軟件負(fù)載均衡。
DNS是最簡單也是最常見的負(fù)載均衡方式,一般用來實(shí)現(xiàn)地理級(jí)別的均衡。例如,北方的用戶訪問北京的機(jī)房,南方的用戶訪問深圳的機(jī)房。DNS負(fù)載均衡的本質(zhì)是DNS解析同一個(gè)域名可以返回不同的IP地址。例如,同樣是www.baidu.com,北方用戶解析后獲取的地址是61.135.165.224(這是北京機(jī)房的IP),南方用戶解析后獲取的地址是14.215.177.38(這是深圳機(jī)房的IP)。
下面是DNS負(fù)載均衡的簡單示意圖:
DNS負(fù)載均衡實(shí)現(xiàn)簡單、成本低,但也存在粒度太粗、負(fù)載均衡算法少等缺點(diǎn)。仔細(xì)分析一下優(yōu)缺點(diǎn),其優(yōu)點(diǎn)有:
缺點(diǎn)有:
針對DNS負(fù)載均衡的一些缺點(diǎn),對于時(shí)延和故障敏感的業(yè)務(wù),有一些公司自己實(shí)現(xiàn)了HTTP-DNS的功能,即使用HTTP協(xié)議實(shí)現(xiàn)一個(gè)私有的DNS系統(tǒng)。這樣的方案和通用的DNS優(yōu)缺點(diǎn)正好相反。
硬件負(fù)載均衡是通過單獨(dú)的硬件設(shè)備來實(shí)現(xiàn)負(fù)載均衡功能,這類設(shè)備和路由器、交換機(jī)類似,可以理解為一個(gè)用于負(fù)載均衡的基礎(chǔ)網(wǎng)絡(luò)設(shè)備。
目前業(yè)界典型的硬件負(fù)載均衡設(shè)備有兩款:F5和A10。這類設(shè)備性能強(qiáng)勁、功能強(qiáng)大,但價(jià)格都不便宜,一般只有“土豪”公司才會(huì)考慮使用此類設(shè)備。普通業(yè)務(wù)量級(jí)的公司一是負(fù)擔(dān)不起,二是業(yè)務(wù)量沒那么大,用這些設(shè)備也是浪費(fèi)。
硬件負(fù)載均衡的優(yōu)點(diǎn)是:
硬件負(fù)載均衡的缺點(diǎn)是:
軟件負(fù)載均衡通過負(fù)載均衡軟件來實(shí)現(xiàn)負(fù)載均衡功能,常見的有Nginx和LVS,其中Nginx是軟件的7層負(fù)載均衡,LVS是Linux內(nèi)核的4層負(fù)載均衡。4層和7層的區(qū)別就在于協(xié)議和靈活性,Nginx支持HTTP、E-mail協(xié)議;而LVS是4層負(fù)載均衡,和協(xié)議無關(guān),幾乎所有應(yīng)用都可以做,例如,聊天、數(shù)據(jù)庫等。
軟件和硬件的最主要區(qū)別就在于性能,硬件負(fù)載均衡性能遠(yuǎn)遠(yuǎn)高于軟件負(fù)載均衡性能。Ngxin的性能是萬級(jí),一般的Linux服務(wù)器上裝一個(gè)Nginx大概能到5萬/秒;LVS的性能是十萬級(jí),據(jù)說可達(dá)到80萬/秒;而F5性能是百萬級(jí),從200萬/秒到800萬/秒都有(數(shù)據(jù)來源網(wǎng)絡(luò),僅供參考,如需采用請根據(jù)實(shí)際業(yè)務(wù)場景進(jìn)行性能測試)。
當(dāng)然,軟件負(fù)載均衡的最大優(yōu)勢是便宜,一臺(tái)普通的Linux服務(wù)器批發(fā)價(jià)大概就是1萬元左右,相比F5的價(jià)格,那就是自行車和寶馬的區(qū)別了。
除了使用開源的系統(tǒng)進(jìn)行負(fù)載均衡,如果業(yè)務(wù)比較特殊,也可能基于開源系統(tǒng)進(jìn)行定制(例如,Nginx插件),甚至進(jìn)行自研。
軟件負(fù)載均衡的優(yōu)點(diǎn):
其實(shí)下面的缺點(diǎn)都是和硬件負(fù)載均衡相比的,并不是說軟件負(fù)載均衡沒法用。
前面我們介紹了3種常見的負(fù)載均衡機(jī)制:DNS負(fù)載均衡、硬件負(fù)載均衡、軟件負(fù)載均衡,每種方式都有一些優(yōu)缺點(diǎn),但并不意味著在實(shí)際應(yīng)用中只能基于它們的優(yōu)缺點(diǎn)進(jìn)行非此即彼的選擇,反而是基于它們的優(yōu)缺點(diǎn)進(jìn)行組合使用。具體來說,組合的基本原則為:
以一個(gè)假想的實(shí)例來說明一下這種組合方式,如下圖所示。
整個(gè)系統(tǒng)的負(fù)載均衡分為三層。
需要注意的是,上圖只是一個(gè)示例,一般在大型業(yè)務(wù)場景下才會(huì)這樣用,如果業(yè)務(wù)量沒這么大,則沒有必要嚴(yán)格照搬這套架構(gòu)。例如,一個(gè)大學(xué)的論壇,完全可以不需要DNS負(fù)載均衡,也不需要F5設(shè)備,只需要用Nginx作為一個(gè)簡單的負(fù)載均衡就足夠了。
負(fù)載均衡算法數(shù)量較多,而且可以根據(jù)一些業(yè)務(wù)特性進(jìn)行定制開發(fā),拋開細(xì)節(jié)上的差異,根據(jù)算法期望達(dá)到的目的,大體上可以分為下面幾類。
接下來介紹一下負(fù)載均衡算法以及它們的優(yōu)缺點(diǎn)。
負(fù)載均衡系統(tǒng)收到請求后,按照順序輪流分配到服務(wù)器上。
輪詢是最簡單的一個(gè)策略,無須關(guān)注服務(wù)器本身的狀態(tài),例如:
需要注意的是負(fù)載均衡系統(tǒng)無須關(guān)注“服務(wù)器本身狀態(tài)”,這里的關(guān)鍵詞是“本身”。也就是說,只要服務(wù)器在運(yùn)行,運(yùn)行狀態(tài)是不關(guān)注的。但如果服務(wù)器直接宕機(jī)了,或者服務(wù)器和負(fù)載均衡系統(tǒng)斷連了,這時(shí)負(fù)載均衡系統(tǒng)是能夠感知的,也需要做出相應(yīng)的處理。例如,將服務(wù)器從可分配服務(wù)器列表中刪除,否則就會(huì)出現(xiàn)服務(wù)器已經(jīng)宕機(jī)了,任務(wù)還不斷地分配給它,這明顯是不合理的。
總而言之,“簡單”是輪詢算法的優(yōu)點(diǎn),也是它的缺點(diǎn)。
負(fù)載均衡系統(tǒng)根據(jù)服務(wù)器權(quán)重進(jìn)行任務(wù)分配,這里的權(quán)重一般是根據(jù)硬件配置進(jìn)行靜態(tài)配置的,采用動(dòng)態(tài)的方式計(jì)算會(huì)更加契合業(yè)務(wù),但復(fù)雜度也會(huì)更高。
加權(quán)輪詢是輪詢的一種特殊形式,其主要目的就是為了解決不同服務(wù)器處理能力有差異的問題。例如,集群中有新的機(jī)器是32核的,老的機(jī)器是16核的,那么理論上我們可以假設(shè)新機(jī)器的處理能力是老機(jī)器的2倍,負(fù)載均衡系統(tǒng)就可以按照2:1的比例分配更多的任務(wù)給新機(jī)器,從而充分利用新機(jī)器的性能。
加權(quán)輪詢解決了輪詢算法中無法根據(jù)服務(wù)器的配置差異進(jìn)行任務(wù)分配的問題,但同樣存在無法根據(jù)服務(wù)器的狀態(tài)差異進(jìn)行任務(wù)分配的問題。
負(fù)載均衡系統(tǒng)將任務(wù)分配給當(dāng)前負(fù)載最低的服務(wù)器,這里的負(fù)載根據(jù)不同的任務(wù)類型和業(yè)務(wù)場景,可以用不同的指標(biāo)來衡量。例如:
負(fù)載最低優(yōu)先的算法解決了輪詢算法中無法感知服務(wù)器狀態(tài)的問題,由此帶來的代價(jià)是復(fù)雜度要增加很多。例如:
負(fù)載最低優(yōu)先算法基本上能夠比較完美地解決輪詢算法的缺點(diǎn),因?yàn)椴捎眠@種算法后,負(fù)載均衡系統(tǒng)需要感知服務(wù)器當(dāng)前的運(yùn)行狀態(tài)。當(dāng)然,其代價(jià)是復(fù)雜度大幅上升。通俗來講,輪詢可能是5行代碼就能實(shí)現(xiàn)的算法,而負(fù)載最低優(yōu)先算法可能要1000行才能實(shí)現(xiàn),甚至需要負(fù)載均衡系統(tǒng)和服務(wù)器都要開發(fā)代碼。
負(fù)載最低優(yōu)先算法如果本身沒有設(shè)計(jì)好,或者不適合業(yè)務(wù)的運(yùn)行特點(diǎn),算法本身就可能成為性能的瓶頸,或者引發(fā)很多莫名其妙的問題。所以負(fù)載最低優(yōu)先算法雖然效果看起來很美好,但實(shí)際上真正應(yīng)用的場景反而沒有輪詢(包括加權(quán)輪詢)那么多。
負(fù)載最低優(yōu)先類算法是站在服務(wù)器的角度來進(jìn)行分配的,而性能最優(yōu)優(yōu)先類算法則是站在客戶端的角度來進(jìn)行分配的,優(yōu)先將任務(wù)分配給處理速度最快的服務(wù)器,通過這種方式達(dá)到最快響應(yīng)客戶端的目的。
和負(fù)載最低優(yōu)先類算法類似,性能最優(yōu)優(yōu)先類算法本質(zhì)上也是感知了服務(wù)器的狀態(tài),只是通過響應(yīng)時(shí)間這個(gè)外部標(biāo)準(zhǔn)來衡量服務(wù)器狀態(tài)而已。因此性能最優(yōu)優(yōu)先類算法存在的問題和負(fù)載最低優(yōu)先類算法類似,復(fù)雜度都很高,主要體現(xiàn)在:
負(fù)載均衡系統(tǒng)根據(jù)任務(wù)中的某些關(guān)鍵信息進(jìn)行Hash運(yùn)算,將相同Hash值的請求分配到同一臺(tái)服務(wù)器上,這樣做的目的主要是為了滿足特定的業(yè)務(wù)需求。例如:
將來源于同一個(gè)源IP地址的任務(wù)分配給同一個(gè)服務(wù)器進(jìn)行處理,適合于存在事務(wù)、會(huì)話的業(yè)務(wù)。例如,當(dāng)我們通過瀏覽器登錄網(wǎng)上銀行時(shí),會(huì)生成一個(gè)會(huì)話信息,這個(gè)會(huì)話是臨時(shí)的,關(guān)閉瀏覽器后就失效。網(wǎng)上銀行后臺(tái)無須持久化會(huì)話信息,只需要在某臺(tái)服務(wù)器上臨時(shí)保存這個(gè)會(huì)話就可以了,但需要保證用戶在會(huì)話存在期間,每次都能訪問到同一個(gè)服務(wù)器,這種業(yè)務(wù)場景就可以用源地址Hash來實(shí)現(xiàn)。
將某個(gè)ID標(biāo)識(shí)的業(yè)務(wù)分配到同一個(gè)服務(wù)器中進(jìn)行處理,這里的ID一般是臨時(shí)性數(shù)據(jù)的ID(如session id)。例如,上述的網(wǎng)上銀行登錄的例子,用session id hash同樣可以實(shí)現(xiàn)同一個(gè)會(huì)話期間,用戶每次都是訪問到同一臺(tái)服務(wù)器的目的。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流