七年開發(fā)淺談Nginx負載均衡

一 特點

1.1 應(yīng)用情況

Nginx做為一個強大的Web服務(wù)器軟件召耘,具有高性能谢谦、高并發(fā)性和低內(nèi)存占用的特點亲铡。此外,其也能夠提供強大的反向代理功能竹挡。俄羅斯大約有超過20%的虛擬主機采用Nginx作為反向代理服務(wù)器,在國內(nèi)也有騰訊镀娶、新浪、網(wǎng)易等多家網(wǎng)站在使用Nginx作為反向代理服務(wù)器揪罕。據(jù)Netcraft統(tǒng)計梯码,世界上最繁忙的網(wǎng)站中有11.48%使用Nginx作為其服務(wù)器或者代理服務(wù)器宝泵。基于反向代理的功能轩娶,Nginx作為負載均衡主要有以下幾點理由:

高并發(fā)連接

內(nèi)存消耗少

配置文件非常簡單

成本低廉

支持Rewrite重寫規(guī)則

內(nèi)置的健康檢查功能

節(jié)省帶寬

穩(wěn)定性高

1.2 架構(gòu)

nginx在啟動后儿奶,會以daemon的方式在后臺運行,后臺進程包含一個master進程和多個worker進程鳄抒。工作進程以非特權(quán)用戶運行廓握。

master進程主要用來管理worker進程,包含:接收來自外界的信號嘁酿,向各worker進程發(fā)送信號隙券,監(jiān)控worker進程的運行狀態(tài),當(dāng)worker進程退出后(異常情況下)闹司,會自動重新啟動新的worker進程娱仔。

worker進程則是處理基本的網(wǎng)絡(luò)事件。多個worker進程之間是對等的游桩,他們同等競爭來自客戶端的請求牲迫,各進程互相之間是獨立的。一個請求借卧,只可能在一個worker進程中處理盹憎,一個worker進程,不可能處理其它進程的請求铐刘。

開發(fā)模型:epoll和kqueue陪每。

支持的事件機制:kqueue、epoll镰吵、rt signals檩禾、/dev/poll 、event ports疤祭、select以及poll盼产。

支持的kqueue特性包括EV_CLEAR、EV_DISABLE勺馆、NOTE_LOWAT戏售、EV_EOF,可用數(shù)據(jù)的數(shù)量草穆,錯誤代碼.

支持sendfile灌灾、sendfile64和sendfilev;文件AIO;DIRECTIO;支持Accept-filters和TCP_DEFER_ACCEP.

1.3 性能

Nginx的高并發(fā)续挟,官方測試支持5萬并發(fā)連接紧卒。實際生產(chǎn)環(huán)境能到2-3萬并發(fā)連接數(shù)。10000個非活躍的HTTP keep-alive 連接僅占用約2.5MB內(nèi)存诗祸。三萬并發(fā)連接下跑芳,10個Nginx進程,消耗內(nèi)存150M直颅。淘寶tengine團隊說測試結(jié)果是“24G內(nèi)存機器上博个,處理并發(fā)請求可達200萬”。

二 負載均衡

2.1 協(xié)議支持

Nginx工作在網(wǎng)絡(luò)的7層功偿,可以針對http應(yīng)用本身來做分流策略盆佣。支持七層HTTP、HTTPS協(xié)議的負載均衡械荷。對四層協(xié)議的支持需要第三方插件-yaoweibin的ngx_tcp_proxy_module實現(xiàn)了tcp upstream共耍。

此外,nginx本身也逐漸在完善對其他協(xié)議的支持:

nginx 1.4.0對Websocket和SPDY都做了正式的支持吨瞎。

nginx 1.6.0對SPDY 3.1的正式支持

nginx 1.10.0正式支持HTTP/2

目前痹兜,nginx最新穩(wěn)定版為1.10.2,主線開發(fā)版本已經(jīng)到了1.11.5颤诀。Tengine最新版本則繼承到了nginx的1.6.2版本字旭。

2.2 均衡策略

nginx的負載均衡策略可以劃分為兩大類:內(nèi)置策略和擴展策略。內(nèi)置策略包含加權(quán)輪詢和ip hash崖叫,在默認情況下這兩種策略會編譯進nginx內(nèi)核遗淳,只需在nginx配置中指明參數(shù)即可。擴展策略有很多心傀,如fair屈暗、通用hash、consistent hash等脂男,默認不編譯進nginx內(nèi)核恐锦。

①、加權(quán)輪詢(weighted round robin)

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

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

②柑土、ip hash

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

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

for(i = 0;i < 3;i++){

hash = (hash * 113 + iphp->addr[i]) % 6271;

}

p = hash % iphp->rrp.peers->number;

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

③蜓斧、fair

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

④施禾、通用hash脚线、一致性hash

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

⑤、session_sticky

此種策略就是一次會話內(nèi)的請求都會落到同一個結(jié)點上粤铭。在做分布式架構(gòu)時可以使用挖胃,但是當(dāng)一個結(jié)點掛掉時,會話信息同時也會丟失,如果使用session同步方案同步session信息到所有結(jié)點的話代價又會很高,慎重使用此方案酱鸭。nginx默認不支持此種策略吗垮。

2.2 配置示例

①、HTTP

upstream upstream_test{

server 192.168.0.1:8080;

server 192.168.0.2:8080;

#ip_hash;

keepalive 30;

## tengine config

#check interval=300 rise=10 fall=10 timeout=100 type=http port=80;

#check_http_send "GET / HTTP/1.0";

#check_http_expect_alive http_2xx http_3xx;

## tengine config

#session_sticky cookie=cookieTest mode=insert;

}

location / {

proxy_pass http://upstream_test;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

②凛辣、TCP - ngx_tcp_proxy_module

tcp {

upstream cluster {

# simple round-robin

server 192.168.0.1:8080;

server 192.168.0.2:8080;

check interval=3000 rise=2 fall=5 timeout=1000;

#check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;

#check interval=3000 rise=2 fall=5 timeout=1000 type=http;

#check_http_send "GET / HTTP/1.0";

#check_http_expect_alive http_2xx http_3xx;

}

server {

listen 8888;

proxy_pass cluster;

}

}

三 動態(tài)負載均衡

3.1 自身監(jiān)控

內(nèi)置了對后端服務(wù)器的健康檢查功能抱既。如果Nginx proxy后端的某臺服務(wù)器宕機了职烧,會把返回錯誤的請求重新提交到另一個節(jié)點扁誓,不會影響前端訪問。它沒有獨立的健康檢查模塊蚀之,而是使用業(yè)務(wù)請求作為健康檢查蝗敢,這省去了獨立健康檢查線程,這是好處足删。壞處是寿谴,當(dāng)業(yè)務(wù)復(fù)雜時,可能出現(xiàn)誤判失受,例如后端響應(yīng)超時讶泰,這可能是后端宕機,也可能是某個業(yè)務(wù)請求自身出現(xiàn)問題拂到,跟后端無關(guān)痪署。

3.2 可擴展性

Nginx屬于典型的微內(nèi)核設(shè)計,其內(nèi)核非常簡潔和優(yōu)雅兄旬,同時具有非常高的可擴展性狼犯。如下圖所示:

Nginx是純C語言的實現(xiàn),其可擴展性在于其模塊化的設(shè)計领铐。目前悯森,Nginx已經(jīng)有很多的第三方模塊,大大擴展了自身的功能绪撵。nginx_lua_module可以將Lua語言嵌入到Nginx配置中瓢姻,從而利用Lua極大增強了Nginx本身的編程能力,甚至可以不用配合其它腳本語言(如PHP或Python等)音诈,只靠Nginx本身就可以實現(xiàn)復(fù)雜業(yè)務(wù)的處理幻碱。

3.3 配置修改

nginx的配置架構(gòu)如下圖所示:

Nginx支持熱部署,幾乎可以做到7*24不間斷運行改艇,即使運行數(shù)個月也不需要重新啟動收班。能夠在不間斷服務(wù)的情況下,對軟件版本進行進行升級谒兄。Nginx的配置文件非常簡單摔桦,風(fēng)格跟程序一樣通俗易懂,能夠支持perl語法。使用nginx –s reload可以在運行時加載配置文件邻耕,便于運行時擴容/減容鸥咖。重新加載配置時,master進程發(fā)送命令給當(dāng)前正在運行的worker進程worker進程接到命令后會在處理完當(dāng)前任務(wù)后退出兄世。同時啼辣,master進程會啟動新的worker進程來接管工作。

四 優(yōu)勢和劣勢

4.1 優(yōu)勢

可以很好地進行http 的頭處理

對http協(xié)議以及https的良好支持

有足夠的第三方插件供使用

支持熱部署御滩,更改后端是平滑的

4.2 劣勢

缺少對session的支持

對四層tcp的支持不夠好

post請求寫文件系統(tǒng)鸥拧,造成500 error

缺乏主動的后端服務(wù)器健康監(jiān)測

默認的監(jiān)控界面統(tǒng)計信息不全

五 Tengine

Tengine是淘寶基于nginx開源代碼二次開發(fā)一款服務(wù)器軟件,在繼承了nginx的特性以外削解,提供了一些nginx商業(yè)版才有的功能富弦。基本上同步于nginx的更新氛驮,目前最新的版本已經(jīng)繼承了nginx 1.6.2穩(wěn)定版腕柜。

5.1 特性

tengine的特性包括但不限于:

更友好的運維信息顯示

動態(tài)模塊加載機制

自動根據(jù)CPU數(shù)目設(shè)置進程個數(shù)和綁定CPU親緣性

更方便的命令行參數(shù),如列出編譯的模塊列表矫废、支持的指令等

更加強大的負載均衡能力盏缤,包括一致性hash模塊、會話保持模塊蓖扑,還可以對后端的服務(wù)器進行主動健康檢查唉铜,根據(jù)服務(wù)器狀態(tài)自動上線下線

動態(tài)腳本語言Lua支持。擴展功能非常高效簡單

輸入過濾器機制支持赵誓。通過使用這種機制Web應(yīng)用防火墻的編寫更為方便

5.2 負載均衡

負載均衡方面打毛,Tengine主要有以下幾個特點,基本上彌補了nginx在負載均衡方面的欠缺:

支持一致性Hash模塊

會話保持模塊

對后端服務(wù)器的主動健康檢查俩功。

增加了請求體不緩存到磁盤的機制

Java高架構(gòu)師幻枉、分布式架構(gòu)、高可擴展诡蜓、高性能熬甫、高并發(fā)、性能優(yōu)化蔓罚、Spring boot椿肩、Redis、ActiveMQ豺谈、Nginx郑象、Mycat、Netty茬末、Jvm大型分布式項目實戰(zhàn)學(xué)習(xí)架構(gòu)師視頻免費獲取架構(gòu)群:854180697

群鏈接:加群鏈接

寫在最后:歡迎留言討論厂榛,加關(guān)注盖矫,持續(xù)更新!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末击奶,一起剝皮案震驚了整個濱河市辈双,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柜砾,老刑警劉巖湃望,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痰驱,居然都是意外死亡证芭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門萄唇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩帐,“玉大人术幔,你說我怎么就攤上這事另萤。” “怎么了诅挑?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵四敞,是天一觀的道長。 經(jīng)常有香客問我拔妥,道長忿危,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任没龙,我火速辦了婚禮铺厨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硬纤。我一直安慰自己解滓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布筝家。 她就那樣靜靜地躺著洼裤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溪王。 梳的紋絲不亂的頭發(fā)上腮鞍,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音莹菱,去河邊找鬼移国。 笑死,一個胖子當(dāng)著我的面吹牛道伟,可吹牛的內(nèi)容都是我干的迹缀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裹芝!你這毒婦竟也來了部逮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫂易,失蹤者是張志新(化名)和其女友劉穎兄朋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜械,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡颅和,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缕允。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峡扩。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖障本,靈堂內(nèi)的尸體忽然破棺而出教届,到底是詐尸還是另有隱情,我是刑警寧澤驾霜,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布案训,位于F島的核電站,受9級特大地震影響粪糙,放射性物質(zhì)發(fā)生泄漏强霎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一蓉冈、第九天 我趴在偏房一處隱蔽的房頂上張望城舞。 院中可真熱鬧,春花似錦寞酿、人聲如沸家夺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秦踪。三九已至,卻和暖如春掸茅,著一層夾襖步出監(jiān)牢的瞬間椅邓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工昧狮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留景馁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓逗鸣,卻偏偏與公主長得像合住,于是被迫代替她去往敵國和親绰精。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

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

  • 好的愛情電影透葛,從來不缺少的笨使,就是情話和淚點。但是僚害,好的愛情卻與情話和淚點無關(guān)硫椰,就像是一杯水,更多的情愫在其中萨蚕,卻還...
    missfrankxi閱讀 354評論 0 0
  • 你說上一次你情緒這么低落的時候靶草,是什么時間?大理看店的某一天岳遥,不是的奕翔,應(yīng)該是你上一段感情溝通無數(shù)次無果的心情吧,你...
    曾曾的麻麻閱讀 287評論 0 1