怎么解析Nginx負(fù)載均衡策略

這篇文章給大家分享的是有關(guān)怎么解析Nginx負(fù)載均衡策略的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

十年的上猶網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整上猶建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“上猶網(wǎng)站設(shè)計(jì)”,“上猶網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

1 前言

隨著網(wǎng)站負(fù)載的不斷增加,負(fù)載均衡(load  balance)已不是陌生話題。負(fù)載均衡是將流量負(fù)載分?jǐn)偟讲煌姆?wù)單元,保證服務(wù)器的高可用,保證響應(yīng)足夠快,給用戶良好的體驗(yàn)。

nginx***個(gè)公開(kāi)版發(fā)布于2004年。2011年發(fā)布了1.0版。它的特點(diǎn)是穩(wěn)定性高、功能強(qiáng)大、資源消耗低。從服務(wù)器市場(chǎng)占有率來(lái)看,nginx已有與Apache分庭抗禮勢(shì)頭。其中,不得不提到的特性就是其負(fù)載均衡功能,這也成了很多公司選擇它的主要原因。

我們將從源碼的角度介紹nginx的內(nèi)置負(fù)載均衡策略和擴(kuò)展負(fù)載均衡策略,以實(shí)際的工業(yè)生產(chǎn)為案例,對(duì)比各負(fù)載均衡策略,為nginx使用者提供一些參考。

怎么解析Nginx負(fù)載均衡策略

2. 源碼剖析

nginx的負(fù)載均衡策略可以劃分為兩大類:內(nèi)置策略和擴(kuò)展策略。

內(nèi)置策略包含加權(quán)輪詢和ip  hash,在默認(rèn)情況下這兩種策略會(huì)編譯進(jìn)nginx內(nèi)核,只需在nginx配置中指明參數(shù)即可。擴(kuò)展策略有很多,如fair、通用hash、consistent  hash等,默認(rèn)不編譯進(jìn)nginx內(nèi)核。

由于在nginx版本升級(jí)中負(fù)載均衡的代碼沒(méi)有本質(zhì)性的變化,因此下面將以nginx1.0.15穩(wěn)定版為例,從源碼角度分析各個(gè)策略。

2.1. 加權(quán)輪詢(weighted round robin)

輪詢的原理很簡(jiǎn)單,首先我們介紹一下輪詢的基本流程。如下是處理一次請(qǐng)求的流程圖:

怎么解析Nginx負(fù)載均衡策略

圖中有兩點(diǎn)需要注意:

***,如果可以把加權(quán)輪詢算法分為先深搜索和先廣搜索,那么nginx采用的是先深搜索算法,即將首先將請(qǐng)求都分給高權(quán)重的機(jī)器,直到該機(jī)器的權(quán)值降到了比其他機(jī)器低,才開(kāi)始將請(qǐng)求分給下一個(gè)高權(quán)重的機(jī)器。

第二,當(dāng)所有后端機(jī)器都down掉時(shí),nginx會(huì)立即將所有機(jī)器的標(biāo)志位清成初始狀態(tài),以避免造成所有的機(jī)器都處在timeout的狀態(tài),從而導(dǎo)致整個(gè)前端被夯住。

接下來(lái)看下源碼。nginx的目錄結(jié)構(gòu)很清晰,加權(quán)輪詢所在路徑為nginx-1.0.15/src/http/ngx_http_upstream_round_robin.[c|h],在源碼的基礎(chǔ)上,針對(duì)重要的、不易理解的地方我加了注釋。首先看下ngx_http_upstream_round_robin.h中的重要聲明:

怎么解析Nginx負(fù)載均衡策略

從變量命名中就可以大致猜出其作用。解釋一下current_weight和weight的區(qū)別,前者為權(quán)重排序的值,隨著處理請(qǐng)求會(huì)動(dòng)態(tài)的變化,后者則是配置值,用來(lái)恢復(fù)初始狀態(tài)。

接下我們來(lái)看下輪詢的創(chuàng)建過(guò)程。代碼如下圖:

怎么解析Nginx負(fù)載均衡策略

這里有個(gè)tried變量需要做些說(shuō)明:tried中記錄了服務(wù)器當(dāng)前是否被嘗試連接過(guò)。他是一個(gè)位圖。如果服務(wù)器數(shù)量小于32,則只需在一個(gè)int中即可記錄下所有服務(wù)器狀態(tài)。如果服務(wù)器數(shù)量大于32,則需在內(nèi)存池中申請(qǐng)內(nèi)存來(lái)存儲(chǔ)。

對(duì)該位圖數(shù)組的使用可參考如下代碼:

怎么解析Nginx負(fù)載均衡策略

***是實(shí)際的策略代碼,邏輯較簡(jiǎn)單,代碼實(shí)現(xiàn)也只有30行。來(lái)看代碼。

怎么解析Nginx負(fù)載均衡策略

2.2. ip hash策略

ip hash是nginx內(nèi)置的另一個(gè)負(fù)載均衡策略,流程和輪詢很類似,只是其中的算法和具體的策略有些變化。如下圖所示:

怎么解析Nginx負(fù)載均衡策略

ip hash算法的核心實(shí)現(xiàn)請(qǐng)看如下代碼:

怎么解析Nginx負(fù)載均衡策略

可以看到,hash值既與ip有關(guān)又與后端機(jī)器的數(shù)量有關(guān)。經(jīng)測(cè)試,上述算法可以連續(xù)產(chǎn)生1045個(gè)互異的value,這是此算法硬限制。nginx使用了保護(hù)機(jī)制,當(dāng)經(jīng)過(guò)20次hash仍然找不到可用的機(jī)器時(shí),算法退化成輪詢。

因此,從本質(zhì)上說(shuō),ip  hash算法是一種變相的輪詢算法,如果兩個(gè)ip的初始hash值恰好相同,那么來(lái)自這兩個(gè)ip的請(qǐng)求將永遠(yuǎn)落在同一臺(tái)服務(wù)器上,這為均衡性埋下了較深隱患。

2.3. fair

fair策略是擴(kuò)展策略,默認(rèn)不被編譯進(jìn)nginx內(nèi)核。它根據(jù)后端服務(wù)器的響應(yīng)時(shí)間判斷負(fù)載情況,從中選出負(fù)載最輕的機(jī)器進(jìn)行分流。

這種策略具有很強(qiáng)的自適應(yīng)性,但是實(shí)際的網(wǎng)絡(luò)環(huán)境往往不是那么簡(jiǎn)單,因此須慎用。

2.4.通用hash、一致性hash

通用hash和一致性hash也是種擴(kuò)展策略。通用hash可以以nginx內(nèi)置的變量為key進(jìn)行hash,一致性hash采用了nginx內(nèi)置的一致性hash環(huán),可支持memcache。

3 對(duì)比測(cè)試

了解了以上負(fù)載均衡策略,接下來(lái)我們來(lái)做一些測(cè)試。

主要是對(duì)比各個(gè)策略的均衡性、一致性、容災(zāi)性等,從而分析出其中的差異性,根據(jù)數(shù)據(jù)給出各自的適用場(chǎng)景。

為了能夠全面、客觀的測(cè)試nginx的負(fù)載均衡策略,我們采用兩個(gè)測(cè)試工具、在不同場(chǎng)景下做測(cè)試,以此來(lái)降低環(huán)境對(duì)測(cè)試結(jié)果造成的影響。

首先給大家介紹測(cè)試工具、測(cè)試網(wǎng)絡(luò)拓?fù)浜突局疁y(cè)試流程。

3.1 測(cè)試工具

3.1.1 easyABC

easyABC是百度內(nèi)部開(kāi)發(fā)的性能測(cè)試工具,培訓(xùn)采用epool模型實(shí)現(xiàn),簡(jiǎn)單易上手,可以模擬GET/POST請(qǐng)求,極限情況下可以提供上萬(wàn)的壓力,在團(tuán)隊(duì)內(nèi)部得到廣泛使用。

由于被測(cè)試對(duì)象為反向代理服務(wù)器,因此需要在其后端搭建樁服務(wù)器,這里用nginx作為樁Web Server,提供最基本的靜態(tài)文件服務(wù)。

3.1.2 polygraph

polygraph是一款免費(fèi)的性能測(cè)試工具,以對(duì)緩存服務(wù)、代理、交換機(jī)等方面的測(cè)試見(jiàn)長(zhǎng)。它有規(guī)范的配置語(yǔ)言PGL(Polygraph  Language),為軟件提供了強(qiáng)大的靈活性。其工作原理如下圖所示:
怎么解析Nginx負(fù)載均衡策略

polygraph提供Client端和Server端,將測(cè)試目標(biāo)nginx放在二者之間,三者之間的網(wǎng)絡(luò)交互均走h(yuǎn)ttp協(xié)議,只需配置ip+port即可。

Client端可以配置虛擬robot的個(gè)數(shù)以及每個(gè)robot發(fā)請(qǐng)求的速率,并向代理服務(wù)器發(fā)起隨機(jī)的靜態(tài)文件請(qǐng)求,Server端將按照請(qǐng)求的url生成隨機(jī)大小的靜態(tài)文件做響應(yīng)。

選用這個(gè)測(cè)試軟件的一個(gè)主要原因:可以產(chǎn)生隨機(jī)的url作為nginx各種hash策略key。

另外polygraph還提供了日志分析工具,功能比較豐富,感興趣的同學(xué)可以參考附錄材料。

3.2. 測(cè)試環(huán)境

本次測(cè)試運(yùn)行在5臺(tái)物理機(jī)。其中:被測(cè)對(duì)象單獨(dú)搭在一臺(tái)8核機(jī)器上,另外四臺(tái)4核機(jī)器分別搭建了easyABC、webserver樁和polygraph。如下圖所示:

怎么解析Nginx負(fù)載均衡策略

3.3. 測(cè)試方案

給各位介紹一下關(guān)鍵的測(cè)試指標(biāo):

均衡性:是否能夠?qū)⒄?qǐng)求均勻的發(fā)送給后端

一致性:同一個(gè)key的請(qǐng)求,是否能落到同一臺(tái)機(jī)器

容災(zāi)性:當(dāng)部分后端機(jī)器掛掉時(shí),是否能夠正常工作

以上述指標(biāo)為指導(dǎo),我們針對(duì)如下4個(gè)測(cè)試場(chǎng)景分別用easyABC和polygraph測(cè)試:

場(chǎng)景1 server_*均正常提供服務(wù);

場(chǎng)景2 server_4掛掉,其他正常;

場(chǎng)景3 server_3、server_4掛掉,其他正常;

場(chǎng)景4 server_*均恢復(fù)正常服務(wù)。

上述四個(gè)場(chǎng)景將按照時(shí)間順序進(jìn)行,每個(gè)場(chǎng)景將建立在上一個(gè)場(chǎng)景基礎(chǔ)上,被測(cè)試對(duì)象無(wú)需做任何操作,以***程度模擬實(shí)際情況。

另外,考慮到測(cè)試工具自身的特點(diǎn),在easyabc上的測(cè)試壓力在17000左右,polygraph上的測(cè)試壓力在4000左右。以上測(cè)試均保證被測(cè)試對(duì)象可以正常工作,且無(wú)任何notice級(jí)別以上(alert/error/warn)的日志出現(xiàn),在每個(gè)場(chǎng)景中記錄下server_*的qps用于***的策略分析。

3.4. 結(jié)果

對(duì)比在兩種測(cè)試工具下的測(cè)試結(jié)果會(huì)發(fā)現(xiàn),結(jié)果完全一致,因此可以排除測(cè)試工具的影響。表1和圖1是輪詢策略在兩種測(cè)試工具下的負(fù)載情況。

從圖表中可以看出,輪詢策略對(duì)于均衡性和容災(zāi)性都可以做到較好的滿足。

怎么解析Nginx負(fù)載均衡策略

怎么解析Nginx負(fù)載均衡策略

表2和圖2是fair策略在兩種測(cè)試工具下的負(fù)載情況。fair策略受環(huán)境影響非常大,在排除了測(cè)試工具的干擾之后,結(jié)果仍然有非常大的抖動(dòng)。

從直觀上講,這完全不滿足均衡性。但從另一個(gè)角度出發(fā),恰恰是由于這種自適應(yīng)性確保了在復(fù)雜的網(wǎng)絡(luò)環(huán)境中能夠物盡所用。因此,在應(yīng)用到工業(yè)生產(chǎn)中之前,需要在具體的環(huán)境中做好測(cè)試工作。

怎么解析Nginx負(fù)載均衡策略

怎么解析Nginx負(fù)載均衡策略

以下圖表是各種hash策略,所不同的僅僅是hash  key或者是具體的算法實(shí)現(xiàn),因此一起做對(duì)比。實(shí)際測(cè)試中發(fā)現(xiàn),通用hash和一致性hash均存在一個(gè)問(wèn)題:當(dāng)某臺(tái)后端的機(jī)器掛掉時(shí),原有落到這臺(tái)機(jī)器上的流量會(huì)丟失,但是在ip  hash中就不存在這樣的問(wèn)題。

正如上文中對(duì)ip hash源碼的分析,當(dāng)ip hash失效時(shí),會(huì)退化為輪詢策略,因此不會(huì)有丟失流量的情況。從這個(gè)層面上說(shuō),ip  hash也可以看成是輪詢的升級(jí)版。

怎么解析Nginx負(fù)載均衡策略

圖5為ip hash策略,ip hash是nginx內(nèi)置策略,可以看做是前兩種策略的特例:以來(lái)源IP為key。

由于測(cè)試工具不太擅于模擬海量IP下的請(qǐng)求,因此這里截取線上實(shí)際的情況加以分析。如下圖所示:

怎么解析Nginx負(fù)載均衡策略

圖5 IP Hash策略

圖中前1/3使用輪詢策略,中間段使用ip hash策略,后1/3仍然是輪詢策略??梢悦黠@的看出,ip hash的均衡性存在著很大的問(wèn)題。

原因并不難分析,在實(shí)際的網(wǎng)絡(luò)環(huán)境中,有大量的高校出口路由器ip、企業(yè)出口路由器ip等網(wǎng)絡(luò)節(jié)點(diǎn),這些節(jié)點(diǎn)帶來(lái)的流量往往是普通用戶的成百上千倍,而ip  hash策略恰恰是按照ip來(lái)劃分流量,因此造成上述后果也就自然而然了。

4 小結(jié)

通過(guò)實(shí)際的對(duì)比測(cè)試,我們對(duì)nginx各個(gè)負(fù)載均衡策略進(jìn)行了驗(yàn)證。下面從均衡性、一致性、容災(zāi)性以及適用場(chǎng)景等角度對(duì)比各種策略。如下圖示:

怎么解析Nginx負(fù)載均衡策略

我們從源碼和實(shí)際測(cè)試數(shù)據(jù)角度分析說(shuō)明了nginx負(fù)載均衡的策略,給出了各種策略適合的應(yīng)用場(chǎng)景。通過(guò)分析不難發(fā)現(xiàn),無(wú)論哪種策略都不是萬(wàn)金油,在具體場(chǎng)景下應(yīng)該選擇哪種策略一定程度上依賴于使用者對(duì)策略的熟悉程度。

感謝各位的閱讀!關(guān)于“怎么解析Nginx負(fù)載均衡策略”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)站名稱:怎么解析Nginx負(fù)載均衡策略
新聞來(lái)源:http://muchs.cn/article14/iehige.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、營(yíng)銷型網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)用戶體驗(yàn)、ChatGPT、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司