本文首發於爛泥行天下 前端
有關高負載均衡的軟件,目前使用比較多的是haproxy、nginx和lvs。下面咱們就開始學習haprxoy這款軟件。 linux
1、haproxy介紹 ios
如下開始介紹有關haproxy的原理及其優勢。 nginx
1.1、haproxy原理 web
haproxy提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。 redis
haproxy特別適用於那些負載特別大的web站點,這些站點一般又須要會話保持或七層處理。haproxy運行在時下的硬件上,徹底能夠支持數以萬計的併發鏈接,而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中,同時能夠保護你的web服務器不被暴露到網絡上。 sql
haproxy實現了一種事件驅動、單一進程模型,此模型支持很是大的併發鏈接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,不多能處理數千併發鏈接。 ubuntu
事件驅動模型由於在有更好的資源和時間管理的用戶端(User-Space)實現全部這些任務,因此沒有這些問題。此模型的弊端是,在多核系統上,這些程序一般擴展性較差。這就是爲何他們必須進行優化以使每一個CPU時間片(Cycle)作更多的工做。 後端
1.2、haproxy的優勢 centos
(1)免費開源,穩定性也是很是好。單haproxy也跑得不錯,穩定性能夠與硬件級的F5相媲美。
(2)根據官方文檔,haproxy能夠跑滿10Gbps,這個數值做爲軟件級負載均衡器是至關驚人的。
(3)haproxy支持鏈接拒絕:由於維護一個鏈接的打開的開銷是很低的,有時咱們很須要限制***蠕蟲(attack bots),也就是說限制它們的鏈接打開從而限制它們的危害。這個已經爲一個陷於小型DDoS***的網站開發了並且已經拯救了不少站點,這個優勢也是其它負載均衡器沒有的。
(4)haproxy支持全透明代理(已具有硬件防火牆的典型特色):能夠用客戶端IP地址或者任何其餘地址來鏈接後端服務器。這個特性僅在Linux 2.4/2.6內核打了tcp proxy補丁後纔可使用。這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。
(5)haproxy現多於線上的Mysql集羣環境,咱們經常使用於它做爲MySQL(讀)負載均衡。
(6)自帶強大的監控服務器狀態的頁面,實際環境中咱們結合Nagios進行郵件或短信報警。
(7)HAProxy支持虛擬主機,許多朋友說它不支持虛擬主機是錯誤的,經過測試咱們知道,HAProxy是支持虛擬主機的。
PS:本次實驗的OS爲ubuntu server 14.04。
2、業務架構圖
如今咱們以實際的業務架構圖,來使用haproxy。業務架構圖以下:
這個是基本的業務架構圖,對外是haproxy這臺服務器。目前暫時沒有考慮haproxy的單點故障問題,這個問題咱們會在後續的keepalived文章中會進行介紹。
如今要求以下:
2.1、域名跳轉
客戶端訪問http://dg.test.com時,要把請求分發到192.168.5.171:8080、192.168.5.174:8080、192.168.5.178:8080,這三臺服務器上。
客戶端訪問http://ilanni.test.com時,要把請求分發到ilanni.com,這臺服務器上。
2.2、IP地址跳轉
客戶端訪問http://192.168.5.171時,要把請求分發到192.168.5.174:80、192.168.5.178:80這兩臺服務器上。同時還要求客戶端每一次訪問,都跳轉到不一樣的服務器上。
2.3、端口跳轉
客戶端訪問http://dg.test.com:8090和http://ilanni.test.com:8090這兩個地址時,要把請求分發到192.168.5.174:8090、192.168.5.178:8090,這兩臺服務器上。
2.4、默認跳轉
若是客戶端訪問的不是dg.test.com與192.168.5.171,這兩個地址的話,要把請求所有分發到192.168.5.178:8080上。
2.5、多ACL匹配
若是客戶端的IP是192.168.5.140,同時訪問的是http://192.168.5.171時,要把請求分發到www.ilanni.com上。
3、安裝haproxy
haproxy的官網是http://www.haproxy.org/,若是打不開此站點,請×××(如何×××,聯繫我哦)。
haproxy的安裝咱們能夠分爲源碼方式和apt-get方式。下面對其安裝方式進行一一講解。
3.1 源碼方式安裝haproxy
haprxoy目前最新的版本爲1.6,爲了業務的穩定,在此咱們選擇的是1.3.15.27這個版本。
在進行源碼安裝以前,首先要安裝相關的軟件庫。以下:
sudo apt-get -y install make gcc
建立運行haproxy時,使用的用戶。在此咱們使用haproxy這個用戶,並且此用戶不能登陸到系統。以下:
sudo useradd -m haproxy
cat /etc/passwd |grep haproxy
經過上圖,咱們能夠看到haproxy用戶及用戶組的ID均爲1005。
如今開始下載源碼包以下:
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的內核版本,linux2.6以上的版本,咱們都選擇linux26。
經過查看安裝文檔,咱們能夠很清楚的看出要編譯haproxy,咱們首先要知道OS內核版本以及OS的位數。以下:
uname –a
經過上圖,咱們能夠很容易的看出linux內核的版本與OS的位數。
如今開始編譯haproxy,以下:
make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
其中TARGET表示OS的內核版本,ARCH表示OS的位數,PREFIX表示haprxoy的安裝路徑。
如今開始安裝haproxy,以下:
sudo make install PREFIX=/usr/local/haproxy
查看安裝後的文件,以下:
ll /usr/local/haproxy/
編輯haproxy的配置文件,haproxy默認給咱們提供一個配置文件模版。以下:
sudo cp examples/haproxy.cfg /usr/local/haproxy/
查看haprxoy的版本,以下:
/usr/local/haproxy/sbin/haproxy -v
經過上圖,能夠看到haproxy的版本確實是1.3.27。有關haproxy的配置實例見第三章。
3.2 apt-get方式安裝haproxy
apt-get方式安裝haproxy,以下:
sudo apt-get -y install haproxy
查看haproxy安裝的文件
dpkg -L haproxy
安裝完畢後,haproxy默認已經啓動。以下:
ps -ef |grep haproxy
查看haproxy版本,以下:
haproxy -v
經過上圖,咱們知道如今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
經過上圖,咱們能夠很明顯的看出默認的配置文件裏面是沒有內容的。
4、配置haprxoy
haproxy安裝完畢後,咱們來配置haproxy。源碼安裝的haprxoy在前面咱們已經講解了,haproxy提供的配置模版haproxy.cfg。
4.1、haproxy配置實例
咱們如今就以這個模版爲例,配置haproxy。haproxy配置文件內容,以下:
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配置實例講解
有關haproxy配置文件咱們先簡單介紹,以下:
global配置段,用於設定全局配置參數。
代理配置段中,主要是使用defaults、frontend、backend、listen關鍵詞。
defaults配置段用於爲全部其它配置段提供默認參數,這配置默認配置參數可由下一個「defaults」所從新設定。
frontend配置段用於定義一系列監聽的套接字,這些套接字可接受客戶端請求並與之創建鏈接。
backend配置段用於定義一系列「後端」服務器,代理將會將對應客戶端的請求轉發至這些服務器。
listen配置段經過關聯「前端」和「後端」定義了一個完整的代理,一般只對TCP流量有用。
在上述haproxy配置文件中,咱們主要講解ACL的匹配規則。
acl is_dg hdr_beg(host) dg.test.com
該行定義一個is_dg規則,若是客戶端請求的是dg.test.com這個域名,則定義該規則爲is_dg。
use_backend dgserver if is_dg
該定義一個dgserver服務器組,若是客戶端請求符合is_dg定義的規則,則把該客戶端的請求分發到dgserver服務器組。
acl is_ip src 192.168.5.140
該行定義一個is_ip規則,若是客戶端的IP地址是192.168.5.140,則定義該規則爲is_ip。
use_backend acl if is_171 is_ip
該定義一個acl服務器組,若是客戶端請求同時符合is_ip和is_171定義的規則,則把該客戶端的請求分發到acl服務器組。
default_backend backend_default
該行定義一個默認服務器組,若是客戶端請求不符合上述定義的任何一個規則,則把該客戶端的請求分發到backend_default服務器組。
其餘的規則就不一一進行講解了。
以上就是按照目前的業務要求,配置的haproxy。有關這些配置項參數,咱們會在下一篇文章中進行詳細介紹。
5、查看haproxy監控頁面
haproxy配置完畢後,如今來啓動haproxy,使用以下命令:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
ps -ef |grep haproxy
netstat -tunlp|grep 3173
如今咱們來打開haproxy的監控頁面,以下:
http://192.168.5.171:1080/stats
輸入用戶名和密碼後,haproxy監控後臺服務器的狀況,以下:
如今咱們來看看haprxoy全部後臺服務器的狀況,先來看看dgserver組,以下:
經過上圖,咱們能夠看到dgserver組,目前web1這臺服務器處於宕機狀態。也就是說haprxoy不會把客戶端的請求分發到web1服務器上了。
如今咱們再來看看171server組,以下:
經過上圖,咱們能夠很明顯的看出171server組的服務器目前都是正常運行的。
8090組服務器的狀況,以下:
經過上圖,咱們能夠看到8090組的服務器也是有一臺是宕機的。
6、測試haproxy負載均衡
haprxoy配置完畢並正常啓動後,咱們如今來根據業務的要求進行測試。
6.1 測試域名跳轉
使用以下命令測試域名跳轉:
curl http://dg.test.com
經過上圖,咱們能夠看到當咱們使用dg.test.com這個域名訪問時,haproxy確實爲咱們進行跳轉了,並且跳轉到了192.168.5.174這臺服務器上。
由於考慮到客戶端session會話的問題,因此咱們在配置haproxy負載均衡沒有使用roundrobin輪詢的方法,而是使用source方法。因此haproxy目前沒有把請求分發到192.168.5.171:8080、192.168.5.178:8080這兩臺服務器上。
如今咱們訪問ilanni.test.com,以下:
經過上圖,咱們能夠看到訪問不一樣的域名,haproxy把請求分發到不一樣的服務器上。
6.2 測試IP地址跳轉
使用以下命令測試IP地址跳轉:
curl http://192.168.5.171
經過上圖,咱們能夠很明顯的看到,第一次使用curl http://192.168.5.171訪問時,haproxy是把請求分發171server組的192.168.5.174這臺機器上。而第二次訪問時,把請求分發171server組的192.168.5.178這臺機器上。
由於在haproxy配置中,咱們使用的是roundrobin輪詢方法,因此客戶端的每一次請求,haproxy會把請求分發到不一樣的服務器上。
6.3 測試端口跳轉
使用以下命令測試IP地址跳轉:
curl http://dg.test.com:8090
curl http://ilanni.test.com:8090
經過上圖,咱們能夠很明顯的看到客戶端在經過dg.test.com:8090和ilanni.test.com:8090進行訪問時,haproxy確實把請求分發到了8090組服務器上的192.168.5.178:8090上。
6.4 測試默認跳轉
要測試默認跳轉,咱們能夠隨便使用一個域名進行測試。以下:
curl http://test.test.com
經過上圖,咱們能夠很明顯的看出haproxy把test.test.com的請求轉發到了默認服務器組的192.168.5.178:8080上。
6.5 測試多ACL匹配
要測試默認跳轉,咱們先切換到192.168.5.140這臺機器上,而後訪問http://192.168.5.171。以下:
經過上圖,咱們能夠很明顯的看到在192.168.5.171這臺機器上訪問http://192.168.5.171時,haproxy確實把請求分發到www.ilanni.com這臺機器上。
7、centos安裝haproxy
有關在centos上安裝haproxy,咱們在此就很少作介紹了。只把相關的操做命令貼出來。
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