1、簡(jiǎn)述四層和七層負(fù)載均衡的特點(diǎn)及Haproxy與LVS之間的對(duì)比
2、簡(jiǎn)述Haproxy常見(jiàn)的負(fù)載均衡調(diào)度算法及應(yīng)用場(chǎng)景詳解
3痹雅、通過(guò)Haproxy的ACL規(guī)劃實(shí)現(xiàn)智能負(fù)載均衡,并簡(jiǎn)述tcp、http假残、health的配置示例
4、LNMT實(shí)現(xiàn)動(dòng)靜分離實(shí)戰(zhàn)
1炉擅、簡(jiǎn)述四層和七層負(fù)載均衡的特點(diǎn)及Haproxy與LVS之間的對(duì)比
(1)簡(jiǎn)述四層和七層負(fù)載均衡的特點(diǎn)
四層負(fù)責(zé)均衡:主要是指通過(guò)判斷報(bào)文的IP地址和端口并通過(guò)一定的負(fù)載均衡算法來(lái)決定轉(zhuǎn)發(fā)到哪個(gè)指定目標(biāo)辉懒,主要工作在OSI模型的第四層。四層負(fù)載均衡對(duì)數(shù)據(jù)包只是起一個(gè)數(shù)據(jù)轉(zhuǎn)發(fā)的作用谍失,并不會(huì)干預(yù)客戶(hù)端與服務(wù)器之間應(yīng)用層的通信(如:三次握手等)眶俩。所以能對(duì)數(shù)據(jù)所進(jìn)行的操作也就很少,但相對(duì)于七層負(fù)載均衡來(lái)講效率會(huì)高上很多
七層負(fù)載均衡:也被稱(chēng)為“內(nèi)容交換”快鱼,指的是負(fù)載均衡設(shè)備通過(guò)報(bào)文中的應(yīng)用層信息(URL颠印、HTTP頭部等信息)和負(fù)載均衡算法纲岭,選擇到達(dá)目的的內(nèi)部服務(wù)器。七層負(fù)載均衡可以“智能化”地篩選報(bào)文中 應(yīng)用層信息线罕,然后根據(jù)不同的信息進(jìn)行特定的負(fù)載均衡調(diào)度止潮。這種方式提升了應(yīng)用系統(tǒng)在網(wǎng)絡(luò)層上的靈活性,另外也在一定程度上提升了后端系統(tǒng)的安全性钞楼。因?yàn)橄窬W(wǎng)絡(luò)常見(jiàn)的DoS攻擊喇闸,這些攻擊在七層負(fù)載均衡的環(huán)境下通常都在負(fù)載均衡設(shè)備上就截止了,不會(huì)影響到后臺(tái)服務(wù)器的正常運(yùn)行窿凤。
(2)HAproxy仅偎、nginx與Lvs的對(duì)比
前網(wǎng)絡(luò)中常見(jiàn)的負(fù)載均衡主要分為硬件負(fù)載均衡和軟件負(fù)載均衡。硬件負(fù)載均衡比較知名的產(chǎn)品有F5 Big-IP雳殊、Cirtix Netscaler等等橘沥。而軟件負(fù)載均衡就有著眾多的開(kāi)源項(xiàng)目,常見(jiàn)的有Haproxy夯秃、nginx座咆、lvs等。
Haproxy:
1仓洼、支持兩種代理模式:TCP(四層)和HTTP(七層)介陶,支持虛擬主機(jī);
2色建、能夠補(bǔ)充N(xiāo)ginx的一些缺點(diǎn)比如Session的保持哺呜,Cookie的引導(dǎo)等工作
3、支持url檢測(cè)后端的服務(wù)器出問(wèn)題的檢測(cè)會(huì)有很好的幫助箕戳。
4某残、更多的負(fù)載均衡策略比如:動(dòng)態(tài)加權(quán)輪循(Dynamic Round Robin),加權(quán)源地址哈希(Weighted Source Hash)陵吸,加權(quán)URL哈希和加權(quán)參數(shù)哈希(Weighted Parameter Hash)玻墅。
5、單純從效率上來(lái)講HAProxy更會(huì)比Nginx有更出色的負(fù)載均衡速度壮虫。
6澳厢、HAProxy可以對(duì)Mysql進(jìn)行負(fù)載均衡,對(duì)后端的DB節(jié)點(diǎn)進(jìn)行檢測(cè)和負(fù)載均衡囚似。
9剩拢、支持負(fù)載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權(quán)輪循)谆构、source(原地址保持)裸扶、RI(請(qǐng)求URL)、rdp-cookie(根據(jù)cookie)
10搬素、不能做Web服務(wù)器即Cache呵晨。
lvs:
1魏保、抗負(fù)載能力強(qiáng)、性能高摸屠,能達(dá)到F5硬件的60%谓罗;對(duì)內(nèi)存和cpu資源消耗比較低
2、工作在網(wǎng)絡(luò)4層季二,通過(guò)vrrp協(xié)議轉(zhuǎn)發(fā)(僅作分發(fā)之用)檩咱,具體的流量由linux內(nèi)核處理,因此沒(méi)有流量的產(chǎn)生胯舷。
2刻蚯、穩(wěn)定性、可靠性好桑嘶,自身有完美的熱備方案炊汹;(如:LVS+Keepalived)
3、應(yīng)用范圍比較廣逃顶,可以對(duì)所有應(yīng)用做負(fù)載均衡讨便;
4、不支持正則處理以政,不能做動(dòng)靜分離霸褒。
5、支持負(fù)載均衡算法:rr(輪循)盈蛮、wrr(帶權(quán)輪循)废菱、lc(最小連接)、wlc(權(quán)重最小連接)
6抖誉、配置 復(fù)雜昙啄,對(duì)網(wǎng)絡(luò)依賴(lài)比較大,穩(wěn)定性很高寸五。
nginx:
1、工作在網(wǎng)絡(luò)的7層之上耿币,可以針對(duì)http應(yīng)用做一些分流的策略梳杏,比如針對(duì)域名、目錄結(jié)構(gòu)淹接;
2十性、Nginx對(duì)網(wǎng)絡(luò)的依賴(lài)比較小,理論上能ping通就就能進(jìn)行負(fù)載功能塑悼;
3劲适、Nginx安裝和配置比較簡(jiǎn)單,測(cè)試起來(lái)比較方便厢蒜;
4霞势、可以承擔(dān)高的負(fù)載壓力且穩(wěn)定烹植,一般能支撐超過(guò)1萬(wàn)次的并發(fā);
5愕贡、對(duì)后端服務(wù)器的健康檢查草雕,只支持通過(guò)端口來(lái)檢測(cè),不支持通過(guò)url來(lái)檢測(cè)固以。
6墩虹、Nginx對(duì)請(qǐng)求的異步處理可以幫助節(jié)點(diǎn)服務(wù)器減輕負(fù)載;
7憨琳、Nginx僅能支持http诫钓、https和Email協(xié)議,這樣就在適用范圍較小篙螟。
8菌湃、不支持Session的直接保持,但能通過(guò)ip_hash來(lái)解決闲擦。慢味、對(duì)Big request header的支持不是很好,
9墅冷、支持負(fù)載均衡算法:Round-robin(輪循)纯路、Weight-round-robin(帶權(quán)輪循)、Ip-hash(Ip哈希)
10寞忿、Nginx還能做Web服務(wù)器即Cache功能
2驰唬、簡(jiǎn)述Haproxy常見(jiàn)的負(fù)載均衡調(diào)度算法及應(yīng)用場(chǎng)景詳解
roundrobin:基于權(quán)重進(jìn)行輪詢(xún),此算法是動(dòng)態(tài)的腔彰,其權(quán)重可以在運(yùn)行時(shí)進(jìn)行調(diào)整叫编。
static-rr:基于權(quán)重進(jìn)行輪詢(xún),與roundrobin類(lèi)似霹抛,但是為靜態(tài)方法搓逾,在運(yùn)行時(shí)調(diào)整其服務(wù)器權(quán)重不會(huì)生效。
leastconn:新的連接請(qǐng)求被派發(fā)至具有最少連接數(shù)目的后端服務(wù)器杯拐,動(dòng)態(tài)算法霞篡,適用于較長(zhǎng)時(shí)間會(huì)話(huà)的場(chǎng)景。
source:將請(qǐng)求的源地址進(jìn)行hash運(yùn)算端逼,并與后端服務(wù)器的總權(quán)重作取模運(yùn)算后調(diào)度至某臺(tái)服務(wù)器朗兵;同一IP地址的請(qǐng)求將始終被調(diào)度至某特定的服務(wù)器,靜態(tài)算法顶滩,可以使用hash-type修改此特性余掖;
uri:對(duì)URI的左半部分(“?”之前的部分)或整個(gè)URI進(jìn)行hash運(yùn)算礁鲁,并與后端服務(wù)器的總權(quán)重作取模運(yùn)算后調(diào)度至某臺(tái)服務(wù)器盐欺;同一URI的請(qǐng)求將始終被調(diào)度至某特定的服務(wù)器赁豆,靜態(tài)算法,可以使用hash-type修改此特性找田;
hdr(<name>):根據(jù)用戶(hù)請(qǐng)求報(bào)文中指定的http首部的值進(jìn)行調(diào)度歌憨,常用于實(shí)現(xiàn)將對(duì)同一個(gè)虛擬主機(jī)的請(qǐng)求始終發(fā)往同個(gè)backend server。
3墩衙、通過(guò)Haproxy的ACL規(guī)劃實(shí)現(xiàn)智能負(fù)載均衡务嫡,并簡(jiǎn)述tcp、http漆改、health的配置示例
Haproxy可以做代理服務(wù)相對(duì)于nginx而言有很多相同之處心铃,統(tǒng)一可以基于mode tcp進(jìn)行四層代理也可以基于mode http進(jìn)行七層代理,但不同的是其無(wú)法使用location和if等進(jìn)行匹配判斷挫剑。突出優(yōu)勢(shì)在于有會(huì)話(huà)綁定去扣,web管理界面,狀態(tài)統(tǒng)計(jì)非常詳細(xì)樊破。官方推薦只啟用一個(gè)進(jìn)程愉棱,相對(duì)于nginx多進(jìn)程架構(gòu)工作并不理想,更多的線(xiàn)程可能會(huì)受到系統(tǒng)內(nèi)存的一些限制哲戚。
程序環(huán)境:
主程序:/usr/sbin/haproxy
主配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
配置段:
global:全局配置段
進(jìn)程及安全配置相關(guān)的參數(shù)
性能調(diào)整相關(guān)參數(shù)
Debug參數(shù)
proxies:代理配置段
defaults:為frontend, listen, backend提供默認(rèn)配置奔滑;
frontend:前端,相當(dāng)于nginx, server {}
backend:后端顺少,相當(dāng)于nginx, upstream {}
listen:同時(shí)擁前端和后端
查看配置文件
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
重要的幾個(gè)參數(shù)朋其,及性能調(diào)優(yōu),多數(shù)無(wú)需修改
log:定義全局的syslog服務(wù)器脆炎;最多可以定義兩個(gè)梅猿;
log <address> [len <length>] <facility> [max level [min level]]
nbproc <number>:要啟動(dòng)的haproxy的進(jìn)程數(shù)量;
ulimit-n <number>:每個(gè)haproxy進(jìn)程可打開(kāi)的最大文件數(shù)秒裕;
maxconn <number>:設(shè)定每個(gè)haproxy進(jìn)程所能接受的最大并發(fā)連接數(shù)袱蚓;
最大的并發(fā)連接數(shù)=nbproc * maxconn
maxconnrate <number>:每個(gè)進(jìn)程每秒種所能創(chuàng)建的最大連接數(shù)量;
maxcomprate :壓縮創(chuàng)建的速率
maxsessrate <number>:進(jìn)程每秒能創(chuàng)建的會(huì)話(huà)數(shù)量
maxsslconn <number>:每個(gè)進(jìn)程所能接受的ssl連接數(shù)
spread-checks <0..50, in percent>:散開(kāi)監(jiān)控狀態(tài)檢測(cè)
發(fā)現(xiàn)日志發(fā)送給本機(jī)rsyslog的local2的facility几蜻,而本機(jī)的rsyslog里并沒(méi)有定義癞松,需要我們自己去配置
所以vim /etc/rsyslog.conf添加一段將local2的所有信息記錄在對(duì)應(yīng)日志文件中
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
local2.* /var/log/haproxy.log
ACL規(guī)則
由于HAProxy可以工作在七層模型下,因此入蛆,要實(shí)現(xiàn)HAProxy的強(qiáng)大功能,一定要使用強(qiáng)大靈活的ACL規(guī)則硕勿,通過(guò)ACL規(guī)則可以實(shí)現(xiàn)基于HAProxy的智能負(fù)載均衡系統(tǒng)哨毁。HAProxy通過(guò)ACL規(guī)則完成兩種主要的功能,分別是:
1)通過(guò)設(shè)置的ACL規(guī)則檢查客戶(hù)端請(qǐng)求是否合法源武。如果符合ACL規(guī)則要求扼褪,那么將放行想幻;如果不符合規(guī)則,則直接中斷請(qǐng)求话浇。
2)符合ACL規(guī)則要求的請(qǐng)求將被提交到后端的backend服務(wù)器集群脏毯,進(jìn)而實(shí)現(xiàn)基于ACL規(guī)則的負(fù)載均衡。HAProxy中的ACL規(guī)則經(jīng)常使用在frontend段中幔崖,使用方法如下:
acl 自定義的acl 名稱(chēng) acl 方法 -i [ 匹配的路徑或文件] 其中:
·acl:是一個(gè)關(guān)鍵字食店,表示定義ACL規(guī)則的開(kāi)始。后面需要跟上自定義的ACL名稱(chēng)赏寇。
·acl方法:這個(gè)字段用來(lái)定義實(shí)現(xiàn)ACL的方法吉嫩,HAProxy定義了很多ACL方法,經(jīng)常使用的方法有hdr_reg(host)嗅定、hdr_dom(host)自娩、hdr_beg(host)、url_sub渠退、url_dir忙迁、path_beg、path_end等碎乃。
·-i:表示不區(qū)分大小寫(xiě)姊扔,后面需要跟上匹配的路徑或文件或正則表達(dá)式。與ACL規(guī)則一起使用的HAProxy參數(shù)還有use_backend荠锭,use_backend后面需要跟上一個(gè)backend實(shí)例名旱眯,表示在滿(mǎn)足ACL規(guī)則后去請(qǐng)求哪個(gè)backend實(shí)例,與use_backend對(duì)應(yīng)的還有default_backend參數(shù)证九,它表示在沒(méi)有滿(mǎn)足ACL條件的時(shí)候默認(rèn)使用哪個(gè)后端
acl www_policy hdr_reg(host) -i ^(www.z.cn|z.cn)
acl bbs_policy hdr_dom(host) -i bbs.z.cn
acl url_policy url_sub -i buy_sid=
use_backend server_www if www_policy
use_backend server_app if url_policy
use_backend server_bbs if bbs_policy
default_backend server_cache
這些例子定義了www_policy删豺、bbs_policy、url_policy三個(gè)ACL規(guī)則愧怜,第一條規(guī)則表示如果客戶(hù)端以www.z.cn或z.cn開(kāi)頭的域名發(fā)送請(qǐng)求時(shí)呀页,則此規(guī)則返回true,同理第二條規(guī)則表示如果客戶(hù)端通過(guò)bbs.z.cn域名發(fā)送請(qǐng)求時(shí)拥坛,則此規(guī)則返回true蓬蝶,而第三條規(guī)則表示如果客戶(hù)端在請(qǐng)求的URL中包含“buy_sid=”字符串時(shí),則此規(guī)則返回true猜惋。
第四丸氛、第五、第六條規(guī)則定義了當(dāng)www_policy著摔、bbs_policy缓窜、url_policy三個(gè)ACL規(guī)則返回true時(shí)要調(diào)度到哪個(gè)后端backend,例如,當(dāng)用戶(hù)的請(qǐng)求滿(mǎn)足www_policy規(guī)則時(shí)禾锤,那么HAProxy會(huì)將用戶(hù)的請(qǐng)求直接發(fā)往名為server_www的后端backend私股,其他以此類(lèi)推。而當(dāng)用戶(hù)的請(qǐng)求不滿(mǎn)足任何一個(gè)ACL規(guī)則時(shí)恩掷,HAProxy就會(huì)把請(qǐng)求發(fā)往由default_backend選項(xiàng)指定的server_cache這個(gè)后端backend倡鲸。
acl host_www hdr_beg(host) -i www
acl host_static hdr_beg(host) -i img. video. download. ftp.
use_backend static if host_static || host_www url_static
use_backend www if host_www
default_backend server_cache
與上面的例子類(lèi)似,本例中也定義了url_static黄娘、host_www和host_static三個(gè)ACL規(guī)則峭状,其中,第一條規(guī)則通過(guò)path_end參數(shù)定義了如果客戶(hù)端在請(qǐng)求的URL中以.gif寸宏、.png宁炫、.jpg、.css或.js結(jié)尾時(shí)返回true氮凝,第二條規(guī)則通過(guò)hdr_beg(host)參數(shù)定義了如果客戶(hù)端以www開(kāi)頭的域名發(fā)送請(qǐng)求時(shí)則返回true羔巢,同理,第三條規(guī)則也是通過(guò)hdr_beg(host)參數(shù)定義了如果客戶(hù)端以img.罩阵、video.竿秆、download.或ftp.開(kāi)頭的域名發(fā)送請(qǐng)求時(shí)則返回true。
第四稿壁、第五條規(guī)則定義了當(dāng)滿(mǎn)足ACL規(guī)則后要調(diào)度到哪個(gè)后端backend幽钢,例如,當(dāng)用戶(hù)的請(qǐng)求同時(shí)滿(mǎn)足host_static規(guī)則與url_static規(guī)則傅是,或同時(shí)滿(mǎn)足host_www和url_static規(guī)則時(shí)匪燕,那么會(huì)將用戶(hù)請(qǐng)求直接發(fā)往名為static的后端backend,如果用戶(hù)請(qǐng)求滿(mǎn)足host_www規(guī)則喧笔,那么請(qǐng)求將被調(diào)度到名為www的后端backend帽驯,如果不滿(mǎn)足所有規(guī)則,那么將用戶(hù)請(qǐng)求默認(rèn)調(diào)度到名為server_cache的這個(gè)后端backend书闸。
global部分
log:全局的日志配置尼变,local0是日志設(shè)備,info表示日志級(jí)別浆劲。其中日志級(jí)別有err嫌术、warning、info牌借、debug4種可選度气。這個(gè)配置表示使用127.0.0.1上的rsyslog服務(wù)中的local0日志設(shè)備,記錄日志等級(jí)為info膨报。
maxconn:設(shè)定每個(gè)HAProxy進(jìn)程可接受的最大并發(fā)連接數(shù)蚯嫌,此選項(xiàng)等同于Linux命令行選項(xiàng)“ulimit -n”哲虾。
user/group:設(shè)置運(yùn)行HAProxy進(jìn)程的用戶(hù)和組,也可使用用戶(hù)和組的uid和gid值來(lái)替代择示。
daemon:設(shè)置HAProxy進(jìn)程進(jìn)入后臺(tái)運(yùn)行。這是推薦的運(yùn)行模式晒旅。
nbproc:設(shè)置HAProxy啟動(dòng)時(shí)可創(chuàng)建的進(jìn)程數(shù)栅盲,此參數(shù)要求將HAProxy運(yùn)行模式設(shè)置為daemon,默認(rèn)只啟動(dòng)一個(gè)進(jìn)程废恋。該值的設(shè)置應(yīng)該小于服務(wù)器的CPU核數(shù)谈秫。創(chuàng)建多個(gè)進(jìn)程,能夠減少每個(gè)進(jìn)程的任務(wù)隊(duì)列鱼鼓,但是過(guò)多的進(jìn)程可能會(huì)導(dǎo)致進(jìn)程崩潰拟烫。
pidfile:指定HAProxy進(jìn)程的pid文件。啟動(dòng)進(jìn)程的用戶(hù)必須有訪(fǎng)問(wèn)此文件的權(quán)限迄本。
defaults部分
mode:設(shè)置HAProxy實(shí)例默認(rèn)的運(yùn)行模式硕淑,有tcp、http嘉赎、health三個(gè)可選值置媳。
- TCP模式:在此模式下,客戶(hù)端和服務(wù)器端之間將建立一個(gè)全雙工的連接公条,不會(huì)對(duì)七層報(bào)文做任何類(lèi)型的檢查拇囊,默認(rèn)為tcp模式,經(jīng)常用于SSL靶橱、SSH寥袭、SMTP等應(yīng)用。
- http模式:在此模式下关霸,客戶(hù)端請(qǐng)求在轉(zhuǎn)發(fā)至后端服務(wù)器之前將會(huì)被深度分析传黄,所有不與RFC格式兼容的請(qǐng)求都會(huì)被拒絕。
- health模式:目前此模式基本已經(jīng)廢棄谒拴,不再多說(shuō)尝江。
retries:設(shè)置連接后端服務(wù)器的失敗重試次數(shù),如果連接失敗的次數(shù)超過(guò)這里設(shè)置的值英上,HAProxy會(huì)將對(duì)應(yīng)的后端服務(wù)器標(biāo)記為不可用炭序。此參數(shù)也可在后面部分進(jìn)行設(shè)置。
timeout connect:設(shè)置成功連接到一臺(tái)服務(wù)器的最長(zhǎng)等待時(shí)間苍日,默認(rèn)單位是毫秒惭聂,但也可以使用其他的時(shí)間單位后綴。
timeout client:設(shè)置連接客戶(hù)端發(fā)送數(shù)據(jù)時(shí)最長(zhǎng)等待時(shí)間相恃,默認(rèn)單位是毫秒辜纲,也可以使用其他的時(shí)間單位后綴。
timeout server:設(shè)置服務(wù)器端回應(yīng)客戶(hù)端數(shù)據(jù)發(fā)送的最長(zhǎng)等待時(shí)間,默認(rèn)單位是毫秒耕腾,也可以使用其他的時(shí)間單位后綴见剩。
timeout check:設(shè)置對(duì)后端服務(wù)器的檢測(cè)超時(shí)時(shí)間,默認(rèn)單位是毫秒扫俺,也可以使用其他的時(shí)間單位后綴苍苞。
frontend部分
bind:此選項(xiàng)只能在frontend和listen部分進(jìn)行定義,用于定義一個(gè)或幾個(gè)監(jiān)聽(tīng)的套接字狼纬。bind的使用格式為: bind [<address>:<port_range>] interface <interface>其可以為主機(jī)名或IP地址羹呵,如果將其設(shè)置為“*”或“0.0.0.0”,將監(jiān)聽(tīng)當(dāng)前系統(tǒng)的所有IPv4地址疗琉。port_range可以是一個(gè)特定的TCP端口冈欢,也可是一個(gè)端口范圍,小于1024的端口需要有特定權(quán)限的用戶(hù)才能使用盈简。interface為可選選項(xiàng)凑耻,用來(lái)指定網(wǎng)絡(luò)接口的名稱(chēng),只能在Linux系統(tǒng)上使用送火。
option httplog:在默認(rèn)情況下拳话,HAProxy日志是不記錄HTTP請(qǐng)求的,這樣很不方便HAProxy問(wèn)題的排查與監(jiān)控种吸。通過(guò)此選項(xiàng)可以啟用日志記錄HTTP請(qǐng)求弃衍。
option forwardfor:如果后端服務(wù)器需要獲得客戶(hù)端的真實(shí)IP,就需要配置此參數(shù)坚俗。由于HAProxy工作于反向代理模式镜盯,因此發(fā)往后端真實(shí)服務(wù)器的請(qǐng)求中的客戶(hù)端IP均為HAProxy主機(jī)的IP,而非真正訪(fǎng)問(wèn)客戶(hù)端的地址猖败,這就導(dǎo)致真實(shí)服務(wù)器端無(wú)法記錄客戶(hù)端真正請(qǐng)求來(lái)源的IP速缆,而X-Forwarded-For則可用于解決此問(wèn)題。通過(guò)使用forwardfor選項(xiàng)恩闻,HAProxy就可以向每個(gè)發(fā)往后端真實(shí)服務(wù)器的請(qǐng)求添加X(jué)-Forwarded-For記錄艺糜,這樣后端真實(shí)服務(wù)器日志可以通過(guò)“X-Forwarded-For”信息來(lái)記錄客戶(hù)端來(lái)源IP。
option httpclose:此選項(xiàng)表示在客戶(hù)端和服務(wù)器端完成一次連接請(qǐng)求后幢尚,HAProxy將主動(dòng)關(guān)閉此TCP連接破停。這是對(duì)性能非常有幫助的一個(gè)參數(shù)。
log global:表示使用全局的日志配置尉剩,這里的global表示引用在HAProxy配置文件global部分中定義的log選項(xiàng)配置格式真慢。
default_backend:指定默認(rèn)的后端服務(wù)器池,也就是指定一組后端真實(shí)服務(wù)器理茎,而這些真實(shí)服務(wù)器組將在backend段進(jìn)行定義黑界。這里的htmpool就是一個(gè)后端服務(wù)器組管嬉。
backend部分
option redispatch:此參數(shù)用于cookie保持的環(huán)境中。在默認(rèn)情況下朗鸠,HAProxy會(huì)將其請(qǐng)求的后端服務(wù)器的serverID插入cookie中蚯撩,以保證會(huì)話(huà)的session持久性。而如果后端的服務(wù)器出現(xiàn)故障烛占,客戶(hù)端的cookie是不會(huì)刷新的求厕,這就會(huì)出現(xiàn)問(wèn)題。此時(shí)扰楼,如果設(shè)置此參數(shù),就會(huì)將客戶(hù)的請(qǐng)求強(qiáng)制定向到另外一臺(tái)健康的后端服務(wù)器上美浦,以保證服務(wù)正常弦赖。
option abortonclose:如果設(shè)置了此參數(shù),可以在服務(wù)器負(fù)載很高的情況下浦辨,自動(dòng)結(jié)束當(dāng)前隊(duì)列中處理時(shí)間比較長(zhǎng)的連接蹬竖。
-balance:此關(guān)鍵字用來(lái)定義負(fù)載均衡算法。目前HAProxy支持多種負(fù)載均衡算法流酬,常用的有如下幾種:
- roundrobin:是基于權(quán)重進(jìn)行輪叫調(diào)度的算法币厕,在服務(wù)器的性能分布比較均勻時(shí),這是一種最公平芽腾、最合理的算法旦装。此算法使用頻繁。
- static-rr:也是基于權(quán)重進(jìn)行輪叫的調(diào)度算法摊滔,不過(guò)此算法為靜態(tài)方法阴绢,在運(yùn)行時(shí)調(diào)整其服務(wù)器權(quán)重不會(huì)生效。
- source:是基于請(qǐng)求源IP的算法艰躺。此算法先對(duì)請(qǐng)求的源IP進(jìn)行hash運(yùn)算呻袭,然后將結(jié)果與后端服務(wù)器的權(quán)重總數(shù)相除后轉(zhuǎn)發(fā)至某臺(tái)匹配的后端服務(wù)器。這種方式可以使同一個(gè)客戶(hù)端IP的請(qǐng)求始終被轉(zhuǎn)發(fā)到某特定的后端服務(wù)器腺兴。
- leastconn:此算法會(huì)將新的連接請(qǐng)求轉(zhuǎn)發(fā)到具有最少連接數(shù)目的后端服務(wù)器左电。在會(huì)話(huà)時(shí)間較長(zhǎng)的場(chǎng)景中推薦使用此算法,例如數(shù)據(jù)庫(kù)負(fù)載均衡等页响。此算法不適合會(huì)話(huà)較短的環(huán)境中篓足,例如基于HTTP的應(yīng)用。
- uri:此算法會(huì)對(duì)部分或整個(gè)URI進(jìn)行hash運(yùn)算拘泞,再經(jīng)過(guò)與服務(wù)器的總權(quán)重相除纷纫,最后轉(zhuǎn)發(fā)到某臺(tái)匹配的后端服務(wù)器上。
- uri_param:此算法會(huì)根據(jù)URL路徑中的參數(shù)進(jìn)行轉(zhuǎn)發(fā)陪腌,這樣可保證在后端真實(shí)服務(wù)器數(shù)量不變時(shí)辱魁,同一個(gè)用戶(hù)的請(qǐng)求始終分發(fā)到同一臺(tái)機(jī)器上烟瞧。
- hdr(<name>):此算法根據(jù)http頭進(jìn)行轉(zhuǎn)發(fā),如果指定的http頭名稱(chēng)不存在染簇,則使用roundrobin算法進(jìn)行策略轉(zhuǎn)發(fā)参滴。
cookie:表示允許向cookie插入SERVERID,每臺(tái)服務(wù)器的SERVERID可在下面的server關(guān)鍵字中使用cookie關(guān)鍵字定義锻弓。
option httpchk:此選項(xiàng)表示啟用HTTP的服務(wù)狀態(tài)檢測(cè)功能砾赔。HAProxy作為一個(gè)專(zhuān)業(yè)的負(fù)載均衡器,它支持對(duì)backend部分指定的后端服務(wù)節(jié)點(diǎn)的健康檢查青灼,以保證在后端backend中某個(gè)節(jié)點(diǎn)不能服務(wù)時(shí)暴心,把從frotend端進(jìn)來(lái)的客戶(hù)端請(qǐng)求分配至backend中其他健康節(jié)點(diǎn)上,從而保證整體服務(wù)的可用性杂拨。
option httpchk的用法如下: option httpchk <method> <uri> <version> 其中专普,各個(gè)參數(shù)的含義如下:
- method:表示HTTP請(qǐng)求的方式,常用的有OPTIONS弹沽、GET檀夹、HEAD幾種方式。一般的健康檢查可以采用HEAD方式進(jìn)行策橘,而不是采用GET方式炸渡,這是因?yàn)镠EAD方式?jīng)]有數(shù)據(jù)返回,僅檢查Response的HEAD是不是狀態(tài)碼200丽已。因此蚌堵,相對(duì)于GET,HEAD方式更快促脉、更簡(jiǎn)單辰斋。
- uri:表示要檢測(cè)的URL地址,通過(guò)執(zhí)行此URL瘸味,可以獲取后端服務(wù)器的運(yùn)行狀態(tài)宫仗。在正常情況下將返回狀態(tài)碼200,返回其他狀態(tài)碼均為異常狀態(tài)旁仿。
- version:指定心跳檢測(cè)時(shí)的HTTP的版本號(hào)藕夫。
server:這個(gè)關(guān)鍵字用來(lái)定義多臺(tái)后端真實(shí)服務(wù)器,不能用于defaults和frontend部分枯冈。使用格式為: server <name> <address>[:port] [param*] 其中毅贮,每個(gè)參數(shù)含義如下: - <name>:為后端真實(shí)服務(wù)器指定一個(gè)內(nèi)部名稱(chēng),隨便定義一個(gè)即可尘奏。
- <address>:后端真實(shí)服務(wù)器的IP地址或主機(jī)名滩褥。
- <port>:指定連接請(qǐng)求發(fā)往真實(shí)服務(wù)器時(shí)的目標(biāo)端口。在未設(shè)定時(shí)炫加,將使用客戶(hù)端請(qǐng)求時(shí)的同一端口瑰煎。
- [param*]:為后端服務(wù)器設(shè)定的一系列參數(shù)铺然,可用參數(shù)非常多,這里僅介紹常用的一些參數(shù):
check:表示啟用對(duì)此后端服務(wù)器執(zhí)行健康狀態(tài)檢查酒甸。
inter:設(shè)置健康狀態(tài)檢查的時(shí)間間隔魄健,單位為毫秒。
rise:設(shè)置從故障狀態(tài)轉(zhuǎn)換至正常狀態(tài)需要成功檢查的次數(shù)插勤,例如沽瘦,“rise 2”表示2次檢查正確就認(rèn)為此服務(wù)器可用。
fall:設(shè)置后端服務(wù)器從正常狀態(tài)轉(zhuǎn)換為不可用狀態(tài)需要檢查的次數(shù)农尖,例如析恋,“fall 3”表示3次檢查失敗就認(rèn)為此服務(wù)器不可用。
cookie:為指定的后端服務(wù)器設(shè)定cookie值盛卡,此處指定的值將在請(qǐng)求入站時(shí)被檢查绿满,第一次為此值挑選的后端服務(wù)器將在后續(xù)的請(qǐng)求中一直被選中,其目的在于實(shí)現(xiàn)持久連接的功能窟扑。上面的“cookie server1”表示web1的serverid為server1。同理漏健,“cookie server2”表示web2的serverid為server2嚎货。
weight:設(shè)置后端真實(shí)服務(wù)器的權(quán)重,默認(rèn)為1蔫浆,最大值為256殖属。設(shè)置為0表示不參與負(fù)載均衡。
backup:設(shè)置后端真實(shí)服務(wù)器的備份服務(wù)器瓦盛,僅僅在后端所有真實(shí)服務(wù)器均不可用的情況下才啟用洗显。
通過(guò)ACL智能負(fù)載均衡動(dòng)靜分離
rontend web *:80
compression algo gzip
compression type text/html text/plain /application/xml application/javascript
acl static path_end .jpg .jpeg.png .gif .txt .html .css .javascript .
js #定義靜態(tài)acl匹配規(guī)則,后綴匹配
acl static path_beg /imgs /css /javascripts #定義靜態(tài)acl匹配規(guī)則原环,前綴匹配
use_backend staticsrvs if static #使用靜態(tài)acl匹配規(guī)則
default_backend dynsrvs #未匹配到acl的挠唆,使用默認(rèn)后端主機(jī),動(dòng)態(tài)內(nèi)容
backend dynsrvs #動(dòng)態(tài)主機(jī)組
cookie SRV insert indirect nocache #啟用cookie綁定
server dynsrv1 192.168.31.204:80 check cookie dynsrv1
backend staticsrvs #靜態(tài)主機(jī)組
server staticsrv1 192.168.31.203:80 check
listen stats
bind *:9099
stats enable
stats uri /myproxy?admin #自定義信息頁(yè)地址
stats realm "HAProxy Stats Page" #認(rèn)證提示
stats auth admin:admin #認(rèn)證時(shí)用的用戶(hù)名和密碼
stats admin if TRUE #啟用信息頁(yè)管理功能嘱吗,總是為真
4玄组、LNMT實(shí)現(xiàn)動(dòng)靜分離實(shí)戰(zhàn)
用nginx反代后端的兩臺(tái)tomcat主機(jī),做動(dòng)靜分離谒麦,如果是jsp結(jié)尾的就發(fā)往后端俄讹,否則就交給nginx處理。
在兩臺(tái)tomcat主機(jī)上創(chuàng)建應(yīng)用
mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,META-INF,calsses,lib}
然后創(chuàng)建應(yīng)用程序jsp文件
在A主機(jī)上
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
在B主機(jī)上
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
nginx配置
upstream tcservs {
hash $request_uri consistent; #使用uri一致性哈希算法保持會(huì)話(huà)粘性
#hash $cookie_name consistent 對(duì)cookie做哈希也可以
server 192.168.31.203:8080;
server 192.168.31.204:8080;
}
vim /etc/nginx/conf.d/lvqin.conf
server {
listen 80;
server_name node1.lvqing.com;
location ~* \.(jsp|do)$ {
proxy_pass http://tcservs;
}
}
則動(dòng)靜分離就實(shí)現(xiàn)了绕德,并且我們還基于uri實(shí)現(xiàn)了會(huì)話(huà)粘性