nginx如何實現(xiàn)負載均衡

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

1.背景介紹

什么是NGINX

Nginx (engine x) 是一個高性能的HTTP和反向代理服務(wù)器,也是一個IMAP/POP3/SMTP服務(wù)器揍移。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發(fā)的次和,第一個公開版本0.1.0發(fā)布于2004年10月4日。其將源代碼以類BSD許可證的形式發(fā)布羊精,因它的穩(wěn)定性斯够、豐富的功能集囚玫、示例配置文件和低系統(tǒng)資源的消耗而聞名喧锦。

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

負載均衡的目的

負載均衡的目的是為了解決單個節(jié)點壓力過大,造成Web服務(wù)響應(yīng)過慢畸陡,嚴重的情況下導(dǎo)致服務(wù)癱瘓鹰溜,無法正常提供服務(wù)。春節(jié)期間在12306網(wǎng)站上買過火車票的朋友應(yīng)該深有體會丁恭,有時查詢一張火車票都會很慢曹动,甚至整個網(wǎng)頁都卡住不動了。通常一個訪問量非常大的Web網(wǎng)站(比如:淘寶牲览、京東墓陈、12306等),由于一個Web服務(wù)同時能處理的用戶并發(fā)請求的數(shù)量有限第献,同時還有機器故障的情況贡必,所以一個Web站點通常會在N臺機器上各部署一套同樣的程序。當某一個服務(wù)掛掉的時候痊硕,還有第二個赊级、第三個、第N個服務(wù)岔绸。理逊。橡伞。繼續(xù)為用戶提供服務(wù),給用戶的感覺晋被,你的服務(wù)還在正常的運行兑徘!

在這些提供同樣服務(wù)的機器當中,在硬件配置方面也各不一樣羡洛,這樣就會存在部份機器性能非常好挂脑,能快速計算并響應(yīng)用戶的請求,另外一部份機器可能配置差點欲侮,響應(yīng)用戶的請求的時間會長一些崭闲。這就需要我們思考一個問題?如果有一個服務(wù)正在同時處理1000個用戶的請求威蕉,這個服務(wù)的上限可能最多能同時處理1000個用戶的請求刁俭,這時它已經(jīng)很忙了,如果此時又有一個新請求過來韧涨,我們?nèi)匀话堰@個請求分配給這臺機器牍戚,這時候這個請求就只能在干等著,等這個服務(wù)處理完那些請求后虑粥,再繼續(xù)處理它如孝。

這樣在瀏覽器中的反應(yīng)就像12306我們在春節(jié)買票一樣,卡在那不動了娩贷,讓用戶眼巴巴的干著急第晰。而能提供同樣服務(wù)的其它機器,這時確很空閑育勺。這樣不僅是對服務(wù)器資源的浪費但荤,也充分發(fā)揮不出弄多臺服務(wù)器裝同一個服務(wù)的最高價值。我們通常稱對某一臺機器的訪問量稱為負載量涧至,如何將一個用戶的請求腹躁,合理的分配到一臺能快速響應(yīng)用戶請求的服務(wù)器上,我們就需要用到一些負載策略南蓬。

負載均衡纺非,將用戶的所有HTTP請求均衡的分配到每一臺機器上,充分發(fā)揮所有機器的性能赘方,提高服務(wù)的質(zhì)量和用戶體驗烧颖。負載均衡可以通過負載均衡網(wǎng)絡(luò)硬件設(shè)備和Web服務(wù)器軟件來實現(xiàn),前者設(shè)備成本較高窄陡,小公司通常負擔不起炕淮,所以后者一般是我們的首選。實現(xiàn)負載均衡常用的Web服務(wù)器軟件有Nginx跳夭、LVS涂圆、Apache等们镜,本文主要介紹Nginx的如何實現(xiàn)負載均衡.

2.知識剖析

NGINX的UPSTREAM模塊

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

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

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

NGINX負載均衡模塊

負載均衡模塊用于從”upstream”指令定義的后端主機列表中選取一臺主機。nginx先使用負載均衡模塊找到一臺主機蠢莺,再使用upstream模塊實現(xiàn)與這臺主機的交互寒匙。

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

NGINX的負載均衡策略

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

輪循(默認):Nginx根據(jù)請求次數(shù)蚯窥,將每個請求均勻分配到每臺服務(wù)器

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

IP Hash :綁定處理請求的服務(wù)器拦赠。第一次請求時巍沙,根據(jù)該客戶端的IP算出一個HASH值,將請求分配到集群中的某一臺服務(wù)器上荷鼠。后面該客戶端的所有請求句携,都將通過HASH算法,找到之前處理這臺客戶端請求的服務(wù)器允乐,然后將請求交給它來處理矮嫉。

二,第三方負載策略

1>fair:

根據(jù)服務(wù)器的響應(yīng)時間來分配請求牡辽,響應(yīng)時間短的優(yōu)先分配,即負載壓力小的優(yōu)先會分配敞临。 由于fair模塊是第三方提供的态辛,所以在編譯nginx源碼的時候,需要將fair添加到nginx模塊中挺尿。

2>url_hash

按請求url的hash結(jié)果來分配請求奏黑,使每個url定向到同一個后端服務(wù)器,服務(wù)器做緩存時比較有效编矾。 1.7.2版本以后熟史,url_hash模塊已經(jīng)集成到了nginx源碼當中,不需要單獨安裝窄俏。之前的版本仍需要單獨安裝.

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

Nginx的加權(quán)輪詢算法將保持選擇的平滑性蹂匹,即盡可能均勻的分攤節(jié)點,節(jié)點分配不再是連續(xù)的凹蜈。

1限寞、概念解釋,每個節(jié)點有三個權(quán)重變量仰坦,分別是: (1) weight: 約定權(quán)重履植,即在配置文件或初始化時約定好的每個節(jié)點的權(quán)重。 (2) effectiveWeight: 有效權(quán)重悄晃,初始化為weight玫霎。 在通訊過程中發(fā)現(xiàn)節(jié)點異常,則-1妈橄; 之后再次選取本節(jié)點庶近,調(diào)用成功一次則+1,直達恢復(fù)到weight眷蚓; 此變量的作用主要是節(jié)點異常鼻种,降低其權(quán)重。 (3) currentWeight: 節(jié)點當前權(quán)重溪椎,初始化為0普舆。

2、算法邏輯: (1) 輪詢所有節(jié)點校读,計算當前狀態(tài)下所有節(jié)點的effectiveWeight之和totalWeight沼侣; (2) currentWeight = currentWeight + effectiveWeight; 選出所有節(jié)點中currentWeight中最大的一個節(jié)點作為選中節(jié)點; (3) 選中節(jié)點的currentWeight = currentWeight - totalWeight歉秫; 基于以上算法蛾洛,我們看一個例子: 這時有三個節(jié)點{a, b, c},權(quán)重分別是{a=4, b=2, c=1},共7次請求轧膘,初始currentWeight值為{0, 0, 0}钞螟,每次分配后的結(jié)果如下:

3.編碼實戰(zhàn)

4.常見問題

一,壓力過大

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

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

5.參考文獻

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.更多討論

鳴謝

感謝觀看,如有出錯,懇請指正


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

????????技能樹.IT修真院

????????“我們相信人人都可以成為一個工程師暖混,現(xiàn)在開始,找個師兄翁授,帶你入門儒恋,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷们”诫尽。

????????這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線炬守,學(xué)習(xí)透明化牧嫉,成長可見化,師兄1對1免費指導(dǎo)减途『ㄔ澹快來與我一起學(xué)習(xí)吧~

我的邀請碼:17742750,或者你可以直接點擊此鏈接:http://www.jnshu.com/login/1/17742750

來源:簡書

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末税产,一起剝皮案震驚了整個濱河市怕轿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辟拷,老刑警劉巖撞羽,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衫冻,居然都是意外死亡诀紊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門隅俘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邻奠,“玉大人,你說我怎么就攤上這事为居÷笛纾” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵颜骤,是天一觀的道長唧喉。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么八孝? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任董朝,我火速辦了婚禮,結(jié)果婚禮上干跛,老公的妹妹穿的比我還像新娘子姜。我一直安慰自己,他們只是感情好楼入,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布哥捕。 她就那樣靜靜地躺著,像睡著了一般嘉熊。 火紅的嫁衣襯著肌膚如雪遥赚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天阐肤,我揣著相機與錄音凫佛,去河邊找鬼。 笑死孕惜,一個胖子當著我的面吹牛愧薛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衫画,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼毫炉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了削罩?” 一聲冷哼從身側(cè)響起瞄勾,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲸郊,沒想到半個月后丰榴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡秆撮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了换况。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片职辨。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戈二,靈堂內(nèi)的尸體忽然破棺而出舒裤,到底是詐尸還是另有隱情,我是刑警寧澤觉吭,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布腾供,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伴鳖。R本人自食惡果不足惜节值,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榜聂。 院中可真熱鬧搞疗,春花似錦、人聲如沸须肆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌汇。三九已至幢炸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拒贱,已是汗流浹背宛徊。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柜思,地道東北人岩调。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像赡盘,于是被迫代替她去往敵國和親号枕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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