一 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<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伺服器配置
設定兩塊網卡
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" >> /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 ,如需轉載請自行聯系原作者