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.實驗環境

系統版本: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,搞定了,實踐親測,祝君成功


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