軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。LVS就是基於Linux操作系統實現的一種軟負載,HAProxy就是開源的並且基於第三應用實現的軟負載。還可以使用nginx來實現,不過nginx只工作在7層網絡之上。詳細請參考撫琴煮酒寫的“軟件級負載均衡器(LVS/HAProxy/Nginx)的特點簡介和對比”這篇文章,簡單很詳細,很好。
HAProxy相比LVS的使用要簡單很多,功能方面也很豐富。當 前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用於郵件服務器、內部協議通信服務器等),和7層(HTTP)。在4層模式 下,HAProxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy會分析協議,並且能通過允許、拒絕、交換、增加、修改或者刪除請求 (request)或者回應(response)裏指定內容來控制協議,這種操作要基於特定規則。
我現在用HAProxy主要在於它有以下優點,這裏我總結下:
一、免費開源,穩定性也是非常好,這個可通過我做的一些小項目可以看出來,單Haproxy也跑得不錯,穩定性可以與LVS相媲美;
二、根據官方文檔,HAProxy可以跑滿10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express),這個作爲軟件級負載均衡,也是比較驚人的;
三、HAProxy可以作爲MySQL、郵件或其它的非web的負載均衡,我們常用於它作爲MySQL(讀)負載均衡;
四、自帶強大的監控服務器狀態的頁面,實際環境中我們結合Nagios進行郵件或短信報警,這個也是我非常喜歡它的原因之一;
五、HAProxy支持虛擬主機。
1.實驗環境
系統版本:CentOS release 5.9 (Final) x86 32位
HAProxy版本:1.4.8
Keepalived版本:1.2.4
MASTER_IP:192.168.207.130
BACKUP_IP:192.168.207.131
VIP:192.168.207.141
WEB_1:192.168.207.129 80端口
WEB_2:192.168.207.130 8080端口
WEB_3:192.168.207.131 8080端口
iptables和selinux都關掉
2.Haproxy安裝
cd /usr/local/src
mkdir haproxy
cd haproxy
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz
tar xf haproxy-1.4.8.tar.gz
cd haproxy-1.4.8
make TARGET=linux26;make install
#這裏你也可以這樣寫make TARGET=linux26 --prefix=/usr/local/haproxy,給haproxy安裝添加個路徑
寫haproxy的配置文件,主從都一樣的,都用這個配置文件
useradd haproxy
vi /etc/haproxy.cfg
內容如下:
global
log 127.0.0.1 local0 #這個是日誌
maxconn 65535
user haproxy
group haproxy
daemon #以後臺進程的方式打開
nbproc 8 #haproxy的進程數
pidfile /tmp/haproxy.pid
defaults
log 127.0.0.1 local3
mode http
option httplog
option httpclose
option dontlognull
option forwardfor
option redispatch
retries 2
maxconn 65535
balance roundrobin #爲了更好的觀察出結果,這裏就用roundrobin簡單輪訓,source算法了
stats uri /web-status #這個是管理的url地址,配好後,只要輸入http://ip或者VIP/web-status就可以訪問了
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen web_vip 0.0.0.0:80 #這裏也要注意千萬不要綁定VIP地址,keepalived主服務器還可以,但是備份服務器是不行的,因爲只有keepalived是主的時候,纔會在此服務器上設定VIP,所以咯,就用0.0.0.0吧
mode http
option httplog
log global
option httpchk HEAD /index.html HTTP/1.0 #這裏呢,你得在三臺web服務器上分別建立個index.html頁面,可以添加不同的內容,給待會測試用,內容分別填寫129:80,130:8080,131:8080好了,如果沒有,haproxy會認爲對應的web服務器掛掉了。
server web1 192.168.207.129:80 weight 5 check inter 2000 rise 2 fall 3
server web2 192.168.207.130:8080 weight 5 check inter 2000 rise 2 fall 3
server web3 192.168.207.131:8080 weight 5 check inter 2000 rise 2 fall 3
這個說一下啊,如果不懂haproxy的配置參數呢,可以到http://cbonte.github.io/haproxy-dconv/configuration-1.4.html這裏
搜索一下關鍵詞,就有解釋了,挺方便的,不過是英文,嗯,你自己看着辦吧
這裏還說一下啊,HAProxy的算法現在也越來越多了,具體有如下8種:
①roundrobin,表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;
②static-rr,表示根據權重,建議關注;
③leastconn,表示最少連接者先處理,建議關注;
④source,表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作爲解決session問題的一種方法,建議關注;
⑤ri,表示根據請求的URI;
⑥rl_param,表示根據請求的URl參數'balance url_param' requires an URL parameter name;
⑦hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
⑧rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。
在web服務器都打開的情況下,運行
haproxy -f /etc/haproxy.cfg
這是後已經是個haproxy+3個web的負載均衡模式了
可以再瀏覽器上輸入http://haproxy_ip地址 來感受一下haproxy的運行方式
在url加上/web-status就可以訪問管理界面了
3.安裝keepalived
wget http://www.keepalived.org/software/keepalived-1.2.4.tar.gz
tar -zxvf keepalived-1.2.4.tar.gz
cd keepalived-1.2.4
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir -p /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
chmod +x /etc/init.d/keepalived
寫keepalived的配置文件
vi /etc/keepalived/keepalived.conf
內容如下:
# Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/etc/keepalived/checkHaproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER #從keepalived這裏改成BACKUP
interface eth0
virtual_router_id 51
priority 104 #從keepalived這裏改成100吧,只要從比主小就行,數字是從0~255,數字越大權重越大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.207.141
}
}
幾個注意點:
1. /etc/keepalived/checkHaproxy.sh 一定要加上可執行權限,例如chmod +x /etc/keepalived/checkHaproxy.sh
2. 配置文件寫正規些吧,大括號{},要與前面的關鍵字留有一個空格
寫/etc/keepalived/checkHaproxy.sh腳本,如下:
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ];then
/usr/local/sbin/haproxy -f /etc/haproxy.cfg
echo "Haproxy start"
sleep 3
if [ `ps -C haproxy --no-header | wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
echo "keepalived stop"
fi
fi
意思就是先檢查haproxy是否啓動,如果沒有先啓動haproxy進程,啓動不了則關閉keepalived進程,那邊從keepalived,將立馬編程主進程,繼續工作
這個腳本可以自己寫啦,還是挺簡單的
4.打開服務,驗證
其實就是把3個web服務打開
讓後在打開兩個主從keepalived服務器,而且keepalived會自動打開haproxy服務的,因爲有/etc/keepalived/checkHaproxy.sh嗎,哈哈
都打開後,訪問http://192.168.207.141就可以輪迴訪問3個web服務器的內容啦
所以服務打開後,可以在主keepalived上運行
ip addr
將會看到eth0多了個VIP的虛擬地址
爲了瞭解keepalived的作用呢
先把主服務器的keepalived給關掉
/etc/init.d/keepalived stop
查看從keepalived的/var/log/messages日誌,可以看到
Apr 18 12:20:23 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Apr 18 12:20:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Apr 18 12:20:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Apr 18 12:20:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.207.141
Apr 18 12:20:24 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.207.141 added
Apr 18 12:20:24 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.207.141 added
Apr 18 12:20:24 localhost avahi-daemon[4208]: Registering new address record for 192.168.207.141 on eth0.
是的吧,訪問http://192.168.207.141呢,還是正常訪問,
在把主keepalived服務打開,就可以看到
Apr 18 12:20:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.207.141
Apr 18 12:21:07 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert
Apr 18 12:21:07 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Apr 18 12:21:07 localhost Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.
Apr 18 12:21:07 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.207.141 removed
Apr 18 12:21:07 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.207.141 removed
Apr 18 12:21:07 localhost avahi-daemon[4208]: Withdrawing address record for 192.168.207.141 on eth0.
這裏附上haproxy管理頁面的圖片,以及一個小實驗
訪問http://192.168.207.141/web-status,可以看到如下畫面
可以看到後端的3個web服務器都是好的,
這時候呢,我把web3的web服務給關了,因爲我用的是apache,所以直接運行service httpd stop
然後可以看到
明白了,然後訪問http://192.168.207.141也不會出現web的index.html頁面了
ok,搞定了,實踐親測,祝君成功