烂泥:高负载均衡学习haproxy之安装与配置
本文首發(fā)于爛泥行天下
有關(guān)高負(fù)載均衡的軟件,目前使用比較多的是haproxy、nginx和lvs。下面我們就開始學(xué)習(xí)haprxoy這款軟件。
一、haproxy介紹
以下開始介紹有關(guān)haproxy的原理及其優(yōu)點。
1.1、haproxy原理
haproxy提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理,支持虛擬主機(jī),它是免費、快速并且可靠的一種解決方案。
haproxy特別適用于那些負(fù)載特別大的web站點,這些站點通常又需要會話保持或七層處理。haproxy運(yùn)行在時下的硬件上,完全可以支持?jǐn)?shù)以萬計的并發(fā)連接,并且它的運(yùn)行模式使得它可以很簡單安全的整合進(jìn)您當(dāng)前的架構(gòu)中,同時可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。
haproxy實現(xiàn)了一種事件驅(qū)動、單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)。多進(jìn)程或多線程模型受內(nèi)存限制、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。
事件驅(qū)動模型因為在有更好的資源和時間管理的用戶端(User-Space)實現(xiàn)所有這些任務(wù),所以沒有這些問題。此模型的弊端是,在多核系統(tǒng)上,這些程序通常擴(kuò)展性較差。這就是為什么他們必須進(jìn)行優(yōu)化以使每個CPU時間片(Cycle)做更多的工作。
1.2、haproxy的優(yōu)點
(1)免費開源,穩(wěn)定性也是非常好。單haproxy也跑得不錯,穩(wěn)定性可以與硬件級的F5相媲美。
(2)根據(jù)官方文檔,haproxy可以跑滿10Gbps,這個數(shù)值作為軟件級負(fù)載均衡器是相當(dāng)驚人的。
(3)haproxy支持連接拒絕:因為維護(hù)一個連接的打開的開銷是很低的,有時我們很需要限制***蠕蟲(attack bots),也就是說限制它們的連接打開從而限制它們的危害。這個已經(jīng)為一個陷于小型DDoS***的網(wǎng)站開發(fā)了而且已經(jīng)拯救了很多站點,這個優(yōu)點也是其它負(fù)載均衡器沒有的。
(4)haproxy支持全透明代理(已具備硬件防火墻的典型特點):可以用客戶端IP地址或者任何其他地址來連接后端服務(wù)器。這個特性僅在Linux 2.4/2.6內(nèi)核打了tcp proxy補(bǔ)丁后才可以使用。這個特性也使得為某特殊服務(wù)器處理部分流量同時又不修改服務(wù)器的地址成為可能。
(5)haproxy現(xiàn)多于線上的Mysql集群環(huán)境,我們常用于它作為MySQL(讀)負(fù)載均衡。
(6)自帶強(qiáng)大的監(jiān)控服務(wù)器狀態(tài)的頁面,實際環(huán)境中我們結(jié)合Nagios進(jìn)行郵件或短信報警。
(7)HAProxy支持虛擬主機(jī),許多朋友說它不支持虛擬主機(jī)是錯誤的,通過測試我們知道,HAProxy是支持虛擬主機(jī)的。
PS:本次實驗的OS為ubuntu server 14.04。
二、業(yè)務(wù)架構(gòu)圖
現(xiàn)在我們以實際的業(yè)務(wù)架構(gòu)圖,來使用haproxy。業(yè)務(wù)架構(gòu)圖如下:
這個是基本的業(yè)務(wù)架構(gòu)圖,對外是haproxy這臺服務(wù)器。目前暫時沒有考慮haproxy的單點故障問題,這個問題我們會在后續(xù)的keepalived文章中會進(jìn)行介紹。
現(xiàn)在要求如下:
2.1、域名跳轉(zhuǎn)
客戶端訪問http://dg.test.com時,要把請求分發(fā)到192.168.5.171:8080、192.168.5.174:8080、192.168.5.178:8080,這三臺服務(wù)器上。
客戶端訪問http://ilanni.test.com時,要把請求分發(fā)到ilanni.com,這臺服務(wù)器上。
2.2、IP地址跳轉(zhuǎn)
客戶端訪問http://192.168.5.171時,要把請求分發(fā)到192.168.5.174:80、192.168.5.178:80這兩臺服務(wù)器上。同時還要求客戶端每一次訪問,都跳轉(zhuǎn)到不同的服務(wù)器上。
2.3、端口跳轉(zhuǎn)
客戶端訪問http://dg.test.com:8090和http://ilanni.test.com:8090這兩個地址時,要把請求分發(fā)到192.168.5.174:8090、192.168.5.178:8090,這兩臺服務(wù)器上。
2.4、默認(rèn)跳轉(zhuǎn)
如果客戶端訪問的不是dg.test.com與192.168.5.171,這兩個地址的話,要把請求全部分發(fā)到192.168.5.178:8080上。
2.5、多ACL匹配
如果客戶端的IP是192.168.5.140,同時訪問的是http://192.168.5.171時,要把請求分發(fā)到www.ilanni.com上。
三、安裝haproxy
haproxy的官網(wǎng)是http://www.haproxy.org/,如果打不開此站點,請***(如何***,聯(lián)系我哦)。
haproxy的安裝我們可以分為源碼方式和apt-get方式。下面對其安裝方式進(jìn)行一一講解。
3.1 源碼方式安裝haproxy
haprxoy目前最新的版本為1.6,為了業(yè)務(wù)的穩(wěn)定,在此我們選擇的是1.3.15.27這個版本。
在進(jìn)行源碼安裝之前,首先要安裝相關(guān)的軟件庫。如下:
sudo apt-get -y install make gcc
創(chuàng)建運(yùn)行haproxy時,使用的用戶。在此我們使用haproxy這個用戶,而且此用戶不能登錄到系統(tǒng)。如下:
sudo useradd -m haproxy
cat /etc/passwd |grep haproxy
通過上圖,我們可以看到haproxy用戶及用戶組的ID均為1005。
現(xiàn)在開始下載源碼包如下:
wget http://www.haproxy.org/download/1.3/src/haproxy-1.3.15.27.tar.gz
解壓源碼包,如下:
tar -xf haproxy-1.3.15.27.tar.gz
cd haproxy-1.3.15.27/
查看haproxy的安裝文件,如下:
more README
這張圖很明顯的告訴我們,編譯安裝haproxy需要的軟件庫。除此之外還需要選擇OS的內(nèi)核版本,linux2.6以上的版本,我們都選擇linux26。
通過查看安裝文檔,我們可以很清楚的看出要編譯haproxy,我們首先要知道OS內(nèi)核版本以及OS的位數(shù)。如下:
uname –a
通過上圖,我們可以很容易的看出linux內(nèi)核的版本與OS的位數(shù)。
現(xiàn)在開始編譯haproxy,如下:
make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
其中TARGET表示OS的內(nèi)核版本,ARCH表示OS的位數(shù),PREFIX表示haprxoy的安裝路徑。
現(xiàn)在開始安裝haproxy,如下:
sudo make install PREFIX=/usr/local/haproxy
查看安裝后的文件,如下:
ll /usr/local/haproxy/
編輯haproxy的配置文件,haproxy默認(rèn)給我們提供一個配置文件模版。如下:
sudo cp examples/haproxy.cfg /usr/local/haproxy/
查看haprxoy的版本,如下:
/usr/local/haproxy/sbin/haproxy -v
通過上圖,可以看到haproxy的版本確實是1.3.27。有關(guān)haproxy的配置實例見第三章。
3.2 apt-get方式安裝haproxy
apt-get方式安裝haproxy,如下:
sudo apt-get -y install haproxy
查看haproxy安裝的文件
dpkg -L haproxy
安裝完畢后,haproxy默認(rèn)已經(jīng)啟動。如下:
ps -ef |grep haproxy
查看haproxy版本,如下:
haproxy -v
通過上圖,我們知道現(xiàn)在haproxy的版本為1.5.4。
注意:apt-get方式安裝haproxy,如果版本為1.4.24的話。我們一定要修改/etc/default/haproxy,如下:
sudo vi /etc/default/haproxy
ENABLED=1
如果不修改的話,使用haproxy啟動腳本的話,是沒有用處的,也就說腳本不會重新加載haproxy的配置。
查看haproxy的配置文件,如下:
cat /etc/haproxy/haproxy.cfg
通過上圖,我們可以很明顯的看出默認(rèn)的配置文件里面是沒有內(nèi)容的。
四、配置haprxoy
haproxy安裝完畢后,我們來配置haproxy。源碼安裝的haprxoy在前面我們已經(jīng)講解了,haproxy提供的配置模版haproxy.cfg。
4.1、haproxy配置實例
我們現(xiàn)在就以這個模版為例,配置haproxy。haproxy配置文件內(nèi)容,如下:
grep -vE "^#|^$" haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
uid 1005
gid 1005
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen admin_stats
bind 192.168.5.171:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /stats
stats auth admin:admin
stats hide-version
frontend weblb
bind *:80
acl is_dg hdr_beg(host) dg.test.com
acl is_ilanni hdr_beg(host) ilanni.test.com
acl is_171 hdr_beg(host) 192.168.5.171
acl is_ip src 192.168.5.140
use_backend acl if is_171 is_ip
use_backend dgserver if is_dg
use_backend ilanni if is_ilanni
use_backend 171server if is_171
default_backend backend_default
backend dgserver
balance source
server web1 192.168.5.171:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
server web2 192.168.5.174:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
server web3 192.168.5.178:8080 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
backend 171server
balance roundrobin
server dg1 192.168.5.174:80 check
server dg2 192.168.5.178:80 check
backend ilanni
server web1 www.yuanbaopu.com:80 weight 3 check inter 2000 rise 2 fall 3
backend acl
balance source
server web1 www.ilanni.com:80 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
backend backend_default
server web1 192.168.5.178:8080 weight 3 check inter 2000 rise 2 fall 3
listen 8090
bind 0.0.0.0:8090
mode http
balance roundrobin
server web1 192.168.5.174:8090 maxconn 1024 weight 5 check inter 2000 rise 2 fall 3
server web2 192.168.5.178:8090 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
4.2、haproxy配置實例講解
有關(guān)haproxy配置文件我們先簡單介紹,如下:
global配置段,用于設(shè)定全局配置參數(shù)。
代理配置段中,主要是使用defaults、frontend、backend、listen關(guān)鍵詞。
defaults配置段用于為所有其它配置段提供默認(rèn)參數(shù),這配置默認(rèn)配置參數(shù)可由下一個“defaults”所重新設(shè)定。
frontend配置段用于定義一系列監(jiān)聽的套接字,這些套接字可接受客戶端請求并與之建立連接。
backend配置段用于定義一系列“后端”服務(wù)器,代理將會將對應(yīng)客戶端的請求轉(zhuǎn)發(fā)至這些服務(wù)器。
listen配置段通過關(guān)聯(lián)“前端”和“后端”定義了一個完整的代理,通常只對TCP流量有用。
在上述haproxy配置文件中,我們主要講解ACL的匹配規(guī)則。
acl is_dg hdr_beg(host) dg.test.com
該行定義一個is_dg規(guī)則,如果客戶端請求的是dg.test.com這個域名,則定義該規(guī)則為is_dg。
use_backend dgserver if is_dg
該定義一個dgserver服務(wù)器組,如果客戶端請求符合is_dg定義的規(guī)則,則把該客戶端的請求分發(fā)到dgserver服務(wù)器組。
acl is_ip src 192.168.5.140
該行定義一個is_ip規(guī)則,如果客戶端的IP地址是192.168.5.140,則定義該規(guī)則為is_ip。
use_backend acl if is_171 is_ip
該定義一個acl服務(wù)器組,如果客戶端請求同時符合is_ip和is_171定義的規(guī)則,則把該客戶端的請求分發(fā)到acl服務(wù)器組。
default_backend backend_default
該行定義一個默認(rèn)服務(wù)器組,如果客戶端請求不符合上述定義的任何一個規(guī)則,則把該客戶端的請求分發(fā)到backend_default服務(wù)器組。
其他的規(guī)則就不一一進(jìn)行講解了。
以上就是按照目前的業(yè)務(wù)要求,配置的haproxy。有關(guān)這些配置項參數(shù),我們會在下一篇文章中進(jìn)行詳細(xì)介紹。
五、查看haproxy監(jiān)控頁面
haproxy配置完畢后,現(xiàn)在來啟動haproxy,使用如下命令:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
ps -ef |grep haproxy
netstat -tunlp|grep 3173
現(xiàn)在我們來打開haproxy的監(jiān)控頁面,如下:
http://192.168.5.171:1080/stats
輸入用戶名和密碼后,haproxy監(jiān)控后臺服務(wù)器的情況,如下:
現(xiàn)在我們來看看haprxoy所有后臺服務(wù)器的情況,先來看看dgserver組,如下:
通過上圖,我們可以看到dgserver組,目前web1這臺服務(wù)器處于宕機(jī)狀態(tài)。也就是說haprxoy不會把客戶端的請求分發(fā)到web1服務(wù)器上了。
現(xiàn)在我們再來看看171server組,如下:
通過上圖,我們可以很明顯的看出171server組的服務(wù)器目前都是正常運(yùn)行的。
8090組服務(wù)器的情況,如下:
通過上圖,我們可以看到8090組的服務(wù)器也是有一臺是宕機(jī)的。
六、測試haproxy負(fù)載均衡
haprxoy配置完畢并正常啟動后,我們現(xiàn)在來根據(jù)業(yè)務(wù)的要求進(jìn)行測試。
6.1 測試域名跳轉(zhuǎn)
使用如下命令測試域名跳轉(zhuǎn):
curl http://dg.test.com
通過上圖,我們可以看到當(dāng)我們使用dg.test.com這個域名訪問時,haproxy確實為我們進(jìn)行跳轉(zhuǎn)了,而且跳轉(zhuǎn)到了192.168.5.174這臺服務(wù)器上。
因為考慮到客戶端session會話的問題,所以我們在配置haproxy負(fù)載均衡沒有使用roundrobin輪詢的方法,而是使用source方法。所以haproxy目前沒有把請求分發(fā)到192.168.5.171:8080、192.168.5.178:8080這兩臺服務(wù)器上。
現(xiàn)在我們訪問ilanni.test.com,如下:
通過上圖,我們可以看到訪問不同的域名,haproxy把請求分發(fā)到不同的服務(wù)器上。
6.2 測試IP地址跳轉(zhuǎn)
使用如下命令測試IP地址跳轉(zhuǎn):
curl http://192.168.5.171
通過上圖,我們可以很明顯的看到,第一次使用curl http://192.168.5.171訪問時,haproxy是把請求分發(fā)171server組的192.168.5.174這臺機(jī)器上。而第二次訪問時,把請求分發(fā)171server組的192.168.5.178這臺機(jī)器上。
因為在haproxy配置中,我們使用的是roundrobin輪詢方法,所以客戶端的每一次請求,haproxy會把請求分發(fā)到不同的服務(wù)器上。
6.3 測試端口跳轉(zhuǎn)
使用如下命令測試IP地址跳轉(zhuǎn):
curl http://dg.test.com:8090
curl http://ilanni.test.com:8090
通過上圖,我們可以很明顯的看到客戶端在通過dg.test.com:8090和ilanni.test.com:8090進(jìn)行訪問時,haproxy確實把請求分發(fā)到了8090組服務(wù)器上的192.168.5.178:8090上。
6.4 測試默認(rèn)跳轉(zhuǎn)
要測試默認(rèn)跳轉(zhuǎn),我們可以隨便使用一個域名進(jìn)行測試。如下:
curl http://test.test.com
通過上圖,我們可以很明顯的看出haproxy把test.test.com的請求轉(zhuǎn)發(fā)到了默認(rèn)服務(wù)器組的192.168.5.178:8080上。
6.5 測試多ACL匹配
要測試默認(rèn)跳轉(zhuǎn),我們先切換到192.168.5.140這臺機(jī)器上,然后訪問http://192.168.5.171。如下:
通過上圖,我們可以很明顯的看到在192.168.5.171這臺機(jī)器上訪問http://192.168.5.171時,haproxy確實把請求分發(fā)到www.ilanni.com這臺機(jī)器上。
七、centos安裝haproxy
有關(guān)在centos上安裝haproxy,我們在此就不多做介紹了。只把相關(guān)的操作命令貼出來。
yum方式安裝:yum -y install haproxy
源碼方式安裝:
useradd haproxy
cat /etc/passwd |grep haproxy
uname –a
yum -y install gcc make
wget http://www.haproxy.org/download/1.3/src/haproxy-1.3.27.tar.gz
tar -xf haproxy-1.3.27.tar.gz
cd haproxy-1.3.27
make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
總結(jié)
以上是生活随笔為你收集整理的烂泥:高负载均衡学习haproxy之安装与配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BaseAdapter的抽取
- 下一篇: Unionid-微信开发学习