1. 程式人生 > >HAProxy負載均衡代理

HAProxy負載均衡代理

haproxy

HAProxy負載均衡代理
1. HAProxy概述
HAProxy 提供高可用性、負載均衡以及基於 TCP 和 HTTP 應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。根據官方數據,其最高極限支持 10G 的並發。HAProxy 特別適用於那些負載特大的 web 站點, 這些站點通常又需要會話保持或七層處理。 HAProxy 運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的 web 服務器不被暴露到網絡上。其支持從 4 層至 7 層的網絡交換,即覆蓋所有的 TCP 協議。就是說,Haproxy 甚至還支持 Mysql 的均衡負載。

相同點:在功能上,proxy 通過反向代理方式實現 web 均衡負載,和 Nginx,ApacheProxy,lighttpd, Cheroke 等一樣。
不同點:Haproxy 並不是 Http 服務器。以上提到所有帶反向代理均衡負載的產品,都清一色是 WEB 服務器。簡單說,就是他們能自個兒提供靜態(html,jpg,gif..)或動態(php,cgi..)文件的傳輸以及處理。而 Haproxy 僅僅,而且專門是一款的用於均衡負載的應用代理。其自身並不能提供 http 服務。 但其配置簡單,擁有非常不錯的服務器健康檢查功能還有專門的系統狀態監控頁面,當其代理的後端服務器出現故障, HAProxy 會自動將該服務器摘除,故障恢復後再自動將該服務器加入。
HAProxy 負載的幾種方式:
1. 輪詢 roundrobin
2. 最少連接數 Leastconn
3. 根據源IP source
4. 根據URI uri
5. 根據URL裏的參數 url_param(根據請求串中的數據hush後做lb,譬如需要一個userid永遠在某臺服務器上,該策略是靜態的
2.HAProxy 官網地址
http://www.haproxy.org/
3.Haproxy 實驗拓撲
HaProxy分發器:192.168.42.175
Web1 (nginx)server:192.168.42.176
Web2 (nginx)server:192.168.42.177
技術分享

Haproxy服務端配置
[[email protected] ~]# tar xvf haproxy-1.5.15.tar.gz -C /usr/local/src/
[[email protected] ~]#cd /usr/local/src/haproxy-1.5.15/
[[email protected] haproxy-1.5.15]# cat README | less //查看安裝方式,比較特殊
[[email protected] haproxy-1.5.15]# uname -a
Linux xuegod175.cn 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] haproxy-1.5.15]# make TARGET=linux26 PREFIX=/usr/local/haproxy
//指定操作系統內核類型和安裝的路徑。也可以直接修改 Makefile 配置文件中這兩個變量的值。如下:
[[email protected] haproxy-1.5.15]# vim Makefile
添加:TARGET = linux26
[[email protected] haproxy-1.5.15]# make install PREFIX=/usr/local/haproxy
[[email protected] haproxy-1.5.15]# cd /usr/local/haproxy/
[[email protected] haproxy]# ls
doc sbin share #沒有配置文件目錄
[[email protected] haproxy]# mkdir /usr/local/haproxy/etc ; cd
[[email protected] ~]# cp /usr/local/src/haproxy-1.5.15/examples/haproxy.cfg /usr/local/haproxy/etc/

[[email protected] ~]# vim /usr/local/haproxy/etc/haproxy.cfg
#global 全局,以全局定義為準
#defaults   默認,在全局的前提下,默認跟局部的配置,如果局部沒說,那就按默認走,如果局部有定義那就按局部。
#frontend   前端,監聽地址,監聽端口,該如何處理。。。。。
#backend    後端服務器,定義那些真正處理業務的服務器Realserver.
#listen 將frontend和backend 合體的一種方案
global
log 127.0.0.1  local0
#log 127.0.0.1  local1 notice
#log loghost    local0 info
maxconn 4096
chroot /usr/local/haproxy
uid 99                          #所屬運行的用戶uid
gid 99                          #所屬運行的用戶組
daemon                          #以後臺形式運行haproxy
nbproc 1                        #啟動1個haproxy實例。# #工作進程數量(CPU數量) ,實際工作中,應該設置成和CPU核心數一樣。 這樣可以發揮出最大的性能。
pidfile /usr/local/haproxy/run/haproxy.pid  #將所有進程寫入pid文件
#debug                          #調試錯誤時用
#quiet                          #安靜
defaults
log    global
log    127.0.0.1      local3        #日誌文件的輸出定向。產生的日誌級別為local3. 系統中local1-7,用戶自己定義
mode    http                        #工作模式。所處理的類別,默認采用http模式,可配置成tcp作4層消息轉發
option  httplog                     #日誌類別,記載http日誌
option  httpclose                   #每次請求完畢後主動關閉http通道,haproxy不支持keep-alive,只能模擬這種模式的實現
option  dontlognull                 #不記錄空連接,產生的日誌
option  forwardfor                  #如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip
option  redispatch                  #當serverid對應的服務器掛掉後,強制定向到其他健康服務器
retries 2                           #2次連接失敗就認為服務器不可用,主要通過後面的check檢查
maxconn 2000                        #最大連接數
balance roundrobin                  #負載均衡算法
stats  uri    /haproxy-stats        #haproxy 監控頁面的訪問地址 # 可通過 http://localhost:80/haproxy-stats 訪問
timeout connect      5000ms                #連接超時時間。 單位:ms 毫秒,
 timeout client      50000ms               #客戶端連接超時時間,
timeout server      50000ms               #服務器端連接超時時間,
 listen  localhost 0.0.0.0:80                  #運行的端口及主機名 
mode    http
option  httpchk GET /index.html                 #健康檢測。#註意實際工作中測試時,應該下載某一個頁面來進行測試,因此這個頁面應該是個小頁面,而不要用首頁面。這裏是每隔一秒檢查一次頁面。
server  s1 192.168.42.176:80  weight 3 check      #後端的主機 IP &權衡
server  s2 192.168.42.177:80 weight 3 check       #後端的主機 IP &權衡

[[email protected] ~]# id nobody //99 是 nobody 運行用戶
uid=99(nobody) gid=99(nobody) groups=99(nobody)
[[email protected] ~]# mkdir -p /usr/local/haproxy/run
[[email protected] ~]# chown nobody /usr/local/haproxy/ -R
[[email protected] ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg //啟動
[[email protected] ~]# ps -aux | grep haproxy
Warning: bad syntax, perhaps a bogus ‘-‘? See /usr/share/doc/procps-3.2.8/FAQ
nobody 3327 0.0 0.0 12200 960 ? Ss 13:37 0:00 /usr/local/haproxy/sbin/haproxy -f
/usr/local/haproxy/etc/haproxy.cfg
[[email protected] ~]# netstat -antup | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3327/haproxy
比較特殊重啟方法:
[[email protected] ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg -st `cat /usr/local/haproxy/run/haproxy.pid`
//重啟 -st 參數含義:-sf/-st [pid ( haproxy 當前進程程 ID) ] 完成/終止舊的 PID。 此參數必須是最後一個參數。
[[email protected] etc]# killall haproxy //停止服務
制作 HAproxy 啟動腳本
[[email protected] ~]# cp /usr/local/src/haproxy-1.5.15/examples/haproxy.init /etc/init.d/haproxy //可以修改此文件
實現啟動腳本,太多修改內容
直接使用下面的作為啟動腳本
[[email protected] ~]# vim /etc/init.d/haproxy

[[email protected] haproxy-1.5.15]# cat /etc/init.d/haproxy 

#! /bin/sh

set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin

PROGDIR=/usr/local/haproxy

PROGNAME=haproxy

DAEMON=$PROGDIR/sbin/$PROGNAME

CONFIG=$PROGDIR/etc/haproxy.cfg

PIDFILE=$PROGDIR/$PROGNAME.pid

DESC="HAProxy daemon"

SCRIPTNAME=/etc/init.d/$PROGNAME

# Gracefully exit if the package has been removed.

test -x $DAEMON || exit 0

start()

{

echo -n "Starting $DESC: $PROGNAME"

$DAEMON -f $CONFIG

echo "."

}

stop()

{

echo -n "Stopping $DESC: $PROGNAME"

haproxy_pid=$(cat $PIDFILE)

kill -15 $haproxy_pid

echo "."

}

restart()

{

echo -n "Restarting $DESC: $PROGNAME"

$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)

echo "."

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

restart

;;

*)

echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2

exit 1

;;

esac

exit 0

#說明:腳本中 set -e 的作用
#你寫的每個腳本都應該在文件開頭加上 set -e,這句語句告訴 bash 如果任何語句的執行結果不是 true 則應該退出。這樣的好處是防止錯誤像滾雪球般變大導致一個致命的錯誤,而這些錯誤本應該在之前就被處理掉。
[[email protected] ~]# /etc/init.d/haproxy restart //可以實現啟動

HA-Proxy 日誌配置
配置日誌收集
[[email protected] ~]# vim /etc/rsyslog.conf //打開以以下兩行的註釋,不打開收不到日誌。
$ModLoad imudp #取消註釋
$UDPServerRun 514 #取消註釋
local7.* /var/log/boot.log #下面添加兩行
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
[[email protected] ~]# /etc/init.d/rsyslog restart
Web服務端配置測試文件
註:這裏的web服務器均使用了nginx,安裝過程省略掉。
[[email protected] ~]# cat /usr/local/nginx/html/index.html
192.168.42.176
[[email protected] ~]# cat /usr/local/nginx/html/index.html
192.168.42.177
訪問進行測試:
測試訪問界面web1

技術分享

測試訪問界面 web2

技術分享

3.測試訪問HAProxy
通過訪問HAProxy 實現了輪詢訪問web 服務器一、二的效果,說明HAProxy負載均衡已經搭建成功。

技術分享

技術分享

通過訪問 http://192.168.42.175/haproxy-stats

技術分享

停掉web2服務進行測試

技術分享

本文出自 “天真無邪” 博客,請務必保留此出處http://innocence.blog.51cto.com/4313888/1922042

HAProxy負載均衡代理