爛泥:高負載平衡學習haproxy之安裝與配置,負載平衡haproxy

來源:互聯網
上載者:User

爛泥:高負載平衡學習haproxy之安裝與配置,負載平衡haproxy

本文由秀依林楓提供友情贊助,首發於爛泥行天下

有關高負載平衡的軟體,目前使用比較多的是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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.