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 remote_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í)踐.)
- 不使用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à)慈迈,再用下面的辦法。
- 應(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該如何處理:
- 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分流峡迷,剩下的走其它后端去银伟。
- 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;
}