nginx如何實(shí)現(xiàn)負(fù)載均衡

? ? ? ? 大家好,我是IT修真院北京分院第31期的學(xué)員,一枚正直純潔善良的JAVA程序員。今天給大家分享一下,修真院官網(wǎng)JAVA任務(wù)6的深度思考——nginx如何實(shí)現(xiàn)負(fù)載均衡.

1.背景介紹

什么是NGINX

Nginx (engine x) 是一個(gè)高性能的HTTP和反向代理服務(wù)器,也是一個(gè)IMAP/POP3/SMTP服務(wù)器。Nginx是由伊戈?duì)枴べ愃饕驗(yàn)槎砹_斯訪問(wèn)量第二的Rambler.ru站點(diǎn)(俄文:Рамблер)開(kāi)發(fā)的,第一個(gè)公開(kāi)版本0.1.0發(fā)布于2004年10月4日。其將源代碼以類BSD許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。

2011年6月1日,nginx 1.0.4發(fā)布。Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好,中國(guó)大陸使用nginx網(wǎng)站用戶有:百度、京東、新浪、網(wǎng)易、騰訊、淘寶等

負(fù)載均衡的目的

負(fù)載均衡的目的是為了解決單個(gè)節(jié)點(diǎn)壓力過(guò)大,造成Web服務(wù)響應(yīng)過(guò)慢,嚴(yán)重的情況下導(dǎo)致服務(wù)癱瘓,無(wú)法正常提供服務(wù)。春節(jié)期間在12306網(wǎng)站上買(mǎi)過(guò)火車票的朋友應(yīng)該深有體會(huì),有時(shí)查詢一張火車票都會(huì)很慢,甚至整個(gè)網(wǎng)頁(yè)都卡住不動(dòng)了。通常一個(gè)訪問(wèn)量非常大的Web網(wǎng)站(比如:淘寶、京東、12306等),由于一個(gè)Web服務(wù)同時(shí)能處理的用戶并發(fā)請(qǐng)求的數(shù)量有限,同時(shí)還有機(jī)器故障的情況,所以一個(gè)Web站點(diǎn)通常會(huì)在N臺(tái)機(jī)器上各部署一套同樣的程序。當(dāng)某一個(gè)服務(wù)掛掉的時(shí)候,還有第二個(gè)、第三個(gè)、第N個(gè)服務(wù)。。。繼續(xù)為用戶提供服務(wù),給用戶的感覺(jué),你的服務(wù)還在正常的運(yùn)行!

在這些提供同樣服務(wù)的機(jī)器當(dāng)中,在硬件配置方面也各不一樣,這樣就會(huì)存在部份機(jī)器性能非常好,能快速計(jì)算并響應(yīng)用戶的請(qǐng)求,另外一部份機(jī)器可能配置差點(diǎn),響應(yīng)用戶的請(qǐng)求的時(shí)間會(huì)長(zhǎng)一些。這就需要我們思考一個(gè)問(wèn)題?如果有一個(gè)服務(wù)正在同時(shí)處理1000個(gè)用戶的請(qǐng)求,這個(gè)服務(wù)的上限可能最多能同時(shí)處理1000個(gè)用戶的請(qǐng)求,這時(shí)它已經(jīng)很忙了,如果此時(shí)又有一個(gè)新請(qǐng)求過(guò)來(lái),我們?nèi)匀话堰@個(gè)請(qǐng)求分配給這臺(tái)機(jī)器,這時(shí)候這個(gè)請(qǐng)求就只能在干等著,等這個(gè)服務(wù)處理完那些請(qǐng)求后,再繼續(xù)處理它。

這樣在瀏覽器中的反應(yīng)就像12306我們?cè)诖汗?jié)買(mǎi)票一樣,卡在那不動(dòng)了,讓用戶眼巴巴的干著急。而能提供同樣服務(wù)的其它機(jī)器,這時(shí)確很空閑。這樣不僅是對(duì)服務(wù)器資源的浪費(fèi),也充分發(fā)揮不出弄多臺(tái)服務(wù)器裝同一個(gè)服務(wù)的最高價(jià)值。我們通常稱對(duì)某一臺(tái)機(jī)器的訪問(wèn)量稱為負(fù)載量,如何將一個(gè)用戶的請(qǐng)求,合理的分配到一臺(tái)能快速響應(yīng)用戶請(qǐng)求的服務(wù)器上,我們就需要用到一些負(fù)載策略。

負(fù)載均衡,將用戶的所有HTTP請(qǐng)求均衡的分配到每一臺(tái)機(jī)器上,充分發(fā)揮所有機(jī)器的性能,提高服務(wù)的質(zhì)量和用戶體驗(yàn)。負(fù)載均衡可以通過(guò)負(fù)載均衡網(wǎng)絡(luò)硬件設(shè)備和Web服務(wù)器軟件來(lái)實(shí)現(xiàn),前者設(shè)備成本較高,小公司通常負(fù)擔(dān)不起,所以后者一般是我們的首選。實(shí)現(xiàn)負(fù)載均衡常用的Web服務(wù)器軟件有Nginx、LVS、Apache等,本文主要介紹Nginx的如何實(shí)現(xiàn)負(fù)載均衡.

2.知識(shí)剖析

NGINX的UPSTREAM模塊

Nginx負(fù)載均衡是通過(guò)upstream模塊來(lái)實(shí)現(xiàn)的.upstream模塊,使nginx跨越單機(jī)的限制,完成網(wǎng)絡(luò)數(shù)據(jù)的接收、處理和轉(zhuǎn)發(fā)。

數(shù)據(jù)轉(zhuǎn)發(fā)功能,為nginx提供了跨越單機(jī)的橫向處理能力,使nginx擺脫只能為終端節(jié)點(diǎn)提供單一功能的限制,而使它具備了網(wǎng)路應(yīng)用級(jí)別的拆分、封裝和整合的戰(zhàn)略功能。

從本質(zhì)上說(shuō),upstream屬于handler,只是他不產(chǎn)生自己的內(nèi)容,而是通過(guò)請(qǐng)求后端服務(wù)器得到內(nèi)容,所以才稱為upstream(上游)。請(qǐng)求并取得響應(yīng)內(nèi)容的整個(gè)過(guò)程已經(jīng)被封裝到nginx內(nèi)部,所以u(píng)pstream模塊只需要開(kāi)發(fā)若干回調(diào)函數(shù),完成構(gòu)造請(qǐng)求和解析響應(yīng)等具體的工作。

NGINX負(fù)載均衡模塊

負(fù)載均衡模塊用于從”upstream”指令定義的后端主機(jī)列表中選取一臺(tái)主機(jī)。nginx先使用負(fù)載均衡模塊找到一臺(tái)主機(jī),再使用upstream模塊實(shí)現(xiàn)與這臺(tái)主機(jī)的交互。

負(fù)載均衡模塊的配置區(qū)集中在upstream{}塊中。負(fù)載均衡模塊的回調(diào)函數(shù)體系是以init_upstream為起點(diǎn),經(jīng)歷init_peer,最終到達(dá)peer.get和peer.free。其中init_peer負(fù)責(zé)建立每個(gè)請(qǐng)求使用的server列表,peer.get負(fù)責(zé)從server列表中選擇某個(gè)server(一般是不重復(fù)選擇),而peer.free負(fù)責(zé)server釋放前的資源釋放工作。

NGINX的負(fù)載均衡策略

一,內(nèi)置負(fù)載策略:

輪循(默認(rèn)):Nginx根據(jù)請(qǐng)求次數(shù),將每個(gè)請(qǐng)求均勻分配到每臺(tái)服務(wù)器

最少連接:將請(qǐng)求分配給連接數(shù)最少的服務(wù)器。Nginx會(huì)統(tǒng)計(jì)哪些服務(wù)器的連接數(shù)最少。

IP Hash :綁定處理請(qǐng)求的服務(wù)器。第一次請(qǐng)求時(shí),根據(jù)該客戶端的IP算出一個(gè)HASH值,將請(qǐng)求分配到集群中的某一臺(tái)服務(wù)器上。后面該客戶端的所有請(qǐng)求,都將通過(guò)HASH算法,找到之前處理這臺(tái)客戶端請(qǐng)求的服務(wù)器,然后將請(qǐng)求交給它來(lái)處理。

二,第三方負(fù)載策略

1>fair:

根據(jù)服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配,即負(fù)載壓力小的優(yōu)先會(huì)分配。 由于fair模塊是第三方提供的,所以在編譯nginx源碼的時(shí)候,需要將fair添加到nginx模塊中。

2>url_hash

按請(qǐng)求url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,服務(wù)器做緩存時(shí)比較有效。 1.7.2版本以后,url_hash模塊已經(jīng)集成到了nginx源碼當(dāng)中,不需要單獨(dú)安裝。之前的版本仍需要單獨(dú)安裝.

NGINX加權(quán)輪詢算法

Nginx的加權(quán)輪詢算法將保持選擇的平滑性,即盡可能均勻的分?jǐn)偣?jié)點(diǎn),節(jié)點(diǎn)分配不再是連續(xù)的。

1、概念解釋,每個(gè)節(jié)點(diǎn)有三個(gè)權(quán)重變量,分別是: (1) weight: 約定權(quán)重,即在配置文件或初始化時(shí)約定好的每個(gè)節(jié)點(diǎn)的權(quán)重。 (2) effectiveWeight: 有效權(quán)重,初始化為weight。 在通訊過(guò)程中發(fā)現(xiàn)節(jié)點(diǎn)異常,則-1; 之后再次選取本節(jié)點(diǎn),調(diào)用成功一次則+1,直達(dá)恢復(fù)到weight; 此變量的作用主要是節(jié)點(diǎn)異常,降低其權(quán)重。 (3) currentWeight: 節(jié)點(diǎn)當(dāng)前權(quán)重,初始化為0。

2、算法邏輯: (1) 輪詢所有節(jié)點(diǎn),計(jì)算當(dāng)前狀態(tài)下所有節(jié)點(diǎn)的effectiveWeight之和totalWeight; (2) currentWeight = currentWeight + effectiveWeight; 選出所有節(jié)點(diǎn)中currentWeight中最大的一個(gè)節(jié)點(diǎn)作為選中節(jié)點(diǎn); (3) 選中節(jié)點(diǎn)的currentWeight = currentWeight - totalWeight; 基于以上算法,我們看一個(gè)例子: 這時(shí)有三個(gè)節(jié)點(diǎn){a, b, c},權(quán)重分別是{a=4, b=2, c=1},共7次請(qǐng)求,初始currentWeight值為{0, 0, 0},每次分配后的結(jié)果如下:

3.編碼實(shí)戰(zhàn)

4.常見(jiàn)問(wèn)題

一,壓力過(guò)大

壓力過(guò)大的例子:有一次,某技術(shù)哥為某金融機(jī)構(gòu)部署負(fù)載均衡。在沒(méi)部署之前,調(diào)試沒(méi)有任何問(wèn)題,也通過(guò)了壓力測(cè)試,而且能達(dá)到3000/秒的用戶數(shù)。但是就在技術(shù)哥上了負(fù)載產(chǎn)品后,一開(kāi)始還能達(dá)到 4000/秒左右,轉(zhuǎn)眼卻如洪水傾瀉,用戶數(shù)急速降低,甚至還不如沒(méi)上負(fù)載前。 “本來(lái)我們網(wǎng)絡(luò)沒(méi)有這么慢,現(xiàn)在加了負(fù)載均衡卻變慢了,是不是你們負(fù)載產(chǎn)品有問(wèn)題啊?”用戶提出了尖銳的質(zhì) 疑。經(jīng)過(guò)仔細(xì)觀察發(fā)現(xiàn):壓力下,負(fù)載工作很正常,CPU也很低。但沒(méi)上負(fù)載前,后臺(tái)數(shù)據(jù)庫(kù)的CPU工作在85%左 右,加了負(fù)載均衡之后,數(shù)據(jù)庫(kù)反而瞬間達(dá)到了百分之九十多,然后就居高不下了…… 問(wèn)題原因究竟在哪兒?

細(xì)究之下發(fā)現(xiàn),原來(lái)這個(gè)機(jī)構(gòu)的數(shù)據(jù)庫(kù)平臺(tái)在設(shè)計(jì)之初,沒(méi)有考慮到以后需要在負(fù)載的情況下應(yīng)用,現(xiàn)在經(jīng)過(guò)負(fù)載,給數(shù)據(jù)庫(kù)的壓力增加了,數(shù)據(jù)庫(kù)中某個(gè)表查詢過(guò)慢,反而導(dǎo)致了整個(gè)數(shù)據(jù)庫(kù)查詢效率降低,進(jìn)而影響了整個(gè)系統(tǒng)。所以,綜上案例可以發(fā)現(xiàn),負(fù)載設(shè)備和客戶的應(yīng)用業(yè)務(wù)是息息相關(guān)的,要想成功的部署負(fù)載均衡,并使其發(fā)揮預(yù)期的效果,除了要了解客戶需求,更要應(yīng)地制宜,知己知彼才能讓負(fù)載均衡產(chǎn)品發(fā)揮出它該有的作用。

5.參考文獻(xiàn)

http://network.51cto.com/art/201507/485289.htm

https://blog.csdn.net/xyang81/article/details/51702900

https://blog.csdn.net/u014513883/article/details/48550709

http://tengine.taobao.org/book/chapter_05.html

6.更多討論

鳴謝

感謝觀看,如有出錯(cuò),懇請(qǐng)指正


今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~

????????技能樹(shù).IT修真院

????????“我們相信人人都可以成為一個(gè)工程師,現(xiàn)在開(kāi)始,找個(gè)師兄,帶你入門(mén),掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷茫”。

????????這里是技能樹(shù).IT修真院,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化,成長(zhǎng)可見(jiàn)化,師兄1對(duì)1免費(fèi)指導(dǎo)。快來(lái)與我一起學(xué)習(xí)吧~

我的邀請(qǐng)碼:17742750,或者你可以直接點(diǎn)擊此鏈接:http://www.jnshu.com/login/1/17742750

來(lái)源:簡(jiǎn)書(shū)

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,553評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,620評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,416評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,940評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,170評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,597評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評(píng)論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,029評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,407評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,663評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,403評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,746評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容