常見(jiàn)的負(fù)載均衡技術(shù)

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.cnz.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è)管理功能嘱吗,總是為真

image.png

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> 
 
image.png

image.png

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;
         }
}          
image.png

image.png

則動(dòng)靜分離就實(shí)現(xiàn)了绕德,并且我們還基于uri實(shí)現(xiàn)了會(huì)話(huà)粘性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末患膛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耻蛇,更是在濱河造成了極大的恐慌踪蹬,老刑警劉巖胞此,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異延曙,居然都是意外死亡豌鹤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)枝缔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)布疙,“玉大人,你說(shuō)我怎么就攤上這事愿卸×榱伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵趴荸,是天一觀的道長(zhǎng)儒溉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)发钝,這世上最難降的妖魔是什么顿涣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮酝豪,結(jié)果婚禮上涛碑,老公的妹妹穿的比我還像新娘。我一直安慰自己孵淘,他們只是感情好蒲障,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荆秦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天毙籽,我揣著相機(jī)與錄音,去河邊找鬼毡庆。 笑死惧财,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扭仁。 我是一名探鬼主播垮衷,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乖坠!你這毒婦竟也來(lái)了搀突?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熊泵,失蹤者是張志新(化名)和其女友劉穎仰迁,沒(méi)想到半個(gè)月后甸昏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徐许,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年施蜜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雌隅。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翻默,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恰起,到底是詐尸還是另有隱情修械,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布检盼,位于F島的核電站肯污,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吨枉。R本人自食惡果不足惜蹦渣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望貌亭。 院中可真熱鬧剂桥,春花似錦、人聲如沸属提。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冤议。三九已至,卻和暖如春师坎,著一層夾襖步出監(jiān)牢的瞬間恕酸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工胯陋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕊温,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓遏乔,卻偏偏與公主長(zhǎng)得像义矛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盟萨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • 互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識(shí) 一凉翻、網(wǎng)站常見(jiàn)架構(gòu) 負(fù)載層 頁(yè)面緩存層 web層 數(shù)據(jù)層 二、運(yùn)維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 4,794評(píng)論 0 9
  • 參考文檔: 1.haproxy:http://www.haproxy.org/ 本文涉及haproxy的安裝捻激,并做...
    Netonline閱讀 2,421評(píng)論 1 51
  • 名詞概念 CIP Client IP制轰,訪(fǎng)問(wèn)用戶(hù)自身的IPVIP Virtual IP前计,用戶(hù)訪(fǎng)問(wèn)的目的IPRIP R...
    靖流閱讀 904評(píng)論 2 0
  • 教師的職業(yè)幸福是一種感受,它是教師個(gè)人價(jià)值觀的體現(xiàn)垃杖∧需荆或許大學(xué)生的人生價(jià)值和理想是為了西部的貧困孩子受到教育,...
    bqxlhy閱讀 199評(píng)論 1 2
  • 在簡(jiǎn)書(shū)上看了一篇文章 文章里寫(xiě)了一句我很喜歡的話(huà) 要么讀書(shū)要么旅行 靈魂和身體 總要有一個(gè)在路上 世界那么大 應(yīng)該...
    宜大喵閱讀 383評(píng)論 0 0