Haproxy+KeepAlived 負載均衡

軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。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.實驗環境

  1. 系統版本:CentOS release 5.9 (Final) x86 32位  
  2. HAProxy版本:1.4.8  
  3. Keepalived版本:1.2.4  
  4.    
  5.   
  6. MASTER_IP:192.168.207.130    
  7. BACKUP_IP:192.168.207.131   
  8.    
  9. VIP:192.168.207.141    
  10. WEB_1:192.168.207.129 80端口    
  11. WEB_2:192.168.207.130 8080端口  
  12. WEB_3:192.168.207.131 8080端口  

iptables和selinux都關掉

2.Haproxy安裝

  1. cd /usr/local/src  
  2. mkdir haproxy  
  3. cd haproxy  
  4. wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz  
  5. tar xf haproxy-1.4.8.tar.gz  
  6. cd haproxy-1.4.8  
  7. make TARGET=linux26;make install  
  8. #這裏你也可以這樣寫make TARGET=linux26 --prefix=/usr/local/haproxy,給haproxy安裝添加個路徑  

寫haproxy的配置文件,主從都一樣的,都用這個配置文件
  1. useradd haproxy  
  2. vi /etc/haproxy.cfg  

內容如下:
  1. global  
  2.             log 127.0.0.1   local0       #這個是日誌  
  3.             maxconn 65535    
  4.             user haproxy  
  5.             group haproxy  
  6.             daemon                      #以後臺進程的方式打開  
  7.             nbproc 8                    #haproxy的進程數  
  8.             pidfile /tmp/haproxy.pid  
  9.   
  10. defaults  
  11.              log     127.0.0.1       local3  
  12.              mode   http  
  13.              option httplog  
  14.              option httpclose  
  15.              option dontlognull  
  16.              option forwardfor  
  17.              option redispatch  
  18.              retries 2  
  19.              maxconn 65535  
  20.              balance roundrobin                         #爲了更好的觀察出結果,這裏就用roundrobin簡單輪訓,source算法了  
  21.              stats   uri     /web-status                #這個是管理的url地址,配好後,只要輸入http://ip或者VIP/web-status就可以訪問了  
  22.              contimeout      5000  
  23.              clitimeout      50000  
  24.              srvtimeout      50000  
  25.   
  26. listen  web_vip 0.0.0.0:80              #這裏也要注意千萬不要綁定VIP地址,keepalived主服務器還可以,但是備份服務器是不行的,因爲只有keepalived是主的時候,纔會在此服務器上設定VIP,所以咯,就用0.0.0.0吧  
  27.             mode http  
  28.             option httplog  
  29.             log global  
  30.             option httpchk HEAD /index.html HTTP/1.0        #這裏呢,你得在三臺web服務器上分別建立個index.html頁面,可以添加不同的內容,給待會測試用,內容分別填寫129:80,130:8080,131:8080好了,如果沒有,haproxy會認爲對應的web服務器掛掉了。  
  31.             server web1  192.168.207.129:80   weight 5  check inter 2000 rise 2 fall 3  
  32.             server web2  192.168.207.130:8080 weight 5  check inter 2000 rise 2 fall 3  
  33.             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服務器都打開的情況下,運行
  1. haproxy -f /etc/haproxy.cfg  

這是後已經是個haproxy+3個web的負載均衡模式了

可以再瀏覽器上輸入http://haproxy_ip地址 來感受一下haproxy的運行方式

在url加上/web-status就可以訪問管理界面了

3.安裝keepalived

  1. wget http://www.keepalived.org/software/keepalived-1.2.4.tar.gz  
  2. tar -zxvf keepalived-1.2.4.tar.gz  
  3. cd keepalived-1.2.4  
  4. ./configure --prefix=/usr/local/keepalived  
  5. make && make install  
  6.   
  7. cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived  
  8. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/  
  9. cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  
  10. mkdir -p /etc/keepalived/  
  11. cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf   
  12. chmod +x /etc/init.d/keepalived  

寫keepalived的配置文件
  1. vi /etc/keepalived/keepalived.conf  

內容如下:
  1. # Configuration File for keepalived    
  2.   
  3. global_defs {  
  4.    router_id LVS_DEVEL  
  5. }  
  6.   
  7.   
  8. vrrp_script chk_http_port {  
  9.      script "/etc/keepalived/checkHaproxy.sh"  
  10.      interval 2  
  11.      weight 2  
  12. }  
  13.   
  14. vrrp_instance VI_1 {  
  15.     state MASTER                #從keepalived這裏改成BACKUP  
  16.     interface eth0  
  17.     virtual_router_id 51  
  18.     priority 104                #從keepalived這裏改成100吧,只要從比主小就行,數字是從0~255,數字越大權重越大  
  19.     advert_int 1  
  20.     authentication {  
  21.         auth_type PASS  
  22.         auth_pass 1111  
  23.     }  
  24.     track_script {  
  25.         chk_http_port  
  26.     }  
  27.     virtual_ipaddress {  
  28.         192.168.207.141  
  29.     }  
  30. }   

幾個注意點:

1. /etc/keepalived/checkHaproxy.sh 一定要加上可執行權限,例如chmod +x /etc/keepalived/checkHaproxy.sh

2. 配置文件寫正規些吧,大括號{},要與前面的關鍵字留有一個空格

寫/etc/keepalived/checkHaproxy.sh腳本,如下:
  1. #!/bin/bash  
  2. A=`ps -C haproxy --no-header | wc -l`  
  3. if [ $A -eq 0 ];then  
  4.         /usr/local/sbin/haproxy -f /etc/haproxy.cfg  
  5.         echo "Haproxy start"  
  6.         sleep 3  
  7.         if [ `ps -C haproxy --no-header | wc -l` -eq 0 ];then  
  8.                 /etc/init.d/keepalived stop  
  9.                 echo "keepalived stop"  
  10.         fi  
  11. fi  

意思就是先檢查haproxy是否啓動,如果沒有先啓動haproxy進程,啓動不了則關閉keepalived進程,那邊從keepalived,將立馬編程主進程,繼續工作

這個腳本可以自己寫啦,還是挺簡單的

4.打開服務,驗證


其實就是把3個web服務打開

讓後在打開兩個主從keepalived服務器,而且keepalived會自動打開haproxy服務的,因爲有/etc/keepalived/checkHaproxy.sh嗎,哈哈

都打開後,訪問http://192.168.207.141就可以輪迴訪問3個web服務器的內容啦

所以服務打開後,可以在主keepalived上運行

  1. ip addr  

將會看到eth0多了個VIP的虛擬地址

爲了瞭解keepalived的作用呢

先把主服務器的keepalived給關掉
  1. /etc/init.d/keepalived stop  

查看從keepalived的/var/log/messages日誌,可以看到
  1. Apr 18 12:20:23 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE  
  2. Apr 18 12:20:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE  
  3. Apr 18 12:20:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.  
  4. Apr 18 12:20:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.207.141  
  5. Apr 18 12:20:24 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.207.141 added  
  6. Apr 18 12:20:24 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.207.141 added  
  7. 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服務打開,就可以看到
  1. Apr 18 12:20:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.207.141  
  2. Apr 18 12:21:07 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert  
  3. Apr 18 12:21:07 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE  
  4. Apr 18 12:21:07 localhost Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.  
  5. Apr 18 12:21:07 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.207.141 removed  
  6. Apr 18 12:21:07 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.207.141 removed  
  7. 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

發佈了54 篇原創文章 · 獲贊 3 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章