HAProxy負載均衡原理及企業級實例部署haproxy集群


一 HAProxy簡介

 

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

同一客戶端訪問服務器,HAProxy保持回話的三種方案:

1 HAProxy將客戶端ip進行Hash計算並保存,由此確保相同IP訪問時被轉發到同一真實服務器上。

2 HAProxy依靠真實服務器發送給客戶端的cookie信息進行回話保持。

3 HAProxy保存真實服務器的session及服務器標識,實現會話保持功能。

 

haproxy拓撲結構圖

wKiom1iX7W_y7bC2AAHh9xLZpkA752.jpg-wh_50

 

 

二 配置文件解析

 

Haproxy安裝后默認沒有配置文件,需要手動創建/etc/haproxy.cfg。啟動haproxy時用-f指定配置文件路徑。haproxy的配置文件包含全局設置段與代理段,global是全局段,defaults、listen、frontend、backend為代理段。frontend用來匹配客戶端請求的域名或者URL;backend定義后端服務器集群

 

haproxy配置文件參數詳細解析

 

      配置項         描述

 

 

 

 

 

 

 

 

global

chroot<jail dir> 將工作目錄切換到<jail dir>並執行chroot
daemon 后台工作模式
uid 進程賬戶id,建議設置為haproxy專用賬戶
gid 進程組id,建議設置為haproxy專用組
log<address><facility> 配置全局syslog,可以設置兩台日志服務器
nbproc<number> 指定后台進程數量
pidfile<file> 指定pid文件
ulimit-n<number>

設置每個進程最大文件描述符數量

maxconn<number> 每個進程支持的最大並發數
tune.bufsize<number> 設置buffer大小,默認16384B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

代理

設置

mode 可選tcp、http、health
timeout check<timeout> 設置檢查超時時間
contimeout<timeout> 設置連接超時時間
balance roundrobin 設置輪詢負載
bind<address>:port 定義一個或者多個監聽地址和端口
stats auth admin:admin 設置監控界面的用戶名和密碼
stats refresh<number> 統計頁面刷新間隔時間
option httplog 使用http日志
cookie<name> 啟用cookie的保持連接功能
option forwardfor 允許插入這種數據包頭,可以讓后端服務器獲取客戶端ip
option abortonclose 負載高時,自動關閉處理時間長的請求
option allbackups 后端服務器宕機,是否激活全部備機,默認啟動第一個備機
option dontlognull 不記錄空連接日志,主要用於不記錄健康檢查日志
option redispatch 后端某個機器宕機,強制把請求轉發給健康機器
monitor-uri<URi> 檢查uri文件是否存在,依次判斷主機的健康狀態
monitor-fail if site_dead 服務器宕機時,返回503代碼
option httpchk<uri> 使用http協議檢查服務器健康狀態
retries<value> 服務器連接失敗后的重試次數
timeout client 客戶端最大超時時間,單位毫秒
timeout server 服務器最大超時時間,單位毫秒
timeout connect 最大連接超時時間,單位毫秒
default_backend 默認后端服務器組
use_backend 當條件滿足時,指定后端服務器組
acl<name><criterion> 定義訪問控制列表

 

三 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" > /var/www/html/index.html

service httpd restart

chkconfig httpd on

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

 

2 接着haproxy服務器配置

設置兩塊網卡

 

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

DEVICE=eth0

BOOTPROTO=static

IPADDR=10.10.10.10

NETMASK=255.0.0.0

ONBOOT=yes

TYPE=Ethernet

 

 

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

DEVICE=eth1

BOOTPROTO=static

IPADDR=192.168.1.2

NETMASK=255.255.255.0

GATEWAY=192.168.1.1

ONBOOT=yes

TYPE=Ethernet

 

service network restart

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

global

maxconn    4096

log    127.0.0.1    local3    info

chroot    /var/haproxy

uid    99

gid    99

daemon

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

mode    http

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

mode    http

log    global

option    httplog

option    httpclose

option    forwardfor

#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

mode    http

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" >> /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的頁面信息。

閱讀原文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM