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

本文首發於爛泥行天下 前端

有關高負載均衡的軟件,目前使用比較多的是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。業務架構圖以下:

clip_p_w_picpath001

這個是基本的業務架構圖,對外是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

clip_p_w_picpath002

建立運行haproxy時,使用的用戶。在此咱們使用haproxy這個用戶,並且此用戶不能登陸到系統。以下:

sudo useradd -m haproxy

cat /etc/passwd |grep haproxy

clip_p_w_picpath003

經過上圖,咱們能夠看到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/

clip_p_w_picpath004

查看haproxy的安裝文件,以下:

more README

clip_p_w_picpath005

這張圖很明顯的告訴咱們,編譯安裝haproxy須要的軟件庫。除此以外還須要選擇OS的內核版本,linux2.6以上的版本,咱們都選擇linux26

clip_p_w_picpath006

經過查看安裝文檔,咱們能夠很清楚的看出要編譯haproxy,咱們首先要知道OS內核版本以及OS的位數。以下:

uname –a

clip_p_w_picpath007

經過上圖,咱們能夠很容易的看出linux內核的版本與OS的位數。

如今開始編譯haproxy,以下:

make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy

clip_p_w_picpath008

其中TARGET表示OS的內核版本,ARCH表示OS的位數,PREFIX表示haprxoy的安裝路徑。

如今開始安裝haproxy,以下:

sudo make install PREFIX=/usr/local/haproxy

clip_p_w_picpath009

查看安裝後的文件,以下:

ll /usr/local/haproxy/

clip_p_w_picpath010

編輯haproxy的配置文件,haproxy默認給咱們提供一個配置文件模版。以下:

sudo cp examples/haproxy.cfg /usr/local/haproxy/

clip_p_w_picpath011

查看haprxoy的版本,以下:

/usr/local/haproxy/sbin/haproxy -v

clip_p_w_picpath012

經過上圖,能夠看到haproxy的版本確實是1.3.27。有關haproxy的配置實例見第三章。

3.2 apt-get方式安裝haproxy

apt-get方式安裝haproxy,以下:

sudo apt-get -y install haproxy

clip_p_w_picpath013

查看haproxy安裝的文件

dpkg -L haproxy

clip_p_w_picpath014

安裝完畢後,haproxy默認已經啓動。以下:

ps -ef |grep haproxy

clip_p_w_picpath015

查看haproxy版本,以下:

haproxy -v

clip_p_w_picpath016

經過上圖,咱們知道如今haproxy的版本爲1.5.4。

注意:apt-get方式安裝haproxy,若是版本爲1.4.24的話。咱們必定要修改/etc/default/haproxy,以下:

sudo vi /etc/default/haproxy

ENABLED=1

clip_p_w_picpath017

若是不修改的話,使用haproxy啓動腳本的話,是沒有用處的,也就說腳本不會從新加載haproxy的配置。

查看haproxy的配置文件,以下:

cat /etc/haproxy/haproxy.cfg

clip_p_w_picpath018

經過上圖,咱們能夠很明顯的看出默認的配置文件裏面是沒有內容的。

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

clip_p_w_picpath019

clip_p_w_picpath020

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

clip_p_w_picpath021

如今咱們來打開haproxy的監控頁面,以下:

http://192.168.5.171:1080/stats

clip_p_w_picpath022

輸入用戶名和密碼後,haproxy監控後臺服務器的狀況,以下:

clip_p_w_picpath023

如今咱們來看看haprxoy全部後臺服務器的狀況,先來看看dgserver組,以下:

clip_p_w_picpath024

經過上圖,咱們能夠看到dgserver組,目前web1這臺服務器處於宕機狀態。也就是說haprxoy不會把客戶端的請求分發到web1服務器上了。

如今咱們再來看看171server組,以下:

clip_p_w_picpath025

經過上圖,咱們能夠很明顯的看出171server組的服務器目前都是正常運行的。

8090組服務器的狀況,以下:

clip_p_w_picpath026

經過上圖,咱們能夠看到8090組的服務器也是有一臺是宕機的。

6、測試haproxy負載均衡

haprxoy配置完畢並正常啓動後,咱們如今來根據業務的要求進行測試。

6.1 測試域名跳轉

使用以下命令測試域名跳轉:

curl http://dg.test.com

clip_p_w_picpath027

clip_p_w_picpath028

經過上圖,咱們能夠看到當咱們使用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,以下:

clip_p_w_picpath029

經過上圖,咱們能夠看到訪問不一樣的域名,haproxy把請求分發到不一樣的服務器上。

6.2 測試IP地址跳轉

使用以下命令測試IP地址跳轉:

curl http://192.168.5.171

clip_p_w_picpath030

經過上圖,咱們能夠很明顯的看到,第一次使用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

clip_p_w_picpath031

經過上圖,咱們能夠很明顯的看到客戶端在經過dg.test.com:8090和ilanni.test.com:8090進行訪問時,haproxy確實把請求分發到了8090組服務器上的192.168.5.178:8090上。

6.4 測試默認跳轉

要測試默認跳轉,咱們能夠隨便使用一個域名進行測試。以下:

curl http://test.test.com

clip_p_w_picpath032

經過上圖,咱們能夠很明顯的看出haproxy把test.test.com的請求轉發到了默認服務器組的192.168.5.178:8080上。

6.5 測試多ACL匹配

要測試默認跳轉,咱們先切換到192.168.5.140這臺機器上,而後訪問http://192.168.5.171。以下:

clip_p_w_picpath033

clip_p_w_picpath034

經過上圖,咱們能夠很明顯的看到在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

相關文章
相關標籤/搜索