1. 程式人生 > >lvs+keepalived 高可用負載均衡模式分析

lvs+keepalived 高可用負載均衡模式分析

lvs 高可用 keepalived nginx

1. 前言

在《keepalived 雙機熱備》這篇文章中,我寫了利用keepalived 這個開源軟件實現高可用的功能,以及keepalived 高可用所使用的協議——利用vrrp 協議,在高可用網絡組內廣播自己的優先級,優先級最高的就能搶占vip資源,充當MASTER 主機,提供服務。在今天這篇文章,我們來看看lvs 如何與keepalived 的高可用功能結合,實現對負載均衡調度器的高可用。

經過《lvs_nat 負載均衡模式及抓包分析》 和《lvs_dr 負載均衡模式分析》這裏兩篇文章的分析,我們已經對lvs的架構非常熟悉了。但是在這些架構中,lvs 很容易出現單點故障,所以需要對 lvs 調度器增加一個高可用的功能。前面介紹的 keepalived 軟件就是一個很好的,實現高可用的軟件。keepalived 最先是為了解決 lvs 對集群內的服務器沒有監控功能而實現的,lvs 的集群內,如果服務宕機,客戶端發過來的請求,它還是會按照調度算法將請求逐一發到後端服務。keepalived 不僅僅有 lvs 的功能,還可以對集群服務進行監控檢測,如果發現服務器宕機了,keepalived就會將宕機的主機踢出集群,不再將客戶端的請求發送到該主機。當主機恢復正常後,keepalived會重新將該主機添加都集群。

再經過發展,keepalived增加了vrrp協議,可以實現虛擬路冗余的功能。vrrp協議,就是實現我們今天要講的 lvs + keepalived 高可用功能的關鍵協議。vrrp 的實現原理,可以翻看《keepalived 雙機熱備》這篇文章。

2. 具體配置

2.1 實驗環境

技術分享圖片
今天我們要分析的重點就是架構圖中用紅色框圈出的 lvs 調度器層,通過keepalived 實現冗余。

ip地址分配:
客戶端 : 192.168.188.111

dir1 : 192.168.188.108

dir2 : 192.168.188.109

rs1 : 192.168.188.107

rs2 : 192.168.188.110

vip : 192.168.188.120

說明: 在這個架構中我們仍然使用lvs dr 的負載均衡模式。由於後端的realserver 沒有太多變化,所以,可以繼續使用《lvs_dr 負載均衡模式分析》這篇文章的配置方法。而前端lvs 的功能則使用了 keepalived 軟件。

2.2 配置realserver

2.2.1 在兩臺realserver 主機運行lvs_rs.sh 腳本

[root@cenvm72 network-scripts]# cat /usr/local/sbin/lvs_rs.sh 
#/bin/bash
vip=192.168.188.120
#把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
#參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

兩臺realeserver 主機的 lvs_rs.sh 配置文件都一樣

2.2.2 在兩臺lvs調度器上安裝keepalived並配置keepalived軟件

 yum  install  -y   keepalived 

 [root 11:57:22 @CentOS3 sbin] cat /etc/keepalived/keepalived.conf 
vrrp_instance VI_1 {
        #備用服務器上為 BACKUP
        state MASTER
        #綁定vip的網卡為eth0,你的網卡和我的可能不一樣,這裏需要你改一下
        interface eth0
        virtual_router_id 51
        #備用服務器上為90
        priority 100
        advert_int 1
    authentication {
                auth_type PASS
                auth_pass hell>com

    }
    virtual_ipaddress {
                192.168.188.120      # 這個就是vip;如果有多個vip,支持多行隔開

    }

}
virtual_server 192.168.188.120  80 {
        #(每隔10秒查詢realserver狀態)
        delay_loop 5
        #(lvs 算法)
        lb_algo wlc  # wlc:最少連接數算法,因為實驗的訪問量本來就少,所以為了看效果,我們就選用輪詢算法
        #(DR模式)
        lb_kind DR
        #(同一IP的連接60秒內被分配到同一臺realserver)
        persistence_timeout 0
        #(用TCP協議檢查realserver狀態)
        protocol TCP

    real_server 192.168.188.107 80 {
                #(權重)
                weight 100
        TCP_CHECK {
                    #(10秒無響應超時)
                    connect_timeout 10
                    nb_get_retry 3
                    delay_before_retry 3
                    connect_port 80

        }

    }
    real_server 192.168.188.110 80 {
                weight 100
        TCP_CHECK {
                    connect_timeout 10
                    nb_get_retry 3
                    delay_before_retry 3
                    connect_port 80

        }

    }

}

說明: 在另一臺用來充當 lvs 調度器備機的機器上安裝keepalived軟件,配置的時候,只需修改state 為BACKUP 和 priority 為90 即可。

3. 啟動服務

3.1 dir1 調度器

為了防止以前的Ivs 規則,可以先執行

ipvsadm  -C   清除一些規則,
然後需要打開  ip 轉發功能:
echo    1   /proc/sys/net/ipv4/ip_forward  

然後,啟動keepalived 
/etc/init.d/keepalived    start 

3.2 dir2 調度器

同樣的做法

ipvsadm  -C   清除一些規則,
然後需要打開  ip 轉發功能:
echo    1   /proc/sys/net/ipv4/ip_forward  

然後,啟動keepalived 
/etc/init.d/keepalived    start 

3.3 realserver 服務器執行 lvs_rs.sh 腳本

/bin/bash     /usr/local/sbin/lvs_rs.sh

在兩臺realserver 主機上執行。

3.4 realserver 服務器啟動nginx 服務


安裝nginx ,修改nginx 服務默認html 頁面,區分rs1 和rs2 不同即可,最後啟動nginx

4. 測試結果

(1)在 dir1 上驗證vip:

[root 12:13:37 @CentOS3 sbin] ip add show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:50:d5:63 brd ff:ff:ff:ff:ff:ff
    inet 192.168.188.108/24 brd 192.168.188.255 scope global eth0
    inet 192.168.188.120/32 scope global eth0
    inet6 fe80::20c:29ff:fe50:d563/64 scope link 
       valid_lft forever preferred_lft forever

(2)在 dir1 上查看系統日誌:

[root 12:14:35 @CentOS3 sbin] tail  /var/log/messages
Mar 30 10:50:49 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
Mar 30 10:50:50 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 30 10:50:50 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 30 10:50:50 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120
Mar 30 10:50:50 CentOS3 Keepalived_healthcheckers[12054]: Netlink reflector reports IP 192.168.188.120 added
Mar 30 10:50:54 CentOS3 Keepalived_healthcheckers[12054]: TCP connection to [192.168.188.107]:80 failed !!!
Mar 30 10:50:54 CentOS3 Keepalived_healthcheckers[12054]: Removing service [192.168.188.107]:80 from VS [192.168.188.120]:80
Mar 30 10:50:55 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120

可以看到 vip 192.168.188.120 已經綁定到dir1 的eth0 網卡了

(3)再來看看dir2 的情況:

[root 10:48:45 @CentOS3_02 ~] ip add show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8e:cf:65 brd ff:ff:ff:ff:ff:ff
    inet 192.168.188.109/24 brd 192.168.188.255 scope global eth0
    inet6 fe80::20c:29ff:fe8e:cf65/64 scope link 
       valid_lft forever preferred_lft forever

vip 並不在dir2 這臺主機。

(4) 將dir1 的keepalived 關掉,vip 將會被 dir2 搶占,lvs 提供的負載均衡服務沒有失效。

dir1  :
/etc/init.d/keepalived   stop

dir2 :
[root 12:53:33 @CentOS3_02 ~] tail /var/log/messages
Mar 30 10:50:51 CentOS3_02 ntpd[1422]: Deleting interface #20 eth0, 192.168.188.120#123, interface stats: received=0, sent=0, dropped=0, active_time=128 secs
Mar 30 10:51:29 CentOS3_02 Keepalived_healthcheckers[8111]: TCP connection to [192.168.188.107]:80 success.
Mar 30 10:51:29 CentOS3_02 Keepalived_healthcheckers[8111]: Adding service [192.168.188.107]:80 to VS [192.168.188.120]:80
Mar 30 12:56:22 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 30 12:56:23 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 30 12:56:23 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 30 12:56:23 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120
Mar 30 12:56:23 CentOS3_02 Keepalived_healthcheckers[8111]: Netlink reflector reports IP 192.168.188.120 added
Mar 30 12:56:25 CentOS3_02 ntpd[1422]: Listen normally on 21 eth0 192.168.188.120 UDP 123
Mar 30 12:56:28 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120

或者dir2  :
[root 12:57:32 @CentOS3_02 ~] ip add show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:8e:cf:65 brd ff:ff:ff:ff:ff:ff
    inet 192.168.188.109/24 brd 192.168.188.255 scope global eth0
    inet 192.168.188.120/32 scope global eth0
    inet6 fe80::20c:29ff:fe8e:cf65/64 scope link 
       valid_lft forever preferred_lft forever

可以看到,vip 已經被 dir2 搶占了。

(5)重新啟動 dir1 的 keepalived 服務,vip 從新被 dir1 搶占綁定
驗證方法同上一步,所以,截圖就省略了。

5. 總結

通過實驗,我們已經驗證了,keepalived 具有高可用的功能,在本文的測試驗證中已經證明。其實,keepalived 還有檢測後端服務的健康情況的功能,如果將這次實驗中的nginx 停掉,客戶端的請求就會發到其中一臺服務器,當nginx重新啟動,客戶端的請求又會均勻地轉發到nginx 服務器。因為今天主要將 lvs + keepalived 的高可用功能,所以,對nginx 的測試就不在贅述了。大家可以在這個實驗的基礎上,嘗試一下,看看結果如何。

lvs+keepalived 高可用負載均衡模式分析