自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析nginx負(fù)載均衡

開發(fā) 前端
對于一個大型網(wǎng)站來說,負(fù)載均衡是永恒的話題。隨著硬件技術(shù)的迅猛發(fā)展,越來越多的負(fù)載均衡硬件設(shè)備涌現(xiàn)出來,如F5 BIG-IP、Citrix NetScaler、Radware等等,雖然可以解決問題,但其高昂的價格卻往往令人望而卻步,因此負(fù)載均衡軟件仍然是大部分公司的不二之選。

摘要:對于一個大型網(wǎng)站來說,負(fù)載均衡是永恒的話題。隨著硬件技術(shù)的迅猛發(fā)展,越來越多的負(fù)載均衡硬件設(shè)備涌現(xiàn)出來,如F5 BIG-IP、Citrix NetScaler、Radware等等,雖然可以解決問題,但其高昂的價格卻往往令人望而卻步,因此負(fù)載均衡軟件仍然是大部分公司的不二之選。 nginx作為webserver的后起之秀,其優(yōu)秀的反向代理功能和靈活的負(fù)載均衡策略受到了業(yè)界廣泛的關(guān)注。本文將以工業(yè)生產(chǎn)為背景,從設(shè)計(jì)實(shí)現(xiàn)和具體應(yīng)用等方面詳細(xì)介紹nginx負(fù)載均衡策略。

1. 前言

隨著互聯(lián)網(wǎng)信息的爆炸性增長,負(fù)載均衡(load balance)已經(jīng)不再是一個很陌生的話題,顧名思義,負(fù)載均衡即是將負(fù)載分?jǐn)偟讲煌姆?wù)單元,既保證服務(wù)的可用性,又保證響應(yīng)足夠快,給用戶很好的體驗(yàn)。快速增長的訪問量和數(shù)據(jù)流量催生了各式各樣的負(fù)載均衡產(chǎn)品,很多專業(yè)的負(fù)載均衡硬件提供了很好的功能,但卻價格不菲,這使得負(fù)載均衡軟件大受歡迎,nginx就是其中的一個。

nginx***個公開版本發(fā)布于2004年,2011年發(fā)布了1.0版本。它的特點(diǎn)是穩(wěn)定性高、功能強(qiáng)大、資源消耗低,從其目前的市場占有而言,nginx大有與apache搶市場的勢頭。其中不得不提到的一個特性就是其負(fù)載均衡功能,這也成了很多公司選擇它的主要原因。本文將從源碼的角度介紹nginx的內(nèi)置負(fù)載均衡策略和擴(kuò)展負(fù)載均衡策略,以實(shí)際的工業(yè)生產(chǎn)為案例,對比各負(fù)載均衡策略,為nginx使用者提供參考。

2. 源碼剖析

nginx的負(fù)載均衡策略可以劃分為兩大類:內(nèi)置策略和擴(kuò)展策略。內(nèi)置策略包含加權(quán)輪詢和ip hash,在默認(rèn)情況下這兩種策略會編譯進(jìn)nginx內(nèi)核,只需在nginx配置中指明參數(shù)即可。擴(kuò)展策略有很多,如fair、通用hash、 consistent hash等,默認(rèn)不編譯進(jìn)nginx內(nèi)核。由于在nginx版本升級中負(fù)載均衡的代碼沒有本質(zhì)性的變化,因此下面將以nginx1.0.15穩(wěn)定版為例,從源碼角度分析各個策略。

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

輪詢的原理很簡單,首先我們介紹一下輪詢的基本流程。如下是處理一次請求的流程圖:

圖中有兩點(diǎn)需要注意,***,如果可以把加權(quán)輪詢算法分為先深搜索和先廣搜索,那么nginx采用的是先深搜索算法,即將首先將請求都分給高權(quán)重的機(jī)器,直到該機(jī)器的權(quán)值降到了比其他機(jī)器低,才開始將請求分給下一個高權(quán)重的機(jī)器;第二,當(dāng)所有后端機(jī)器都down掉時,nginx會立即將所有機(jī)器的標(biāo)志位清成初始狀態(tài),以避免造成所有的機(jī)器都處在timeout的狀態(tài),從而導(dǎo)致整個前端被夯住。

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

從變量命名中,我們就可以大致猜出其作用。其中,current_weight和weight的區(qū)別主要是前者為權(quán)重排序的值,隨著處理請求會動態(tài)的變化,后者是配置值,用于恢復(fù)初始狀態(tài)。

接下來看下輪詢的創(chuàng)建過程,代碼如下圖所示。

這里有個tried變量需要做些說明。tried中記錄了服務(wù)器當(dāng)前是否被嘗試連接過。他是一個位圖。如果服務(wù)器數(shù)量小于32,則只需在一個int中即可記錄下所有服務(wù)器狀態(tài)。如果服務(wù)器數(shù)量大于32,則需在內(nèi)存池中申請內(nèi)存來存儲。對該位圖數(shù)組的使用可參考如下代碼:

***是實(shí)際的策略代碼,邏輯很簡單,代碼實(shí)現(xiàn)也只有30行,直接上代碼。

2.2. ip hash

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

ip hash算法的核心實(shí)現(xiàn)如下圖:

從代碼中可以看出,hash值既與ip有關(guān)又與后端機(jī)器的數(shù)量有關(guān)。經(jīng)過測試,上述算法可以連續(xù)產(chǎn)生1045個互異的value,這是該算法的硬限制。對此nginx使用了保護(hù)機(jī)制,當(dāng)經(jīng)過20次hash仍然找不到可用的機(jī)器時,算法退化成輪詢。因此,從本質(zhì)上說,ip hash算法是一種變相的輪詢算法,如果兩個ip的初始hash值恰好相同,那么來自這兩個ip的請求將永遠(yuǎn)落在同一臺服務(wù)器上,這為均衡性埋下了很深的隱患。

2.3. fair

fair策略是擴(kuò)展策略,默認(rèn)不被編譯進(jìn)nginx內(nèi)核。其原理是根據(jù)后端服務(wù)器的響應(yīng)時間判斷負(fù)載情況,從中選出負(fù)載最輕的機(jī)器進(jìn)行分流。這種策略具有很強(qiáng)的自適應(yīng)性,但是實(shí)際的網(wǎng)絡(luò)環(huán)境往往不是那么簡單,因此要慎用。

2.4. 通用hash、一致性hash

這兩種也是擴(kuò)展策略,在具體的實(shí)現(xiàn)上有些差別,通用hash比較簡單,可以以nginx內(nèi)置的變量為key進(jìn)行hash,一致性hash采用了nginx內(nèi)置的一致性hash環(huán),可以支持memcache。

#p#

3. 對比測試

本測試主要為了對比各個策略的均衡性、一致性、容災(zāi)性等,從而分析出其中的差異性,并據(jù)此給出各自的適用場景。為了能夠全面、客觀的測試nginx 的負(fù)載均衡策略,我們采用了兩個測試工具、在不同場景下做測試,以此來降低環(huán)境對測試結(jié)果造成的影響。首先簡單介紹測試工具、測試網(wǎng)絡(luò)拓?fù)浜突镜臏y試流程。

3.1. 測試工具

3.1.1  easyABC

easyABC是公司內(nèi)部開發(fā)的性能測試工具,采用epool模型實(shí)現(xiàn),簡單易上手,可以模擬GET/POST請求,極限情況下可以提供上萬的壓力,在公司內(nèi)部得到了廣泛的使用。由于被測試對象為反向代理服務(wù)器,因此需要在其后端搭建樁服務(wù)器,這里用nginx作為樁webserver,提供最基本的靜態(tài)文件服務(wù)。

3.1.2  polygraph

polygraph是一款免費(fèi)的性能測試工具,以對緩存服務(wù)、代理、交換機(jī)等方面的測試見長。它有規(guī)范的配置語言PGL(Polygraph Language),為軟件提供了強(qiáng)大的靈活性。其工作原理如下圖所示:

polygraph提供client端和server端,將測試目標(biāo)nginx放在二者之間,三者之間的網(wǎng)絡(luò)交互均走h(yuǎn)ttp協(xié)議,只需配置 ip+port即可。client端可以配置虛擬robot的個數(shù)以及每個robot發(fā)請求的速率,并向代理服務(wù)器發(fā)起隨機(jī)的靜態(tài)文件請求,server 端將按照請求的url生成隨機(jī)大小的靜態(tài)文件做響應(yīng)。這也是選用這個測試軟件的一個主要原因:可以產(chǎn)生隨機(jī)的url作為nginx各種hash策略的key。

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

3.2. 測試環(huán)境

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

3.3. 測試方案

首先介紹下關(guān)鍵的測試指標(biāo):

均衡性:是否能夠?qū)⒄埱缶鶆虻陌l(fā)送給后端

一致性:同一個key的請求,是否能落到同一臺機(jī)器

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

以上述指標(biāo)為指導(dǎo),我們針對如下四個測試場景分別用easyABC和polygraph進(jìn)行測試:

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

場景2      server_4掛掉,其他正常;

場景3      server_3、server_4掛掉,其他正常;

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

上述四個場景將按照時間順序進(jìn)行,每個場景將建立在上一個場景基礎(chǔ)上,被測試對象無需做任何操作,以***程度模擬實(shí)際情況。另外,考慮到測試工具自身的特點(diǎn),在easyabc上的測試壓力在17000左右,polygraph上的測試壓力在4000左右。以上測試均保證被測試對象可以正常工作,且無任何notice級別以上(alert/error/warn)的日志出現(xiàn),在每個場景中記錄下server_*的qps用于***的策略分析。

3.4. 測試結(jié)果

表1和圖1是輪詢策略在兩種測試工具下的負(fù)載情況。對比在兩種測試工具下的測試結(jié)果會發(fā)現(xiàn),結(jié)果完全一致,因此可以排除測試工具的影響。從圖表中可以看出,輪詢策略對于均衡性和容災(zāi)性都可以做到很好的滿足。(點(diǎn)擊圖片查看大圖)

表2和圖2是fair策略在兩種測試工具下的負(fù)載情況。fair策略受環(huán)境影響非常大,在排除了測試工具的干擾之后,結(jié)果仍然有非常大的抖動。從直觀上講,這完全不滿足均衡性。但是從另一個角度出發(fā),恰恰是由于這種自適應(yīng)性確保了在復(fù)雜的網(wǎng)絡(luò)環(huán)境中能夠物盡所用。因此,在應(yīng)用到工業(yè)生產(chǎn)中之前,需要在具體的環(huán)境中做好測試工作。(點(diǎn)擊圖片查看大圖)

以下圖表是各種hash策略,所不同的僅僅是hash key或者是具體的算法實(shí)現(xiàn),因此一起做對比。實(shí)際測試中發(fā)現(xiàn),通用hash和一致性hash均存在一個問題:當(dāng)某臺后端的機(jī)器掛掉時,原有落到這臺機(jī)器上的流量會丟失,但是在ip hash中就不存在這樣的問題。正如上文中對ip hash源碼的分析,當(dāng)ip hash失效時,會退化為輪詢策略,因此不會有丟失流量的情況。從這個層面上說,ip hash也可以看成是輪詢的升級版。(點(diǎn)擊圖片查看大圖)

圖5為ip hash策略,ip hash是nginx內(nèi)置策略,可以看做是前兩種策略的特例:以來源ip為key。由于測試工具不便于模擬海量ip下的請求,因此這里截取線上實(shí)際的情況加以分析,如下圖所示:

圖5 ip hash策略

圖中前1/3使用輪詢策略,中間段使用ip hash策略,后1/3仍然是輪詢策略。可以明顯的看出,ip hash的均衡性存在著很大的問題。原因并不難分析,在實(shí)際的網(wǎng)絡(luò)環(huán)境中,有大量的高校出口路由器ip、企業(yè)出口路由器ip等網(wǎng)絡(luò)節(jié)點(diǎn),這些節(jié)點(diǎn)帶來的流量往往是普通用戶的成百上千倍,而ip hash策略恰恰是按照ip來劃分流量,因此造成上述后果也就自然而然了。

4. 總結(jié)與展望

通過實(shí)際的對比測試,我們對nginx各個負(fù)載均衡策略進(jìn)行了驗(yàn)證。下面從均衡性、一致性、容災(zāi)性以及適用場景等角度對比各種策略。(點(diǎn)擊圖片查看大圖)

以上從源碼和實(shí)際的測試數(shù)據(jù)角度分析說明了nginx負(fù)載均衡的策略,并給出了各種策略適合的應(yīng)用場景。通過本文的分析不難發(fā)現(xiàn),無論哪種策略都不是萬金油,在具體的場景下應(yīng)該選擇哪種策略一定程度上依賴于使用者對這些策略的熟悉程度。希望本文的分析和測試數(shù)據(jù)能夠?qū)ψx者有所幫助,更希望有越來越多、越來越好的負(fù)載均衡策略產(chǎn)出。

原文鏈接:http://stblog.baidu-tech.com/?p=2027

責(zé)任編輯:林師授 來源: 百度搜索研發(fā)部官方博客
相關(guān)推薦

2024-11-11 09:51:46

Nginx部署負(fù)載

2017-11-09 10:42:11

Nginx負(fù)載均衡策略

2013-04-22 11:29:14

Nginx

2019-07-09 15:10:02

Nginx反向代理負(fù)載均衡

2019-03-18 10:44:41

負(fù)載均衡DNSUDP

2024-11-14 09:10:13

消費(fèi)者RocketMQ負(fù)載均衡

2011-12-02 22:51:46

Nginx負(fù)載均衡

2010-05-07 12:23:23

nginx負(fù)載均衡

2011-01-07 11:14:17

Nginx負(fù)載均衡負(fù)載均衡

2014-07-28 11:37:49

NginxTomcat

2010-05-06 10:01:26

nginx負(fù)載均衡

2011-09-01 10:23:47

Nginx負(fù)載均衡器負(fù)載均衡

2010-03-25 18:52:15

Nginx負(fù)載均衡

2010-05-07 12:27:53

nginx負(fù)載均衡

2019-11-04 15:35:53

Nginx反向代理負(fù)載均衡

2019-06-24 15:58:53

TCPUDPNginx

2017-12-18 12:04:02

Nginx代理均衡

2012-11-06 16:51:29

nginx負(fù)載均衡

2019-09-18 10:39:08

負(fù)載均衡反向代理TCP

2020-07-28 15:10:34

Nginx反向代理負(fù)載均衡
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號