天天看點

HAProxy負載均衡原理及企業級執行個體部署haproxy叢集

一 HAProxy簡介

HAProxy是一種高效、可靠、免費的高可用及負載均衡解決方案,非常适合于高負載站點的七層資料請求。用戶端通過HAProxy代理伺服器獲得站點頁面,而代理伺服器收到客戶請求後根據負載均衡的規則将請求資料轉發給後端真實伺服器。

同一用戶端通路伺服器,HAProxy保持回話的三種方案:

1 HAProxy将用戶端ip進行Hash計算并儲存,由此確定相同IP通路時被轉發到同一真實伺服器上。

2 HAProxy依靠真實伺服器發送給用戶端的cookie資訊進行回話保持。

3 HAProxy儲存真實伺服器的session及伺服器辨別,實作會話保持功能。

haproxy拓撲結構圖

<a href="http://s5.51cto.com/wyfs02/M00/8D/54/wKiom1iX7W_y7bC2AAHh9xLZpkA752.jpg-wh_500x0-wm_3-wmp_4-s_302925140.jpg" target="_blank"></a>

二 配置檔案解析

Haproxy安裝後預設沒有配置檔案,需要手動建立/etc/haproxy.cfg。啟動haproxy時用-f指定配置檔案路徑。haproxy的配置檔案包含全局設定段與代理段,global是全局段,defaults、listen、frontend、backend為代理段。frontend用來比對用戶端請求的域名或者URL;backend定義後端伺服器叢集

haproxy配置檔案參數詳細解析

      配置項

        描述

global

chroot&lt;jail dir&gt;

将工作目錄切換到&lt;jail dir&gt;并執行chroot

daemon

背景工作模式

uid

程序賬戶id,建議設定為haproxy專用賬戶

gid

程序組id,建議設定為haproxy專用組

log&lt;address&gt;&lt;facility&gt;

配置全局syslog,可以設定兩台日志伺服器

nbproc&lt;number&gt;

指定背景程序數量

pidfile&lt;file&gt;

指定pid檔案

ulimit-n&lt;number&gt;

設定每個程序最大檔案描述符數量

maxconn&lt;number&gt;

每個程序支援的最大并發數

tune.bufsize&lt;number&gt;

設定buffer大小,預設16384B

代理

設定

mode

可選tcp、http、health

timeout check&lt;timeout&gt;

設定檢查逾時時間

contimeout&lt;timeout&gt;

設定連接配接逾時時間

balance roundrobin

設定輪詢負載

bind&lt;address&gt;:port

定義一個或者多個監聽位址和端口

stats auth admin:admin

設定監控界面的使用者名和密碼

stats refresh&lt;number&gt;

統計頁面重新整理間隔時間

option httplog

使用http日志

cookie&lt;name&gt;

啟用cookie的保持連接配接功能

option forwardfor

允許插入這種資料標頭,可以讓後端伺服器擷取用戶端ip

option abortonclose

負載高時,自動關閉處理時間長的請求

option allbackups

後端伺服器當機,是否激活全部備機,預設啟動第一個備機

option dontlognull

不記錄空連接配接日志,主要用于不記錄健康檢查日志

option redispatch

後端某個機器當機,強制把請求轉發給健康機器

monitor-uri&lt;URi&gt;

檢查uri檔案是否存在,依次判斷主機的健康狀态

monitor-fail if site_dead

伺服器當機時,傳回503代碼

option httpchk&lt;uri&gt;

使用http協定檢查伺服器健康狀态

retries&lt;value&gt;

伺服器連接配接失敗後的重試次數

timeout client

用戶端最大逾時時間,機關毫秒

timeout server

伺服器最大逾時時間,機關毫秒

timeout connect

最大連接配接逾時時間,機關毫秒

default_backend

預設後端伺服器組

use_backend

當條件滿足時,指定後端伺服器組

acl&lt;name&gt;&lt;criterion&gt;

定義通路控制清單

三 Haproxy執行個體部署

本例使用listen定義一個監控端口;

使用frontend定義一個前端80端口;

通過backend定義名為inside_servers 和 external_servers的伺服器組;

使用default_backend定義預設伺服器組external_servers;

external_servers包括web1.test.com和web2.test.com 兩台伺服器

inside_servers包含web3.test.com 一台伺服器

伺服器名稱

網絡配置

haproxy.test.com

eth0:10.10.10.10

eth1:192.168.1.2

web1.test.com

eth0:192.168.1.3

web2.test.com

eth0:192.168.1.4

web3.test.com

eth0:192.168.1.5

1 首先配置web伺服器

在web1 web2 web3上安裝httpd并配置網卡

vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=static

IPADDR=192.168.1.3

NETMASK=255.255.255.0

GATEWAY=192.168.1.2

ONBOOT=yes

TYPE=Ethernet

service network restart

yum install -y httpd

iptables -F

iptables -X

service iptables save

setenforce 0

sed -i s/enforcing/disabled/g /etc/sysconfig/selinux

echo "web1  192.168.1.3" &gt; /var/www/html/index.html

service httpd restart

chkconfig httpd on

web2 web3機器上執行與web1相同步驟,注意修改部分參數

2 接着haproxy伺服器配置

設定兩塊網卡

IPADDR=10.10.10.10

NETMASK=255.0.0.0

vim /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

IPADDR=192.168.1.2

GATEWAY=192.168.1.1

service iptables stop

核心調優,修改系統檔案

vim /etc/security/limits.conf

*    soft    nofile        65535 

*    hard    nofile        65535

配置日志檔案,添加三行

vim /etc/rsyslog.conf

$ModLoad    imudp

$UDPServerRun    514

local3.*                        /var/log/haproxy.log

yum -y install gcc

wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.11.tar.gz

tar zxf haproxy-1.6.11.tar.gz -C /usr/src/

cd /usr/src/haproxy-1.6.11/

make TARGET=linux2628

make install

mkdir /var/haproxy

3 建立配置檔案

vim /etc/haproxy.cfg

maxconn    4096

log    127.0.0.1    local3    info

chroot    /var/haproxy

uid    99

gid    99

nbproc    1

pidfile    /var/run/haproxy.pid

ulimit-n    65535

stats    socket    /var/tmp/stats

defaults

log    global

mode    http

maxconn    20480

option    httplog

option    httpclose

option    dontlognull

option    forwardfor

option    redispatch

option    abortonclose

stats    refresh    30

retries    3

balance    roundrobin

cookie    SRV

timeout    check    2000ms

timeout    connect    5000ms

timeout    server    50000ms

timeout    client    50000ms

listen    admin_status                                        #定義haproxy的監控界面

bind    0.0.0.0:6553

log    127.0.0.1    local3 info

stats    enable

stats    refresh    5s                                            #監控頁面自動重新整理時間5s

stats    realm    Haproxy\    Statistics                #登入監控頁面提示符

stats    uri    /admin?stats                                  #監控頁面URL路徑

stats    auth    admin:123456                             #監控頁面的賬戶密碼

stats    hide-version                                           #隐藏haproxy版本

frontend    web_service                                     #定義前端伺服器

bind    0.0.0.0:80

#acl    inside_src src 192.168.1.0/24                    #定義acl

#use_backend    inside_servers if inside_src        #判斷acl的源位址,把請求轉發到inside_servers組

default_backend    external_servers                        #預設伺服器組

backend    external_servers

balance    roundrobin                                            #輪詢真實伺服器

option    httpchk    GET    /index.html                #檢查index檔案,判斷伺服器是否健康

##定義後端真實伺服器,向cookie中插入web1資訊,check進行健康檢查,檢查時間間隔為2000ms,##連續兩次健康則認為是正常開啟的,連續三次檢查失敗則認為當機,伺服器權重1

server web1 192.168.1.3:80 cookie web1 check inter 2000 rise 2 fall 3 weight 1

server web2 192.168.1.4:80 cookie web2 check inter 2000 rise 2 fall 3 weight 1

#backend    inside_servers

#mode    http

#balance    roundrobin                                            #輪詢真實伺服器

#option    httpchk    GET    /index.html                #檢查index檔案,判斷伺服器是否健康

#server web3 192.168.1.5:80 cookie web3 check inter 2000 rise 2 fall 3 weight 1

4 啟動haproxy服務

service rsyslog restart                #重新開機系統日志服務

haproxy -f /etc/haproxy.cfg        #啟動haproxy服務

echo "/usr/local/sbin/haproxy -f /etc/haproxy.cfg" &gt;&gt; /etc/rc.local

5 測試驗證

浏覽器通路監控頁面

在一個ip為10.10.10.100的機器上通路http://10.10.10.10:6553/admin?stats

多次重新整理通路将得到web1和web2 不同頁面資訊

如果配置檔案中開啟使用inside_servers,則在192.168.1.0/24網段機器上通路http://192.168.1.2,伺服器傳回的會一直是web3的頁面資訊。

本文轉自super李導51CTO部落格,原文連結:http://blog.51cto.com/superleedo/1895570 ,如需轉載請自行聯系原作者