入坑系列之HAProxy負載均衡

在大型系統(tǒng)設(shè)計中用代理在負載均衡是最常見的一種方式,而相對靠譜的解決方案中Nginx、HAProxy、LVS、F5在各大場中用得比較普遍,各有各的優(yōu)勢和使用場景,由于本次要使用到TCP,因此Nginx只能在HTTP層負載,因此用HAProxy來負載,為什么不用LVS?因為配置太麻煩。

HAProxy是免費、極速且可靠的用于為TCP和基于HTTP應(yīng)用程序提供高可用、負載均衡和代理服務(wù)的解決方案,尤其適用于高負載且需要持久連接或7層處理機制的web站點。HAProxy還可以將后端的服務(wù)器與網(wǎng)絡(luò)隔離,起到保護后端服務(wù)器的作用。HAProxy的負載均衡能力雖不如LVS,但也是相當不錯,而且由于其工作在7層,可以對http請求報文做深入分析,按照自己的需要將報文轉(zhuǎn)發(fā)至后端不同的服務(wù)器(例如動靜分離),這一點工作在4層的LVS無法完成。

環(huán)境

CentOS6.X

HAProxy 1.7.3

用root用戶安裝

下載

若在線安裝不用下載,可直接通過yum命令安裝(建議),不過需要聯(lián)網(wǎng)。

去官網(wǎng)下載 :http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz

下載后放進CentOS中的/usr/local/ ?文件夾中(至于怎么放,你不會 這個鍋我不背,去學(xué)學(xué)Linux 操作基礎(chǔ))

關(guān)閉SElinux、配置防火墻

vi /etc/selinux/config#SELINUX=enforcing #注釋掉#SELINUXTYPE=targeted #注釋掉SELINUX=disabled#增加:wq!#保存退出setenforce 0#使配置立即生效

vi /etc/sysconfig/iptables#編輯-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT#允許組播地址通信(在做keepalived時用得到)-A RH-Firewall-1-INPUT -p? ? vrrp? ? -j ACCEPT#允許VRRP(虛擬路由器冗余協(xié))通信-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT#允許80端口通過防火墻:wq!#保存退出service iptables restart#重啟防火墻使配置生效

創(chuàng)建HAProxy運行賬戶和組

[root@H32 local]#groupadd haproxy #添加haproxy組[root@H32 local]#useradd -g haproxy haproxy -s /bin/false #創(chuàng)建nginx運行賬戶haproxy并加入到haproxy組,不允許haproxy

安裝

分兩種:

1、在線裝:yum install haproxy (建議)

2、安裝包:

環(huán)境中要有g(shù)cc,用于編譯,一般安裝環(huán)境時都會有,若沒有 運行 :

yum install -y gcc

進入local文件夾中

[root@H32 ~]#cd /usr/local

然后解壓下載好haproxy包到當前文件夾

[root@H32 local]#tar -zxvf haproxy-1.7.3.tar.gz[root@H32 local]#cd haproxy-1.7.3

安裝

[root@H32 haproxy-1.7.3]#make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy-1.7.3 #編譯(源碼才需要)? uname -r #查看系統(tǒng)內(nèi)核版本號[root@H32 haproxy-1.7.3]#make install PREFIX=/usr/local/haproxy-1.7.3 #安裝 haproxy-1.7.3為解壓后的文件路徑(很重要)

設(shè)置HAProxy

mkdir -p /usr/local/haproxy-1.7.3/conf#創(chuàng)建配置文件目錄

mkdir -p /etc/haproxy#創(chuàng)建配置文件目錄

touch /usr/local/haproxy-1.7.3/conf/haproxy.cfg#創(chuàng)建配置文件

ln -s /usr/local/haproxy-1.7.3/conf/haproxy.cfg? /etc/haproxy/haproxy.cfg#添加配置文件軟連接

cp -r /usr/local/haproxy-1.7.3/examples/errorfiles? /usr/local/haproxy-1.7.3/errorfiles#拷貝錯誤頁面

ln -s /usr/local/haproxy-1.7.3/errorfiles? /etc/haproxy/errorfiles#添加軟連接

mkdir -p /usr/local/haproxy-1.7.3/log#創(chuàng)建日志文件目錄

touch /usr/local/haproxy-1.7.3/log/haproxy.log#創(chuàng)建日志文件

ln -s /usr/local/haproxy-1.7.3/log/haproxy.log? /var/log/haproxy.log#添加軟連接

cp /usr/local/haproxy-1.7.3/examples/haproxy.init? /etc/rc.d/init.d/haproxy#拷貝開機啟動文件

chmod +x /etc/rc.d/init.d/haproxy#添加腳本執(zhí)行權(quán)限

chkconfig haproxy on#設(shè)置開機啟動

ln -s /usr/local/haproxy-1.7.3/sbin/haproxy? /usr/sbin#添加軟連接

注意上面的文件夾,若與上面的文件夾路徑一致,可以直接復(fù)制運行。

配置haproxy.cfg參數(shù)

vi? /usr/local/haproxy-1.7.3/conf/haproxy.cfg#編輯

這里是最關(guān)鍵的設(shè)置,在此有兩個相同的服務(wù)由兩臺服務(wù)器提供:192.168.30.33,192.168.30.34

#---------------------------------------------------------------------#Global settings#---------------------------------------------------------------------globallog127.0.0.1 local2###[err warning info debug]chroot/usr/local/haproxy-1.7.3pidfile/var/run/haproxy.pid###haproxy的pid存放路徑,啟動進程的用戶必須有權(quán)限訪問此文件maxconn? 4000###最大連接數(shù),默認4000user? haproxy

group? haproxy

daemon###創(chuàng)建1個進程進入deamon模式運行。此參數(shù)要求將運行模式設(shè)置為"daemon"#---------------------------------------------------------------------#common defaults that all the 'listen' and 'backend' sections will#use if not designated in their block#---------------------------------------------------------------------defaults

mode? http###默認的模式,tcp是4層,http是7層,health只會返回OK若是混合模式則 mode 不需要設(shè)置logglobal###采用全局定義的日志option? dontlognull###不記錄健康檢查的日志信息option? httpclose###每次請求完畢后主動關(guān)閉http通道option? httplog###日志類別http日志格式混合模式 此處還需要加上 tcplog#option? forwardfor###如果后端服務(wù)器需要獲得客戶端真實ip需要配置的參數(shù),可以從Http Header中獲得客戶端ipoption? redispatch###serverId對應(yīng)的服務(wù)器掛掉后,強制定向到其他健康的服務(wù)器timeout connect 10s#default 10 second timeout if a backend is not foundtimeout client 10s###客戶端連接超時timeout server 10s###服務(wù)器連接超時maxconn? ? 60000###最大連接數(shù)retries? ? 3###3次連接失敗就認為服務(wù)不可用,也可以通過后面設(shè)置########統(tǒng)計頁面配置########listen admin_stats#監(jiān)聽端口bind 0.0.0.0:8089#啟用狀態(tài)監(jiān)控stats enable

mode http

logglobal#統(tǒng)計頁面URLstats uri /stats#統(tǒng)計頁面密碼框上提示文本stats realm Haproxy\ Statistics#統(tǒng)計頁面用戶名和密碼設(shè)置stats auth admin:admin#隱藏統(tǒng)計頁面上HAProxy的版本信息#stats hide-version#當通過認證才可管理stats adminifTRUE#統(tǒng)計頁面自動刷新時間stats refresh 30s########WEB配置#################listen web1080

bind0.0.0.0:1080mode http

option httplog

logglobalmaxconn3000balance leastconnserver web33192.168.80.33:8007? weight 1 rise 2 fall 3server web34 192.168.80.34:8007 weight 1 rise 2 fall 3#---------------------------------------------------------------------#main frontend which proxys to the backends 這里不需要動靜分離,所以全部注釋掉#---------------------------------------------------------------------#frontend? main *:5000#acl url_static? ? ? path_beg? ? ? -i /static /images /javascript /stylesheets#acl url_static? ? ? path_end? ? ? -i .jpg .gif .png .css .js#use_backend static? ? ? ? ? if url_static#default_backend? ? ? ? ? ? app#---------------------------------------------------------------------#static backend for serving up images, stylesheets and such#---------------------------------------------------------------------#backend static#balance? ? roundrobin#server? ? ? static 127.0.0.1:4331 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#backend app#balance? ? roundrobin#server? app1 127.0.0.1:5001 check#server? app2 127.0.0.1:5002 check#server? app3 127.0.0.1:5003 check#server? app4 127.0.0.1:5004 check#---------------------------------------------------------------------#round robin balancing between the various backends#---------------------------------------------------------------------#errorloc? 503? http://www.osyunwei.com/404.htmlerrorfile 403 /etc/haproxy/errorfiles/403.http

errorfile500 /etc/haproxy/errorfiles/500.http

errorfile502 /etc/haproxy/errorfiles/502.http

errorfile503 /etc/haproxy/errorfiles/503.http

errorfile504 /etc/haproxy/errorfiles/504.http

統(tǒng)一綁定的對外接口為1080, 監(jiān)控頁面端口為8089。

啟動

:wq!#保存退出

service haproxy start#啟動

#設(shè)置開機啟動

chkconfig haproxy on

設(shè)置HAProxy日志

vi? /etc/syslog.conf#編輯,在最下邊增加#

haproxy.log

local0.*? /var/log/haproxy.log

local1.*? /var/log/haproxy.log

local2.*? /var/log/haproxy.log

local3.*? /var/log/haproxy.log

:wq!#保存退出

vi? /etc/sysconfig/rsyslog#編輯修改

SYSLOGD_OPTIONS="-r -m 0"#接收遠程服務(wù)器日志

:wq!#保存退出

service rsyslog restart#重啟syslog

監(jiān)控頁面

打開監(jiān)控頁面,用戶名密碼為admin,出現(xiàn)下面的頁面就說明配置成功:

http://192.168.30.32:8089/stats

service haproxy stop#關(guān)閉service haproxy restart#重啟

擴展問題:

此處只做了簡單的IP請求負載,還可以做TCP層的負載,但里面的設(shè)置需要根據(jù)自己的實際情況不停的壓力測試進行調(diào)置。

此后還要做Keepalived + HAProxy 多機熱備的負載實用方案。

還可做mysql的讀寫負載、動靜態(tài)資源分離等等

ACL規(guī)則介紹

ACL控制哪些開放,往哪里轉(zhuǎn),哪些屏蔽 ,具體的內(nèi)容網(wǎng)上也有介紹,此處只做拋磚引玉。

實例:實現(xiàn)動靜分離功能

首先定義兩個backend,分別以動態(tài)和靜態(tài)進行分組

backend jingtai

balance roundrobin

server web1 10.0.10.82:80 check weight 1maxconn 2000

backend dongtai

balance roundrobin

server web2 10.0.10.83:80 check weight 1maxconn 3000

配置frontend

frontend web_server

bind *:80

default_backend webservers

acl badguy src 10.0.10.1

acl denyfile path /1.html

#http-request deny if badguy denyfile

acl static path_end .html

use_backend jingtai if static

default_backend dongtai

定義acl名稱為static ,如果訪問匹配是.html的文件,那么直接跳轉(zhuǎn)至jingtai 這個backend

如果訪問的不匹配.html 那么直接跳轉(zhuǎn)至默認backend dongtai組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 參考文檔: 1.haproxy:http://www.haproxy.org/ 本文涉及haproxy的安裝,并做...
    Netonline閱讀 2,448評論 1 51
  • 互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識 一、網(wǎng)站常見架構(gòu) 負載層 頁面緩存層 web層 數(shù)據(jù)層 二、運維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 4,852評論 0 9
  • 目錄: HAProxy是什么 HAProxy的核心能力和關(guān)鍵特性 HAProxy的安裝和運行 使用HAProxy搭...
    kelgon閱讀 80,047評論 9 159
  • 因為昨天晚上我們睡得都很晚,所以今天早上我們一起睡了一個大懶覺,十點才起床。 女兒和同學(xué)約好下...
    靜等花開之心路閱讀 432評論 10 13
  • 小乙哥,大名燕青,江湖俗稱:浪子燕青,小乙哥。隨主人盧俊義入梁山,封天巧星,位列36天罡第36位,曾以百步穿楊的的...
    莊生的蝶夢閱讀 939評論 1 4