nginx負(fù)載均衡中RR和ip_hash策略分析.doc_第1頁
nginx負(fù)載均衡中RR和ip_hash策略分析.doc_第2頁
nginx負(fù)載均衡中RR和ip_hash策略分析.doc_第3頁
nginx負(fù)載均衡中RR和ip_hash策略分析.doc_第4頁
nginx負(fù)載均衡中RR和ip_hash策略分析.doc_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

nginx負(fù)載均衡中RR和ip_hash策略分析1、 nginx的upstream目前支持負(fù)載均衡方式的分配1、RR(默認(rèn))每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除。例如: upstream tomcats server 07:88 max_fails=3 fail_timeout=3s weight=9; server 32:80 max_fails=3 fail_timeout=3s weight=9; 2、ip_hash每個(gè)請(qǐng)求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題。例如: upstream tomcats ip_hash; server 07:88; server 32:80; 3、fair(第三方)按后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。4、url_hash(第三方)按訪問url的hash結(jié)果來分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。下面,我們針對(duì)RR和ip_hash的負(fù)載均衡策略進(jìn)行分析。因?yàn)槊恳环N負(fù)載均衡策略都是在upstream的框架中使用,upstream控制總的工作流程,負(fù)載均衡策略僅僅提供選擇或釋放server的函數(shù),所以,我們?cè)诜治鯮R時(shí)結(jié)合upstream(ngx_http_upstream.c)。 ip_hash大部分內(nèi)容與RR一致,只是重新實(shí)現(xiàn)RR中的ngx_http_upstream_get_peer函數(shù)。2、 RR策略RR機(jī)制分為三個(gè)部分:初始化upstream,獲取一個(gè)可用的后臺(tái)服務(wù)器和釋放后臺(tái)服務(wù)器。以下分析以此配置為例:upstream backend server A max_fails=3 fail_timeout=4s weight=9; server B max_fails=3 fail_timeout=4s weight=9; server C max_fails=3 fail_timeout=4s weight=9; server D backup; Server E backup;2.1 初始化upstream 對(duì)于例子中的upstream backend來說,首先初始化各個(gè)server, 除了設(shè)置IP和端口號(hào)外,還要設(shè)置如下置weight,current_weight,max_fails和fail_timeout。其中max_fails和fail_timeout 這兩個(gè)參數(shù)是組合使用的,表示server 如果失敗次數(shù)達(dá)到max_fails 次,并保持fail_timeout秒之內(nèi)該服務(wù)器不能被訪問。 對(duì)于serverA來說,設(shè)置如下serverA.weight =9;serverA.current_weight = 9; /初始值等于配置文件中的weight.serverA.max_fails = 3;serverA.fail_timeout = 4; 接著,創(chuàng)建兩個(gè)server類型(在下文介紹中,server類型等同于peer類型,都是用來指明存儲(chǔ)upstream中一個(gè)server的信息)的數(shù)組,peers和backup,分別存儲(chǔ)正常的輪循server和備用server. 并且,按照數(shù)組中各個(gè)server的weight值的大小,由高到底排序。 本例中,在數(shù)組peers中存儲(chǔ)serverA、serverB和 serverC, 并記錄server的總個(gè)數(shù)peers-number=3; 在數(shù)組backup中存儲(chǔ)serverD和 serverE, 并記錄server的總個(gè)數(shù)backup-number=2; 最后,設(shè)置upstream中各個(gè)變量的值。 rrp 表示當(dāng)前要輪循的server數(shù)組,初始設(shè)置為Upstream-rrp = peers. tries 表示嘗試的次數(shù),當(dāng)嘗試一個(gè)server失敗后,tries的值就會(huì)減一。初始設(shè)置為peers的總個(gè)數(shù)。 Next 表示當(dāng)peers數(shù)組中server都失敗,不能提供服務(wù)了,通過upstream-next,切換到back數(shù)組中選擇server.2.2 具體的RR策略2.2.1 ) 選擇最初要輪循的server, 把它給rrp-current變量,跳轉(zhuǎn)到2.2.2 當(dāng)一個(gè)客戶端請(qǐng)求到達(dá)nginx后,nginx就會(huì)在upstream的peers 數(shù)組中挑選一個(gè)current_weight最大的server作為當(dāng)前請(qǐng)求最初要輪循的server. 在peers數(shù)組中選取current_weight最大的算法如下: 由于peers數(shù)組中的server是按照weight值的大小排序好的。 它是通過雙重循環(huán),滿足下列條件后, if (peern.current_weight * 1000 / peeri.current_weight peern.weight * 1000 / peeri.weight) /peeri.current_weight不為0 并且該server的current_weight大于0,就選擇sever n, 把編號(hào)n賦給rrp-current,成功返回。 如果當(dāng)upstream的peers 數(shù)組中的所有server的current_weight都為零時(shí),立即無條件地把所有server的current_weight設(shè)置為初始值。for (i = 0; i number; i+) peeri.current_weight = peeri.weight; 然后,當(dāng)所有server的current_weight設(shè)置為初始值后,重新查找peers 數(shù)組中current_weight最大的server。把編號(hào)賦給rrp-current,返回。2.2.2 判斷當(dāng)前rrp-current所指向的server是否有效,如果無效,就會(huì)讓rrp-current+,判斷peers數(shù)組中下一個(gè)server,是否有效。至到找到有效的server為止. 跳轉(zhuǎn)到2.2.3; 否則跳轉(zhuǎn)到 判斷server 是否有效的方法是: 1)如果server的失敗次數(shù)(peers-peeri.fails)沒有達(dá)到了max_fails所設(shè)置的最大失敗次數(shù),則該server是有效的。 2)如果server已經(jīng)達(dá)到了max_fails所設(shè)置的最大失敗次數(shù),從這一時(shí)刻開始算起,在fail_timeout 所設(shè)置的時(shí)間段內(nèi), server是無效的。 3)當(dāng)server的失敗次數(shù)(peers-peeri.fails)為最大的失敗次數(shù),當(dāng)距離現(xiàn)在的時(shí)間超過了fail_timeout 所設(shè)置的時(shí)間段, 則令peers-peeri.fails =0,使得該server重新有效。 如果peers中所有的server都是無效的; 就會(huì)嘗試去backup的數(shù)組中找一個(gè)有效的server, 如果找到, 跳轉(zhuǎn)到2.2.3; 如果仍然找不到,表示此時(shí)upstream中無server可以使用。就會(huì)清空所有peers數(shù)組中所有的失敗次數(shù)的記錄,使所有server都變成了有效。這樣做的目的是為了防止下次再有請(qǐng)求訪問時(shí),仍找不到一個(gè)有效的server.for (i = 0; i number; i+) peers-peeri.fails = 0;并返回錯(cuò)誤碼給nginx, nginx得到此錯(cuò)誤碼后,就不再向后臺(tái)server發(fā)請(qǐng)求,而是在nginx的錯(cuò)誤日志中輸出“no live upstreams while connecting to upstream”的記錄(這就是no live產(chǎn)生的真正原因),并直接返回給請(qǐng)求的客戶端一個(gè)502的錯(cuò)誤。2.2.3 當(dāng)找到一個(gè)有效的server后,令該server的current_weight減一,然后,nginx就會(huì)嘗試與該server建立連接。如果成功建立連接,跳轉(zhuǎn)到2.2.4; 否則 跳轉(zhuǎn)到 如果nginx在等待了proxy_connect_timeout所設(shè)置的時(shí)間段后(如3秒),連接仍然沒有建立成功,nginx就在錯(cuò)誤日志中輸出“upstream timed out (110: Connection timed out) while connecting to upstream”的記錄(這就是 timed out(連接超時(shí))產(chǎn)生的真正原因). 2.2.3 .2 接著,讓當(dāng)前server的失敗次數(shù)加一(peer-fails+; 如果該server最大失敗次達(dá)到最大失敗次數(shù),將在一段時(shí)間內(nèi)該server是無效的),如果當(dāng)前nginx與后臺(tái)服務(wù)器的嘗試次數(shù)沒有達(dá)到upstream中server的總個(gè)數(shù),重新跳轉(zhuǎn)到2.2.2, 輪循下一個(gè)server, 繼續(xù)嘗試。如果達(dá)到最大嘗試次數(shù),就表示uptream中所有的server都嘗試了一遍,沒有server可以提供服務(wù),返回一個(gè)504的錯(cuò)誤給客戶端。 2.2.4 當(dāng)nginx與server建立連接成功后,如果server響應(yīng)請(qǐng)求,把處理結(jié)果返回給nginx,跳轉(zhuǎn)到2.2.5; 否則跳轉(zhuǎn)到 如果nginx在等待了proxy_read_timeout所設(shè)置的時(shí)間段后(如30秒),server仍然沒有對(duì)nginx發(fā)送來的請(qǐng)求作出響應(yīng),nginx就在錯(cuò)誤日志中輸出“upstream timed out (110: Connection timed out) while reading response header from upstream”的記錄(這就是 timed out(讀超時(shí))產(chǎn)生的真正原因). 接著,讓當(dāng)前server的失敗次數(shù)加一(peer-fails+; 如果該server最大失敗次達(dá)到最大失敗次數(shù),將在一段時(shí)間內(nèi)該server是無效的),如果當(dāng)前nginx與后臺(tái)服務(wù)器的嘗試次數(shù)沒有達(dá)到upstream中server的總個(gè)數(shù),重新跳轉(zhuǎn)到2.2.2, 輪循下一個(gè)server, 繼續(xù)嘗試。如果達(dá)到最大嘗試次數(shù),就表示uptream中所有的server都嘗試了一遍,沒有server可以提供服務(wù),返回一個(gè)504的錯(cuò)誤給客戶端。2.2.5 Nginx收到后臺(tái)server傳送過來的結(jié)果后,就會(huì)返回給客戶端一個(gè)200的正確結(jié)果。這樣,nginx作為反向代理的功能也就完成了。3、 Ip_hash策略3.1 Ip_hash和RR 的策略有兩點(diǎn)不同在于:當(dāng)一個(gè)客戶請(qǐng)求到nginx后,1) nginx如何選擇一個(gè)最初的server, 2) 以及當(dāng)前選擇的server不能提供服務(wù)時(shí),如何選擇下一個(gè)server.3.2 RR策略回顧從第二部分對(duì)RR的介紹中,我們知道:當(dāng)一個(gè)客戶請(qǐng)求到達(dá)后,RR策略是從upstream的所有server中選擇一個(gè)當(dāng)前權(quán)重(current_weight)最大的server作為最初的server. upstream的所有server是按照由高到低排序后存儲(chǔ)在一個(gè)peers數(shù)組中,當(dāng)最初選擇的server不能提供服務(wù)時(shí),RR策略就會(huì)選擇peers數(shù)組中的下一個(gè)元素作為當(dāng)前server,繼續(xù)嘗試, 如果已經(jīng)達(dá)到數(shù)組的最大元素,就會(huì)從第一個(gè)元素再輪循。3.3 ip_hash策略介紹 在ip_hash策略中,它選擇最初的server的方法是根據(jù)請(qǐng)求客戶端的IP計(jì)算出一個(gè)哈希值,再根據(jù)哈希值選擇后臺(tái)的服務(wù)器。1)由IP計(jì)算哈希值的算法如下, 其中公式中hash初始值為89,iphp-addri表示客戶端的IP, 通過三次哈希計(jì)算得出一個(gè)IP的哈希值:for (i = 0; i addri) % 6271;2) 在選擇下一個(gè)server時(shí),ip_hash的選擇策略是這樣的: 它在上一次哈希值的基礎(chǔ)上,再次哈希,就會(huì)得到一個(gè)全新的哈希值,再根據(jù)哈希值選擇另外一個(gè)后臺(tái)的服務(wù)器。哈希算法仍然是for (i = 0; i addri) % 6271; 在這種ip_hash策略,如果一個(gè)后臺(tái)服務(wù)器不能提供提服務(wù)(連接超時(shí)或讀超時(shí)),該服務(wù)器的失敗次數(shù)就會(huì)加一,當(dāng)一個(gè)服務(wù)器的失敗次數(shù)達(dá)到max_fails所設(shè)置的值,就會(huì)在fail_timeout所設(shè)置的時(shí)間段內(nèi)不能對(duì)外提供服務(wù),這點(diǎn)和RR是一致的。 如果當(dāng)前server不能提供服務(wù),就會(huì)根據(jù)當(dāng)前的哈希值再

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論