? ? ? ? 大家好,我是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)注明出處。