nginx 負(fù)載均衡

linux負(fù)載均衡總結(jié)性說(shuō)明(四層負(fù)載/七層負(fù)載)

一,什么是負(fù)載均衡
1)負(fù)載均衡(Load Balance)建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上推励,它提供了一種廉價(jià)有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量乃秀、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力币狠、提高網(wǎng)絡(luò)的靈活性和可用性。負(fù)載均衡有兩方面的含義:首先篷帅,大量的并發(fā)訪(fǎng)問(wèn)或數(shù)據(jù)流量分擔(dān)到多臺(tái)節(jié)點(diǎn)設(shè)備上分別處理史侣,減少用戶(hù)等待響應(yīng)的時(shí)間;其次魏身,單個(gè)重負(fù)載的運(yùn)算分擔(dān)到多臺(tái)節(jié)點(diǎn)設(shè)備上做并行處理惊橱,每個(gè)節(jié)點(diǎn)設(shè)備處理結(jié)束后,將結(jié)果匯總箭昵,返回給用戶(hù)税朴,系統(tǒng)處理能力得到大幅度提高。
2)簡(jiǎn)單來(lái)說(shuō)就是:其一是將大量的并發(fā)處理轉(zhuǎn)發(fā)給后端多個(gè)節(jié)點(diǎn)處理家制,減少工作響應(yīng)時(shí)間正林;其二是將單個(gè)繁重的工作轉(zhuǎn)發(fā)給后端多個(gè)節(jié)點(diǎn)處理,處理完再返回給負(fù)載均衡中心颤殴,再返回給用戶(hù)觅廓。目前負(fù)載均衡技術(shù)大多數(shù)是用于提高諸如在Web服務(wù)器、FTP服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器上的Internet服務(wù)器程序的可用性和可伸縮性涵但。
二杈绸,負(fù)載均衡分類(lèi)
1)二層負(fù)載均衡(mac)
根據(jù)OSI模型分的二層負(fù)載,一般是用虛擬mac地址方式矮瘟,外部對(duì)虛擬MAC地址請(qǐng)求瞳脓,負(fù)載均衡接收后分配后端實(shí)際的MAC地址響應(yīng))
2)三層負(fù)載均衡(ip)
一般采用虛擬IP地址方式,外部對(duì)虛擬的ip地址請(qǐng)求澈侠,負(fù)載均衡接收后分配后端實(shí)際的IP地址響應(yīng))
3)四層負(fù)載均衡(tcp)
在三次負(fù)載均衡的基礎(chǔ)上劫侧,用ip+port接收請(qǐng)求,再轉(zhuǎn)發(fā)到對(duì)應(yīng)的機(jī)器埋涧。
4)七層負(fù)載均衡(http)
根據(jù)虛擬的url或IP板辽,主機(jī)名接收請(qǐng)求奇瘦,再轉(zhuǎn)向相應(yīng)的處理服務(wù)器)。

我們運(yùn)維中最常見(jiàn)的四層和七層負(fù)載均衡劲弦,這里重點(diǎn)說(shuō)下這兩種負(fù)載均衡耳标。
1)四層的負(fù)載均衡就是基于IP+端口的負(fù)載均衡:在三層負(fù)載均衡的基礎(chǔ)上,通過(guò)發(fā)布三層的IP地址(VIP)邑跪,然后加四層的端口號(hào)次坡,來(lái)決定哪些流量需要做負(fù)載均衡,對(duì)需要處理的流量進(jìn)行NAT處理画畅,轉(zhuǎn)發(fā)至后臺(tái)服務(wù)器砸琅,并記錄下這個(gè)TCP或者UDP的流量是由哪臺(tái)服務(wù)器處理的,后續(xù)這個(gè)連接的所有流量都同樣轉(zhuǎn)發(fā)到同一臺(tái)服務(wù)器處理轴踱。
對(duì)應(yīng)的負(fù)載均衡器稱(chēng)為四層交換機(jī)(L4 switch)症脂,主要分析IP層及TCP/UDP層,實(shí)現(xiàn)四層負(fù)載均衡淫僻。此種負(fù)載均衡器不理解應(yīng)用協(xié)議(如HTTP/FTP/MySQL等等)诱篷。
實(shí)現(xiàn)四層負(fù)載均衡的軟件有:
F5:硬件負(fù)載均衡器,功能很好雳灵,但是成本很高棕所。
lvs:重量級(jí)的四層負(fù)載軟件
nginx:輕量級(jí)的四層負(fù)載軟件,帶緩存功能悯辙,正則表達(dá)式較靈活
haproxy:模擬四層轉(zhuǎn)發(fā)琳省,較靈活
2)七層的負(fù)載均衡就是基于虛擬的URL或主機(jī)IP的負(fù)載均衡:在四層負(fù)載均衡的基礎(chǔ)上(沒(méi)有四層是絕對(duì)不可能有七層的),再考慮應(yīng)用層的特征躲撰,比如同一個(gè)Web服務(wù)器的負(fù)載均衡针贬,除了根據(jù)VIP加80端口辨別是否需要處理的流量,還可根據(jù)七層的URL茴肥、瀏覽器類(lèi)別坚踩、語(yǔ)言來(lái)決定是否要進(jìn)行負(fù)載均衡。舉個(gè)例子瓤狐,如果你的Web服務(wù)器分成兩組瞬铸,一組是中文語(yǔ)言的,一組是英文語(yǔ)言的础锐,那么七層負(fù)載均衡就可以當(dāng)用戶(hù)來(lái)訪(fǎng)問(wèn)你的域名時(shí)嗓节,自動(dòng)辨別用戶(hù)語(yǔ)言,然后選擇對(duì)應(yīng)的語(yǔ)言服務(wù)器組進(jìn)行負(fù)載均衡處理皆警。
對(duì)應(yīng)的負(fù)載均衡器稱(chēng)為七層交換機(jī)(L7 switch)拦宣,除了支持四層負(fù)載均衡以外,還有分析應(yīng)用層的信息,如HTTP協(xié)議URI或Cookie信息鸵隧,實(shí)現(xiàn)七層負(fù)載均衡绸罗。此種負(fù)載均衡器能理解應(yīng)用協(xié)議。
實(shí)現(xiàn)七層負(fù)載均衡的軟件有:
haproxy:天生負(fù)載均衡技能豆瘫,全面支持七層代理珊蟀,會(huì)話(huà)保持,標(biāo)記外驱,路徑轉(zhuǎn)移育灸;
nginx:只在http協(xié)議和mail協(xié)議上功能比較好,性能與haproxy差不多昵宇;
apache:功能較差
Mysql proxy:功能尚可磅崭。

總的來(lái)說(shuō),一般是lvs做4層負(fù)載瓦哎;nginx做7層負(fù)載砸喻;haproxy比較靈活,4層和7層負(fù)載均衡都能做

nginx 負(fù)載均衡

測(cè)試域名 www.nginx.cy
a服務(wù)器地址:172.16.0.10(主服務(wù)器 反向代理服務(wù)器)
b服務(wù)器地址:172.16.0.100
c服務(wù)器地址:172.16.0.200

a服務(wù)器的配置(nginx.conf)蒋譬,在http段加入以下代碼恩够,配置服務(wù)器集群server cluster,weight代表權(quán)重
upstream www.nginx.cy{
server 172.16.0.100:80 weight=2;#有2/5的機(jī)率訪(fǎng)問(wèn)打這臺(tái)服務(wù)器
server 172.16.0.200:80 weight=3;
}
server{
listen 80;
server_name www.nginx.cy;
location /{
#反向代理地址
proxy_pass http://www.nginx.cy;
#設(shè)置主機(jī)頭和客戶(hù)端的真實(shí)地址羡铲,以便服務(wù)器獲取客戶(hù)端真實(shí)IP
proxy_set_header Host host; proxy_set_header X-Real-IPremote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
b,c 服務(wù)器正常配置即可

以上測(cè)試是通過(guò)權(quán)重 進(jìn)行負(fù)載均衡,也可以按照輪詢(xún),ip哈希,url哈希等多種方式對(duì)服務(wù)器做負(fù)載均衡
nginx 的 upstream目前支持 4 種方式的分配
1)、輪詢(xún)(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器儡毕,如果后端服務(wù)器down掉也切,能自動(dòng)剔除。
2)腰湾、weight
指定輪詢(xún)幾率雷恃,weight和訪(fǎng)問(wèn)比率成正比,用于后端服務(wù)器性能不均的情況费坊。
2)倒槐、ip_hash
每個(gè)請(qǐng)求按訪(fǎng)問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪(fǎng)客固定訪(fǎng)問(wèn)一個(gè)后端服務(wù)器附井,可以解決session的問(wèn)題讨越。
3)、fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求永毅,響應(yīng)時(shí)間短的優(yōu)先分配把跨。
4)、url_hash(第三方)

配置負(fù)載均衡比較簡(jiǎn)單,但是最關(guān)鍵的一個(gè)問(wèn)題是怎么實(shí)現(xiàn)多臺(tái)服務(wù)器之間session的共享
下面有幾種方法(以下內(nèi)容來(lái)源于網(wǎng)絡(luò),第四種方法沒(méi)有實(shí)踐.)

  1. 不使用session沼死,換作cookie

能把session改成cookie着逐,就能避開(kāi)session的一些弊端,在從前看的一本J2EE的書(shū)上,也指明在集群系統(tǒng)中不能用session耸别,否則惹出禍端來(lái)就不好辦健芭。如果系統(tǒng)不復(fù)雜,就優(yōu)先考慮能否將session去掉秀姐,改動(dòng)起來(lái)非常麻煩的話(huà)慈迈,再用下面的辦法。

  1. 應(yīng)用服務(wù)器自行實(shí)現(xiàn)共享

asp.net可以用數(shù)據(jù)庫(kù)或memcached來(lái)保存session囊扳,從而在asp.net本身建立了一個(gè)session集群吩翻,用這樣的方式可以令 session保證穩(wěn)定,即使某個(gè)節(jié)點(diǎn)有故障锥咸,session也不會(huì)丟失狭瞎,適用于較為嚴(yán)格但請(qǐng)求量不高的場(chǎng)合。但是它的效率是不會(huì)很高的搏予,不適用于對(duì)效率 要求高的場(chǎng)合熊锭。

以上兩個(gè)辦法都跟nginx沒(méi)什么關(guān)系,下面來(lái)說(shuō)說(shuō)用nginx該如何處理:

  1. ip_hash

nginx中的ip_hash技術(shù)能夠?qū)⒛硞€(gè)ip的請(qǐng)求定向到同一臺(tái)后端雪侥,這樣一來(lái)這個(gè)ip下的某個(gè)客戶(hù)端和某個(gè)后端就能建立起穩(wěn)固的session碗殷,ip_hash是在upstream配置中定義的:

upstream backend {
server 127.0.0.1:8080 ;
server 127.0.0.1:9090 ;
ip_hash;
}

ip_hash是容易理解的,但是因?yàn)閮H僅能用ip這個(gè)因子來(lái)分配后端速缨,因此ip_hash是有缺陷的锌妻,不能在一些情況下使用:

1/ nginx不是最前端的服務(wù)器。ip_hash要求nginx一定是最前端的服務(wù)器旬牲,否則nginx得不到正確ip仿粹,就不能根據(jù)ip作hash。譬如使用的是squid為最前端原茅,那么nginx取ip時(shí)只能得到squid的服務(wù)器ip地址吭历,用這個(gè)地址來(lái)作分流是肯定錯(cuò)亂的。

2/ nginx的后端還有其它方式的負(fù)載均衡擂橘。假如nginx后端又有其它負(fù)載均衡晌区,將請(qǐng)求又通過(guò)另外的方式分流了,那么某個(gè)客戶(hù)端的請(qǐng)求肯定不能定位到同一臺(tái)session應(yīng)用服務(wù)器上通贞。這么算起來(lái)朗若,nginx后端只能直接指向應(yīng)用服務(wù)器,或者再搭一個(gè)squid滑频,然后指向應(yīng)用服務(wù)器捡偏。最好的辦法是用location作一次分流,將需要session的部分請(qǐng)求通過(guò)ip_hash分流峡迷,剩下的走其它后端去银伟。

  1. upstream_hash

為了解決ip_hash的一些問(wèn)題你虹,可以使用upstream_hash這個(gè)第三方模塊,這個(gè)模塊多數(shù)情況下是用作url_hash的彤避,但是并不妨礙將它用來(lái)做session共享:

假如前端是squid傅物,他會(huì)將ip加入x_forwarded_for這個(gè)http_header里,用upstream_hash可以用這個(gè)頭做因子琉预,將請(qǐng)求定向到指定的后端:

可見(jiàn)這篇文檔:http://www.sudone.com/nginx/nginx_url_hash.html

在文檔中是使用

hash ;

這樣就改成了利用x_forwarded_for這個(gè)頭作因子董饰,在nginx新版本中可支持讀取cookie值,所以也可以改成:

hash ;

nginx的upstream目前支持的5種方式的分配
1圆米、輪詢(xún)(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器卒暂,如果后端服務(wù)器down掉,能自動(dòng)剔除娄帖。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
2也祠、weight
指定輪詢(xún)幾率,weight和訪(fǎng)問(wèn)比率成正比近速,用于后端服務(wù)器性能不均的情況诈嘿。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3、ip_hash
每個(gè)請(qǐng)求按訪(fǎng)問(wèn)ip的hash結(jié)果分配削葱,這樣每個(gè)訪(fǎng)客固定訪(fǎng)問(wèn)一個(gè)后端服務(wù)器奖亚,可以解決session的問(wèn)題。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4析砸、fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求昔字,響應(yīng)時(shí)間短的優(yōu)先分配。
upstream backserver {
server server1;
server server2;
fair;
}
5首繁、url_hash(第三方)
按訪(fǎng)問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求李滴,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效蛮瞄。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谆扎,隨后出現(xiàn)的幾起案子挂捅,更是在濱河造成了極大的恐慌,老刑警劉巖堂湖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闲先,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡无蜂,警方通過(guò)查閱死者的電腦和手機(jī)伺糠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斥季,“玉大人训桶,你說(shuō)我怎么就攤上這事累驮。” “怎么了舵揭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵谤专,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我午绳,道長(zhǎng)置侍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任拦焚,我火速辦了婚禮蜡坊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赎败。我一直安慰自己秕衙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布螟够。 她就那樣靜靜地躺著灾梦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妓笙。 梳的紋絲不亂的頭發(fā)上若河,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音寞宫,去河邊找鬼萧福。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辈赋,可吹牛的內(nèi)容都是我干的鲫忍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钥屈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悟民!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起篷就,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤射亏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后竭业,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體智润,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年未辆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窟绷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咐柜,死狀恐怖兼蜈,靈堂內(nèi)的尸體忽然破棺而出攘残,到底是詐尸還是另有隱情,我是刑警寧澤饭尝,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布肯腕,位于F島的核電站,受9級(jí)特大地震影響钥平,放射性物質(zhì)發(fā)生泄漏实撒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一涉瘾、第九天 我趴在偏房一處隱蔽的房頂上張望知态。 院中可真熱鬧,春花似錦立叛、人聲如沸负敏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)其做。三九已至,卻和暖如春赁还,著一層夾襖步出監(jiān)牢的瞬間妖泄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工艘策, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹈胡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓朋蔫,卻偏偏與公主長(zhǎng)得像罚渐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驯妄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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