1. 程式人生 > >高負載均衡學習haproxy之安裝與配置

高負載均衡學習haproxy之安裝與配置

ack 實例 人的 路徑 ESS fault 輸入 小型 .cn

有關高負載均衡的軟件,目前使用比較多的是haproxy、nginx和lvs。下面我們就開始學習haprxoy這款軟件。

一、haproxy介紹

以下開始介紹有關haproxy的原理及其優點。

1.1、haproxy原理

haproxy提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。

haproxy特別適用於那些負載特別大的web站點,這些站點通常又需要會話保持或七層處理。haproxy運行在時下的硬件上,完全可以支持數以萬計的並發連接,並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。

haproxy實現了一種事件驅動、單一進程模型,此模型支持非常大的並發連接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發連接。

事件驅動模型因為在有更好的資源和時間管理的用戶端(User-Space)實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什麽他們必須進行優化以使每個CPU時間片(Cycle)做更多的工作。

1.2、haproxy的優點

(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。

二、業務架構圖

現在我們以實際的業務架構圖,來使用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上。

三、安裝haproxy

haproxy的官網是http://www.haproxy.org/,如果打不開此站點,請FQ(如何FQ,聯系我)。

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

技術分享圖片

通過上圖,我們可以很明顯的看出默認的配置文件裏面是沒有內容的。

四、配置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。有關這些配置項參數,我們會在下一篇文章中進行詳細介紹。

五、查看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組的服務器也是有一臺是宕機的。

六、測試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這臺機器上。

七、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

高負載均衡學習haproxy之安裝與配置