參考網站:
http://ilanni.blog.51cto.com/526870/1687054/
http://johnsz.blog.51cto.com/525379/715922/
https://www.douban.com/note/275230796/
http://www.linuxidc.com/Linux/2012-04/59089.htm
三台虛擬機,Ip地址分別為192.168.178.2(裝載Haproxy服務以及httpd服務),
192.168.178.3(安裝httpd服務),192.168.178.4(安裝httpd服務)
1 Haproxy介紹
1.1 Haproxy原理
haproxy提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。
haproxy特別適用於那些負載特別大的web站點,這些站點通常又需要會話保持或七層處理。haproxy運行在時下的硬件上,完全可以支持數以萬計的並發連接,並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
haproxy實現了一種事件驅動、單一進程模型,此模型支持非常大的並發連接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,很少能處理數千並發連接。
事件驅動模型因為在有更好的資源和時間管理的用戶端(User-Space)實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是為什么他們必須進行優化以使每個CPU時間片(Cycle)做更多的工作。
1.2 Haproxy的優點
(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是支持虛擬主機的。
2 Haproxy安裝與配置
2.1 Haproxy安裝
獲取haproxy-1.4.24.tar.gz源碼安裝包。
[root@localhost ~]# tar xzvf haproxy-1.4.24.tar.gz
[root@localhost ~]# cd haproxy-1.4.24
[root@localhost ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy //26是linux系統內核
[root@localhost ~]# make install PREFIX=/usr/local/haproxy
2.2 Haproxy配置
安裝完畢后,進入安裝目錄配置文件,默認情況下usr/local/haproxy是沒有安裝目錄的,需要將安裝目錄/usr/local/src/haproxy-1.4.24/examples/下的haproxy.cfg拷貝到usr/local/haproxy目錄下,或者在usr/local/haproxy目錄下新建haproxy.cfg進行配置。命令如下:
[root@localhost ~]# cp /usr/src/local/haproxy-1.4.24/examples/haproxy.cfg
/usr/local/haproxy/haproxy.cfg
[root@localhost ~]# vim /usr/local/haproxy/haproxy.cfg
Haproxy的配置文件的含義可參考網站:
具體配置可根據自己的需要來進行配置,本文進行的是簡單的配置,所以我的配置文件內容如下:
global
maxconn 256
daemon
defaults
mode http
timeout connect 5000
timeout client 5000
timeout server 5000
frontend http-in
bind *:80
default_backend servers
backend servers
server server1 192.168.1.3 maxconn 32
server server2 192.168.1.4 maxconn 32
2.3 日志支持
根據上面的global和default里的log配置如下:
命令如下:
[root@localhost ~]# vim /etc/rsyslog.conf
在最下邊增加
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
[root@localhost ~]#vim /etc/sysconfig/rsyslog
修改:SYSLOGD_OPTIONS="-r –m 0"
啟日志服務service rsyslog restart
2.4 設置開機啟動
創建開機啟動腳本,
[root@localhost ~]# vim /etc/rc.d/init.d/haproxy
內容如下:
#!/bin/bash
#
# haproxy
#
# chkconfig: 35 85 15
# description: HAProxy is a free, very fast and reliable solution \
# offering high availability, load balancing, and \
# proxying for TCP and HTTP-based applications
# processname: haproxy
# config: /etc/haproxy.cfg
# pidfile: /var/run/haproxy.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
config="/usr/local/haproxy/haproxy.cfg"
exec="/usr/local/haproxy/sbin/haproxy"
prog=$(basename $exec)
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/haproxy
check() {
$exec -c -V -f $config
}
start() {
$exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Starting $prog: "
# start it up here, usually something like "daemon $exec"
daemon $exec -D -f $config -p /var/run/$prog.pid
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
# stop it here, often "killproc $prog"
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
$exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
stop
start
}
reload() {
$exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Reloading $prog: "
$exec -D -f $config -p /var/run/$prog.pid -sf $(cat /var/run/$prog.pid)
retval=$?
echo
return $retval
}
force_reload() {
restart
}
fdr_status() {
status $prog
}
case "$1" in
start|stop|restart|reload)
$1
;;
force-reload)
force_reload
;;
checkconfig)
check
;;
status)
fdr_status
;;
condrestart|try-restart)
[ ! -f $lockfile ] || restart
;;
*)
echo $"Usage: $0 {start|stop|status|checkconfig|restart|try-restart|reload|force-reload}"
exit 2
esac
保存后賜予可執行權限
[root@localhost ~]# chmod +x /etc/rc.d/init.d/haproxy
就可以使用 service haproxy start|stop|restart 來控制服務的啟動停止跟重啟。
並通過以下命令加載到開機服務啟動列表
[root@localhost ~]# chkconfig –add haproxy
2.5 啟動服務
啟動服務:
[root@localhost ~]#/usr/local/haproxy/sbin/haproxy –f /usr/local/haproxy/haproxy.cfg
重啟服務:
[root@localhost ~]#/usr/local/haproxy/sbin/haproxy –f /usr/local/haproxy/haproxy.cfg –st
`cat /usr/local/haproxy/logs/haproxy.pid`
停止服務:
[root@localhost ~]# killall haproxy
3 測試
虛擬機192.168.178.2命令如下:
[root@localhost ~]# srevice iptables stop
[root@localhost ~]# setenforce 0
[root@localhost ~]# service haproxy start
[root@localhost ~]# service httpd stop
虛擬機192.168.178.3命令如下
[root@ xldmysql ~]# srevice iptables stop
[root@ xldmysqlt ~]# setenforce 0
[root@ xldmysqlt ~]# service httpd start
虛擬機192.168.178.4命令如下
[root@xldwhj ~]# srevice iptables stop
[root@ xldwhj ~]# setenforce 0
[root@ xldwhj ~]# service httpd start
打開瀏覽器,輸入192.168.178.2,點擊確定出現如下界面:
這是我在192.168.178.3的機器上所寫的網頁,為了體現與192.168.178.4的不同,出現上述網頁后點擊F5刷新,出現下述界面;
可以看出每次刷新訪問,在192.168.178.3與192.168.178.4之間交替訪問,配置成功。