服務(wù)器 無法訪問網(wǎng)站上海網(wǎng)絡(luò)推廣外包公司
LVS+Haproxy
- 一、Haproxy簡介
- 1.1、Haproxy應(yīng)用分析
- 1.2、Haproxy的特性
- 1.3、常見負(fù)載均衡策略
- 1.4、LVS、Haproxy、Nginx區(qū)別
- 1.5、 Haproxy的優(yōu)點
- 1.6、常見的Web集群調(diào)度器
- 二、Haproxy部署實例
- 四、日志定義優(yōu)化
一、Haproxy簡介
Haproxy 是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負(fù)載均衡,以及基于TCP和HTTP的應(yīng)用程序代理。
1.1、Haproxy應(yīng)用分析
-
LVS在企業(yè)應(yīng)用中抗負(fù)載能力很強(qiáng),但存在不足
-
LVS不支持正則處理,不能實現(xiàn)動靜分離
-
對于大型網(wǎng)站,LVS的實施配置復(fù)雜,維護(hù)成本相對較高
-
-
Haproxy是一款可提供高可用性、負(fù)載均衡、及基于TCP和HTTP應(yīng)用的代理軟件
- 適用于負(fù)載大的web站點
- 運(yùn)行在硬件上可支持?jǐn)?shù)以萬計的并發(fā)連接的連接請求
1.2、Haproxy的特性
- 可靠性和穩(wěn)定性非常好,可以與硬件級的F5負(fù)載均衡設(shè)備相媲美
- 最高可以同時維護(hù)40000-50000個并發(fā)連接,單位時間內(nèi)處理的最大請求數(shù)為20000個,最大處理能力可達(dá)10Git/s
- 支持多達(dá)8 種負(fù)載均衡算法,同時也支持會話保持
- 支持虛擬主機(jī)功能,從而實現(xiàn)web負(fù)載均衡更加靈活
- 支持連接拒絕、全透明代理等獨特功能
- 擁有強(qiáng)大的ACL支持,用于訪問控制
- 其獨特的彈性二叉樹數(shù)據(jù)結(jié)構(gòu),使數(shù)據(jù)結(jié)構(gòu)的復(fù)雜性上升到了0(1),即數(shù)據(jù)的查詢速度不會隨著數(shù)據(jù)條目的增加而速度有所下降
- 支持客戶端的keepalive功能,減少客戶端與haproxy的多次三次握手導(dǎo)致資源量費,讓多個請求在一個tcp連接中完成
- 支持TCP加速,零復(fù)制功能,類似于mmap機(jī)制
- 支持響應(yīng)池(response buffering)
- 支持RDP協(xié)議
- 基于源的粘性,類似于nginx的ip_hash功能,把自同一客戶端的請求在一定時間內(nèi)始終調(diào)度到上游的同一服務(wù)器
- 更好統(tǒng)計數(shù)據(jù)接口,其web接口顯示后端冀全中各個服務(wù)器的接受、發(fā)送、拒絕、錯誤等數(shù)據(jù)的統(tǒng)計信息
- 詳細(xì)的健康狀態(tài)檢測,web接口中有關(guān)對上流服務(wù)器的健康檢測狀態(tài),并提供了一定的管理功能
- 基于流量的健康評估機(jī)制
- 基于http認(rèn)證
- 基于命令行的管理接口
- 日志分析器,可對日志進(jìn)行分析
1.3、常見負(fù)載均衡策略
Haproxy支持多種調(diào)度算法,最常用的有8種
1)RR(Round Robin)
RR算法是最簡單最常用的一種算法,即輪詢調(diào)度
理解舉例:有三個節(jié)點A、B、C
第一個用戶訪問會被指派到節(jié)點A
第二個用戶訪問會被指派到節(jié)點B
第三個用戶訪問會被指派到節(jié)點C
第四個用戶訪問繼續(xù)指派到節(jié)點A,輪詢分配訪問請求實現(xiàn)負(fù)載均衡效果
2)LC(Least Connections)
1.最小連接數(shù)算法,根據(jù)后端的節(jié)點連接數(shù)大小動態(tài)分配前端請求
2.理解舉例: 有三個節(jié)點A、B、C,各節(jié)點的連接數(shù)分別為A:4 B:5 C:6
3.第一個用戶連接請求,會被指派到A上,連接數(shù)變?yōu)锳:5 B:5 C:6
4.第二個用戶請求會繼續(xù)分配到A上,連接數(shù)變?yōu)锳:6 B:5 C:6;再有新的請求會分配給B,每次將新的請求指派給連接數(shù)最小的客戶端
3.由于實際情況下A、B、C的連接數(shù)會動態(tài)釋放,很難會出現(xiàn)一樣連接數(shù)的情況
4.此算法相比較rr算法有很大改進(jìn),是米錢用到比較多的一種算法
3)SH(Source Hashing)
基于來源訪問調(diào)度算法,用于一些有Session會話記錄在服務(wù)端的場景,可以基于來源的IP、Cookie等做集群調(diào)度
理解舉例 有三個節(jié)點A、B、C,第一個用戶第一次訪問被指派到了A,第二個用戶第一次訪問被指派到了B
當(dāng)?shù)谝粋€用戶第二次訪問時會被繼續(xù)指派到A,第二個用戶第二次訪問時依舊會被指派到B,只要負(fù)載均衡器不重啟,第一個用戶都會被指派到A,第二個用戶訪問都會被指派到B,實現(xiàn)集群的調(diào)度
此調(diào)度算法好處是實現(xiàn)會話保持,但某些IP訪問量非常大時會引起負(fù)載不均衡,部分節(jié)點訪問量超大,影響業(yè)務(wù)使用
4)uri
表示根據(jù)請求的URI,做cdn需使用
5)url_param
表示根據(jù)HTTP請求頭來鎖定每 一 次HTTP請求。
6)rdp—cookie(name)
表示根據(jù)據(jù)cookie (name)來鎖定并哈希每一次TCP請求。
7) source
表示根據(jù)請求的源IP,類似Nginx的IP hash機(jī)制。
8) static-rr
表示根據(jù)權(quán)重,輪詢
1.4、LVS、Haproxy、Nginx區(qū)別
-
LVS基于Linux操作系統(tǒng)實現(xiàn)軟負(fù)載均衡,而Haproxy和Nginx是基于第三方應(yīng)用實現(xiàn)的軟負(fù)載均衡
-
LVS是可實現(xiàn)4層的IP負(fù)載均衡技術(shù),無法實現(xiàn)基于目錄、URL的轉(zhuǎn)發(fā)。而實現(xiàn)Haproxy和Nginx都可以實現(xiàn)4層和7層技術(shù),Haproxy可提供TCP和Http應(yīng)用的負(fù)載均衡綜合解決方案
-
LVS因為工作在ISO模型的第四層,其狀態(tài)監(jiān)測功能單一,而Haproxy在狀態(tài)監(jiān)測方面功能更豐富、強(qiáng)大,可支持端口、URL、腳本等多種狀態(tài)監(jiān)測方式
-
Haproxy功能強(qiáng)大,但整體性能低于4層模式的LVS負(fù)載均衡
-
Nginx主要用于web服務(wù)器或緩存服務(wù)器
1.5、 Haproxy的優(yōu)點
-
Haproxy也是支持虛擬主機(jī)的
-
Haproxy支持8種負(fù)載均衡器策略
-
Haproxy的優(yōu)點能補(bǔ)充nginx的一些缺點,比如支持Session的保持,Cookie的引導(dǎo),同時支持通過獲取指定url來檢測后端服務(wù)器的狀態(tài)
-
Haproxy跟LVS類似,本身就只是一款負(fù)載均衡軟件,單純從效率上來講Haproxy會比Nginx有更出色的負(fù)載均衡速度,在并發(fā)處理上也是優(yōu)于Nginx的
-
Haproxy支持TCP協(xié)議的負(fù)載均衡轉(zhuǎn)發(fā)
1.6、常見的Web集群調(diào)度器
-
目前常見的Web集群調(diào)度器分為軟件和硬件
-
軟件通常使用開源的LVS、Haproxy、Nginx
-
硬件一般使用比較多的是F5,也有很多人使用國內(nèi)的一些產(chǎn)品,如梭子魚、綠盟等
二、Haproxy部署實例
Keepalived+Haproxy 實現(xiàn)負(fù)載均衡+動靜分離
名稱 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#新建管理用戶
useradd -M -s /sbin/nologin haproxymkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
修改Haproxy配置文件,配置前后端,分別處理動態(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ù)用戶的訪問請求,跳轉(zhuǎn)到對應(yīng)的后端?
frontend http-in #監(jiān)聽地址 bind *:80acl dynamic path_end -i .jspuse_backend tomcat_server if dynamic#都沒匹配到,跳轉(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é)點服務(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ǔ)充知識
chkconfig --list haproxy
chkconfig --level 3 5 haproxy on
部署Tomcat并配置動態(tài)頁面
#動態(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("動態(tài)頁面 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("動態(tài)頁面 1,https://blog.csdn.net/q2524607033?type=blog");%>
</body>
</html>
#啟動tomcat,測試動態(tài)頁面
/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#寫檢測腳本
vim /etc/keepalived/ch.sh#!/bin/bash
#使用killall -0檢查haproxy實例是否存在,性能高于ps命令
if ! killall -0 haproxy; thensystemctl stop keepalived
fichmod +x /etc/keepalived/check_haproxy.sh
編寫Keepalived配置文件,確定主備
#主服務(wù)器
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id LVS_HA1 #虛擬路由名稱
}#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ī)實例狀態(tài),MASTER/BACKUP,備機(jī)配置文件中設(shè)置BACKUPinterface ens33 #本機(jī)網(wǎng)卡名稱,使用ifconfig命令查看virtual_router_id 51 #虛擬路由編號,主備機(jī)保持一致priority 100 #本機(jī)初始權(quán)重,備機(jī)設(shè)置小于主機(jī)的值advert_int 1 #爭搶虛地址的周期,秒virtual_ipaddress {192.168.2.188 #虛地址IP,主備機(jī)保持一致}track_script {chk_haproxy #對應(yīng)的健康檢查配置}
}systemctl start keepalivedip addr
備服務(wù)器的配置類似
效果測試
動靜分離+負(fù)載均衡測試
高可用測試
四、日志定義優(yōu)化
默認(rèn)haproxy的日志是輸出到系統(tǒng)的syslog中,查看起來不是非常方便,為了更好的管理haproxy的日志,我們在生產(chǎn)環(huán)境中一般單獨定義出來。需要將haproxy的info及notice日志分別記錄到不同的日志文件中。
需要修改rsyslog配置,為了便于管理。將haproxy相關(guān)的配置獨立定義到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog啟動時會自動加載此目錄下的所有配置文件。
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的訪問請求日志信息
訪問網(wǎng)頁后查看日志
tail -f /var/log/haproxy.log
修改配置文件
修改rsyslog配置
重啟服務(wù)
查看haproxy的訪問請求日志信息