服務(wù)器 無(wú)法訪(fǎng)問(wèn)網(wǎng)站上海網(wǎng)絡(luò)推廣外包公司
LVS+Haproxy
- 一、Haproxy簡(jiǎn)介
- 1.1、Haproxy應(yīng)用分析
- 1.2、Haproxy的特性
- 1.3、常見(jiàn)負(fù)載均衡策略
- 1.4、LVS、Haproxy、Nginx區(qū)別
- 1.5、 Haproxy的優(yōu)點(diǎn)
- 1.6、常見(jiàn)的Web集群調(diào)度器
- 二、Haproxy部署實(shí)例
- 四、日志定義優(yōu)化
一、Haproxy簡(jiǎn)介
Haproxy 是一個(gè)使用C語(yǔ)言編寫(xiě)的自由及開(kāi)放源代碼軟件,其提供高可用性、負(fù)載均衡,以及基于TCP和HTTP的應(yīng)用程序代理。
1.1、Haproxy應(yīng)用分析
-
LVS在企業(yè)應(yīng)用中抗負(fù)載能力很強(qiáng),但存在不足
-
LVS不支持正則處理,不能實(shí)現(xiàn)動(dòng)靜分離
-
對(duì)于大型網(wǎng)站,LVS的實(shí)施配置復(fù)雜,維護(hù)成本相對(duì)較高
-
-
Haproxy是一款可提供高可用性、負(fù)載均衡、及基于TCP和HTTP應(yīng)用的代理軟件
- 適用于負(fù)載大的web站點(diǎn)
- 運(yùn)行在硬件上可支持?jǐn)?shù)以萬(wàn)計(jì)的并發(fā)連接的連接請(qǐng)求
1.2、Haproxy的特性
- 可靠性和穩(wěn)定性非常好,可以與硬件級(jí)的F5負(fù)載均衡設(shè)備相媲美
- 最高可以同時(shí)維護(hù)40000-50000個(gè)并發(fā)連接,單位時(shí)間內(nèi)處理的最大請(qǐng)求數(shù)為20000個(gè),最大處理能力可達(dá)10Git/s
- 支持多達(dá)8 種負(fù)載均衡算法,同時(shí)也支持會(huì)話(huà)保持
- 支持虛擬主機(jī)功能,從而實(shí)現(xiàn)web負(fù)載均衡更加靈活
- 支持連接拒絕、全透明代理等獨(dú)特功能
- 擁有強(qiáng)大的ACL支持,用于訪(fǎng)問(wèn)控制
- 其獨(dú)特的彈性二叉樹(shù)數(shù)據(jù)結(jié)構(gòu),使數(shù)據(jù)結(jié)構(gòu)的復(fù)雜性上升到了0(1),即數(shù)據(jù)的查詢(xún)速度不會(huì)隨著數(shù)據(jù)條目的增加而速度有所下降
- 支持客戶(hù)端的keepalive功能,減少客戶(hù)端與haproxy的多次三次握手導(dǎo)致資源量費(fèi),讓多個(gè)請(qǐng)求在一個(gè)tcp連接中完成
- 支持TCP加速,零復(fù)制功能,類(lèi)似于mmap機(jī)制
- 支持響應(yīng)池(response buffering)
- 支持RDP協(xié)議
- 基于源的粘性,類(lèi)似于nginx的ip_hash功能,把自同一客戶(hù)端的請(qǐng)求在一定時(shí)間內(nèi)始終調(diào)度到上游的同一服務(wù)器
- 更好統(tǒng)計(jì)數(shù)據(jù)接口,其web接口顯示后端冀全中各個(gè)服務(wù)器的接受、發(fā)送、拒絕、錯(cuò)誤等數(shù)據(jù)的統(tǒng)計(jì)信息
- 詳細(xì)的健康狀態(tài)檢測(cè),web接口中有關(guān)對(duì)上流服務(wù)器的健康檢測(cè)狀態(tài),并提供了一定的管理功能
- 基于流量的健康評(píng)估機(jī)制
- 基于http認(rèn)證
- 基于命令行的管理接口
- 日志分析器,可對(duì)日志進(jìn)行分析
1.3、常見(jiàn)負(fù)載均衡策略
Haproxy支持多種調(diào)度算法,最常用的有8種
1)RR(Round Robin)
RR算法是最簡(jiǎn)單最常用的一種算法,即輪詢(xún)調(diào)度
理解舉例:有三個(gè)節(jié)點(diǎn)A、B、C
第一個(gè)用戶(hù)訪(fǎng)問(wèn)會(huì)被指派到節(jié)點(diǎn)A
第二個(gè)用戶(hù)訪(fǎng)問(wèn)會(huì)被指派到節(jié)點(diǎn)B
第三個(gè)用戶(hù)訪(fǎng)問(wèn)會(huì)被指派到節(jié)點(diǎn)C
第四個(gè)用戶(hù)訪(fǎng)問(wèn)繼續(xù)指派到節(jié)點(diǎn)A,輪詢(xún)分配訪(fǎng)問(wèn)請(qǐng)求實(shí)現(xiàn)負(fù)載均衡效果
2)LC(Least Connections)
1.最小連接數(shù)算法,根據(jù)后端的節(jié)點(diǎn)連接數(shù)大小動(dòng)態(tài)分配前端請(qǐng)求
2.理解舉例: 有三個(gè)節(jié)點(diǎn)A、B、C,各節(jié)點(diǎn)的連接數(shù)分別為A:4 B:5 C:6
3.第一個(gè)用戶(hù)連接請(qǐng)求,會(huì)被指派到A上,連接數(shù)變?yōu)锳:5 B:5 C:6
4.第二個(gè)用戶(hù)請(qǐng)求會(huì)繼續(xù)分配到A上,連接數(shù)變?yōu)锳:6 B:5 C:6;再有新的請(qǐng)求會(huì)分配給B,每次將新的請(qǐng)求指派給連接數(shù)最小的客戶(hù)端
3.由于實(shí)際情況下A、B、C的連接數(shù)會(huì)動(dòng)態(tài)釋放,很難會(huì)出現(xiàn)一樣連接數(shù)的情況
4.此算法相比較rr算法有很大改進(jìn),是米錢(qián)用到比較多的一種算法
3)SH(Source Hashing)
基于來(lái)源訪(fǎng)問(wèn)調(diào)度算法,用于一些有Session會(huì)話(huà)記錄在服務(wù)端的場(chǎng)景,可以基于來(lái)源的IP、Cookie等做集群調(diào)度
理解舉例 有三個(gè)節(jié)點(diǎn)A、B、C,第一個(gè)用戶(hù)第一次訪(fǎng)問(wèn)被指派到了A,第二個(gè)用戶(hù)第一次訪(fǎng)問(wèn)被指派到了B
當(dāng)?shù)谝粋€(gè)用戶(hù)第二次訪(fǎng)問(wèn)時(shí)會(huì)被繼續(xù)指派到A,第二個(gè)用戶(hù)第二次訪(fǎng)問(wèn)時(shí)依舊會(huì)被指派到B,只要負(fù)載均衡器不重啟,第一個(gè)用戶(hù)都會(huì)被指派到A,第二個(gè)用戶(hù)訪(fǎng)問(wèn)都會(huì)被指派到B,實(shí)現(xiàn)集群的調(diào)度
此調(diào)度算法好處是實(shí)現(xiàn)會(huì)話(huà)保持,但某些IP訪(fǎng)問(wèn)量非常大時(shí)會(huì)引起負(fù)載不均衡,部分節(jié)點(diǎn)訪(fǎng)問(wèn)量超大,影響業(yè)務(wù)使用
4)uri
表示根據(jù)請(qǐng)求的URI,做cdn需使用
5)url_param
表示根據(jù)HTTP請(qǐng)求頭來(lái)鎖定每 一 次HTTP請(qǐng)求。
6)rdp—cookie(name)
表示根據(jù)據(jù)cookie (name)來(lái)鎖定并哈希每一次TCP請(qǐng)求。
7) source
表示根據(jù)請(qǐng)求的源IP,類(lèi)似Nginx的IP hash機(jī)制。
8) static-rr
表示根據(jù)權(quán)重,輪詢(xún)
1.4、LVS、Haproxy、Nginx區(qū)別
-
LVS基于Linux操作系統(tǒng)實(shí)現(xiàn)軟負(fù)載均衡,而Haproxy和Nginx是基于第三方應(yīng)用實(shí)現(xiàn)的軟負(fù)載均衡
-
LVS是可實(shí)現(xiàn)4層的IP負(fù)載均衡技術(shù),無(wú)法實(shí)現(xiàn)基于目錄、URL的轉(zhuǎn)發(fā)。而實(shí)現(xiàn)Haproxy和Nginx都可以實(shí)現(xiàn)4層和7層技術(shù),Haproxy可提供TCP和Http應(yīng)用的負(fù)載均衡綜合解決方案
-
LVS因?yàn)楣ぷ髟贗SO模型的第四層,其狀態(tài)監(jiān)測(cè)功能單一,而Haproxy在狀態(tài)監(jiān)測(cè)方面功能更豐富、強(qiáng)大,可支持端口、URL、腳本等多種狀態(tài)監(jiān)測(cè)方式
-
Haproxy功能強(qiáng)大,但整體性能低于4層模式的LVS負(fù)載均衡
-
Nginx主要用于web服務(wù)器或緩存服務(wù)器
1.5、 Haproxy的優(yōu)點(diǎn)
-
Haproxy也是支持虛擬主機(jī)的
-
Haproxy支持8種負(fù)載均衡器策略
-
Haproxy的優(yōu)點(diǎn)能補(bǔ)充nginx的一些缺點(diǎn),比如支持Session的保持,Cookie的引導(dǎo),同時(shí)支持通過(guò)獲取指定url來(lái)檢測(cè)后端服務(wù)器的狀態(tài)
-
Haproxy跟LVS類(lèi)似,本身就只是一款負(fù)載均衡軟件,單純從效率上來(lái)講Haproxy會(huì)比Nginx有更出色的負(fù)載均衡速度,在并發(fā)處理上也是優(yōu)于Nginx的
-
Haproxy支持TCP協(xié)議的負(fù)載均衡轉(zhuǎn)發(fā)
1.6、常見(jiàn)的Web集群調(diào)度器
-
目前常見(jiàn)的Web集群調(diào)度器分為軟件和硬件
-
軟件通常使用開(kāi)源的LVS、Haproxy、Nginx
-
硬件一般使用比較多的是F5,也有很多人使用國(guó)內(nèi)的一些產(chǎn)品,如梭子魚(yú)、綠盟等
二、Haproxy部署實(shí)例
Keepalived+Haproxy 實(shí)現(xiàn)負(fù)載均衡+動(dòng)靜分離
名稱(chēng) IP地址
HAproxy-Master | 192.168.2.100 |
---|---|
HAproxy-Backup | 192.168.2.106 |
Web-A | 192.168.2.103 |
Web-B | 192.168.2.104 |
Tomcat1 | 192.168.2.102 |
Tomcat2 | 192.168.2.105 |
編譯安裝Haproxy
#獲取安裝包
wget https://www.haproxy.org/download/2.8/src/haproxy-2.8.3.tar.gz
#解壓
tar zxvf haproxy-2.8.3.tar.gzcd haproxy-2.8.3/#編譯
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy#新建管理用戶(hù)
useradd -M -s /sbin/nologin haproxymkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
修改Haproxy配置文件,配置前后端,分別處理動(dòng)態(tài)資源和靜態(tài)資源
#配置文件
vim haproxy.cfgglobal log 127.0.0.1 local0 infolog 127.0.0.1 local1 warning maxconn 30000pidfile /var/run/haproxy.piduser haproxygroup haproxydaemonspread-checks 2defaults log globalmode http #七層代理option http-keep-aliveoption forwardforoption httplogoption dontlognulloption redispatchoption abortonclosemaxconn 20000retries 3timeout http-request 2stimeout queue 3stimeout connect 1stimeout client 10stimeout server 2stimeout http-keep-alive 10stimeout check 2s#前端配置,根據(jù)用戶(hù)的訪(fǎng)問(wèn)請(qǐng)求,跳轉(zhuǎn)到對(duì)應(yīng)的后端?
frontend http-in #監(jiān)聽(tīng)地址 bind *:80acl dynamic path_end -i .jspuse_backend tomcat_server if dynamic#都沒(méi)匹配到,跳轉(zhuǎn)到默認(rèn)default_backend nginx_serversbackend tomcat_serverbalance roundrobinoption http-server-closecookie HA_STICKY_dy insert indirect nocacheserver tomcat1 192.168.2.102:8080 cookie tomcat1 inter 2000 rise 2 fall 3server tomcat2 192.168.2.105:8080 cookie tomcat2 checkbackend nginx_serversbalance roundrobin#節(jié)點(diǎn)服務(wù)器根目錄下要有此文件option httpchk GET /test.html server nginx1 192.168.2.103:80 check inter 2000 rise 2 fall 3server nginx2 192.168.2.104:80 check inter 2000 rise 2 fall 3listen statsbind *:1080stats enablestats refresh 30sstats uri /statsstats realm HAProxy\ Statsstats auth admin:admin
添加haproxy 系統(tǒng)服務(wù)
vim /etc/init.d/haproxy
#!/bin/bash
#chkconfig: 2345 90 30
#description: Haproxy Service Control ScriptPROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.cfg
PIDFILE=/var/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0start()
{echo -e "Starting $DESC: $PROGNAME\n"$DAEMON -f $CONFIGecho "......"
}stop()
{echo -e "Stopping $DESC: $PROGNAME\n"haproxy_pid="$(cat $PIDFILE)"kill $haproxy_pidecho "......"
}restart()
{echo -e "Restarting $DESC: $PROGNAME\n"$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)echo "......"
}case "$1" in
start)start;;stop)stop;;restart)restart;;*)echo "Usage: $SCRIPTNAME {start|stop|restart}"exit 1;;
esacexit 0cd /etc/init.d/
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy#加入系統(tǒng)服務(wù)管理ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start#補(bǔ)充知識(shí)
chkconfig --list haproxy
chkconfig --level 3 5 haproxy on
部署Tomcat并配置動(dòng)態(tài)頁(yè)面
#動(dòng)態(tài)資源
tar xf ap..
cd ap..
mv ap.. /usr/local/tomcat
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("動(dòng)態(tài)頁(yè)面 1,https://blog.csdn.net/q2524607033?type=blog");%>
</body>
</html>#Tomcat2
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("動(dòng)態(tài)頁(yè)面 1,https://blog.csdn.net/q2524607033?type=blog");%>
</body>
</html>
#啟動(dòng)tomcat,測(cè)試動(dòng)態(tài)頁(yè)面
/usr/local/tomcat/bin/startup.sh192.168.2.102:8080/test/index.jsp
192.168.2.105:8080/test/index.jsp
安裝keepalived
#安裝keepalive
yum install -y keepalived#寫(xiě)檢測(cè)腳本
vim /etc/keepalived/ch.sh#!/bin/bash
#使用killall -0檢查haproxy實(shí)例是否存在,性能高于ps命令
if ! killall -0 haproxy; thensystemctl stop keepalived
fichmod +x /etc/keepalived/check_haproxy.sh
編寫(xiě)Keepalived配置文件,確定主備
#主服務(wù)器
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id LVS_HA1 #虛擬路由名稱(chēng)
}#HAProxy健康檢查配置
vrrp_script chk_haproxy {script "/etc/keepalived/ch.sh" #指定健康檢查腳本interval 2 #腳本運(yùn)行周期weight 2 #每次檢查的加權(quán)權(quán)重值
}#虛擬路由配置
vrrp_instance VI_1 {state MASTER #本機(jī)實(shí)例狀態(tài),MASTER/BACKUP,備機(jī)配置文件中設(shè)置BACKUPinterface ens33 #本機(jī)網(wǎng)卡名稱(chēng),使用ifconfig命令查看virtual_router_id 51 #虛擬路由編號(hào),主備機(jī)保持一致priority 100 #本機(jī)初始權(quán)重,備機(jī)設(shè)置小于主機(jī)的值advert_int 1 #爭(zhēng)搶虛地址的周期,秒virtual_ipaddress {192.168.2.188 #虛地址IP,主備機(jī)保持一致}track_script {chk_haproxy #對(duì)應(yīng)的健康檢查配置}
}systemctl start keepalivedip addr
備服務(wù)器的配置類(lèi)似
效果測(cè)試
動(dòng)靜分離+負(fù)載均衡測(cè)試
高可用測(cè)試
四、日志定義優(yōu)化
默認(rèn)haproxy的日志是輸出到系統(tǒng)的syslog中,查看起來(lái)不是非常方便,為了更好的管理haproxy的日志,我們?cè)谏a(chǎn)環(huán)境中一般單獨(dú)定義出來(lái)。需要將haproxy的info及notice日志分別記錄到不同的日志文件中。
需要修改rsyslog配置,為了便于管理。將haproxy相關(guān)的配置獨(dú)立定義到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog啟動(dòng)時(shí)會(huì)自動(dòng)加載此目錄下的所有配置文件。
1. #修改配置文件
vim /etc/haproxy/haproxy.cfg
globallog 192.168.59.118 local6 infolog /dev/log local0 notice2. #修改rsyslog配置
vim /etc/rsyslog.conf
14 # Provides UDP syslog reception
15 $ModLoad imudp #注釋掉
16 $UDPServerRun 514 #注釋掉
...
74 local6.* /var/log/haproxy.log3. # 重啟服務(wù)
systemctl restart rsyslog.service
service haproxy restart4. #查看haproxy的訪(fǎng)問(wèn)請(qǐng)求日志信息
訪(fǎng)問(wèn)網(wǎng)頁(yè)后查看日志
tail -f /var/log/haproxy.log
修改配置文件
修改rsyslog配置
重啟服務(wù)
查看haproxy的訪(fǎng)問(wèn)請(qǐng)求日志信息