軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。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,搞定了,實踐親測,祝君成功
轉自:
http://blog.csdn.net/zmj_88888888/article/details/8818274