keepalived+lvs實現高可用的負載均衡

   對於lvs,我們都是很熟悉的,但是,這種架構的缺陷就在於,它的DR,一旦DR崩潰了,客戶端的請求就不能被髮往後端的real server,無法請求任何數據,下面的我的這個實驗就是利用keepalived對lvs的DR做高可用。

keepalived知識點引入:這個軟件實現的是路由器上的vrrp協議,下面引入一幅圖

vrrp:虛擬路由冗餘協議,從圖中可以看出,上面有一個VIP,後面有兩個路由器連接着兩個網絡,當其中一臺路由器宕機時,我們的VIP就會到另外一臺路由器上,而且,相對的規則也會到另一臺主機上,整個網絡不間斷,仍然保持良好的工作;同樣,我們的keepalived中也應用到了vrrp協議,兩臺keepalived主機有一個vip,每臺主機都有一個優先級,根據哪個優先級大,則VIP和相應的規則策略就在這臺主機上
拓撲圖如下:


前端通過DNS做負載均衡器,客戶端可以訪問不同的負載均衡器DR,然後,請求發送到後端的real server


下面,我會先實現單個VIP情況下的keepalived實現高可用,後面也應用到了雙主形式的lvs負載均衡
 

配置兩個後端的web服務器

提供web的主頁,而且要不一樣,加以區分

在R1上,提供主頁如下

[root@localhost ~]# cat /var/www/html/index.html
<h1>this is web1</h1>

在R2上提供主頁如下

[root@localhost ~]# cat /var/www/html/index.html
<h1>web2 test page</h1>

把兩個web的httpd服務都啓動

[root@localhost ~]# service httpd start

可以使用curl測試一下,能否訪問

 

然後,在兩臺web服務器上,更改內核參數

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

在兩臺web服務器上配置VIP

[root@localhost ~]# ifconfig lo:0 192.168.77.20 netmask 255.255.255.255 broadcast 192.168.77.20 up

在兩臺web服務器上添加一條默認的路由

[root@localhost ~]# route  add -host 192.168.77.20 dev lo:0

回到前端,配置我們的keepalived服務,先停掉服務

提供新的配置文件

[root@node1 keepalived]# cp  keepalived.conf.bak   keepalived.conf修改添加配置文件爲如下
! Configuration File for keepalived
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 30
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.77.20
    }
}
virtual_server 192.168.77.20 80 {
    delay_loop 6     #監控檢查的時間間隔
    lb_algo rr          #負載均衡的調度算法
    lb_kind DR          #ipvs的類型爲,這裏爲直接路由
    nat_mask 255.255.255.0     
    protocol TCP     #基於TCP的協議
    real_server 192.168.77.13 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.77.14 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

將配置文件拷貝到lvs的另一臺DR上,稍做如下修改

[root@node1 keepalived]# scp keepalived.conf node2:/etc/keepalived/
[root@node2 ~]#vim /etc/keepalived/keepalived.conf
    state BACKUP     #這邊是從節點
    priority 99     #調低優先級

我們現在node2上啓動keepalived服務,並且安裝ipvs的管理軟件

[root@node2 keepalived]# service keepalived start
[root@node2 keepalived]# yum install -y ipvsadm

然後,我們可以使用ipvsadm查看是否生成了規則

可見,現在已經生成規則了,是keepalived調用內核的ipvs生成的

 

之後,我們可以在瀏覽器中再次驗證,是否生效


兩次刷新的,顯示的網頁是不一樣的,這樣輪詢的效果就很好的體現出來了,實際的生產系統中,web的網頁應該是一致

 

假設,此時,我們後端的兩個web服務器都掛了,那我們的前端客戶就請求不到任何內容了

我們可以手動停掉兩臺的httpd服務

 

此時,應該在DR上啓動一個sorry server,即啓動一個web服務

但是,ipvs是在DR上生效的,客戶的請求,在INPUT鏈上就被直接轉走了,所以,DR啓動web服務,前端用戶依然訪問不到

 

更改配置文件,在兩臺DR服務器上都做修改

[root@node1 keepalived]# vim keepalived.conf
sorry_server 127.0.0.1 80

爲DR上的web服務提供網頁,可以不一致

[root@node1 keepalived]# cat /var/www/html/index.html
<h1>sorry! the node1 site is maintenance!</h1>

[root@node2 keepalived]# cat /var/www/html/index.html
<h1>sorry! the node2 site is maintenance!</h1>

以上是爲了實驗,實際生產環境中,要求sorry頁面是一樣的

 

然後,分別將兩臺DR上的httpd服務啓動

[root@node1 keepalived]# service httpd start

注意:sorry_server可以指定單獨的一臺服務器

 

兩臺DR都重啓keepalived服務

[root@node1 keepalived]# service keepalived restart

此時,ipvs的規則生效在node1上

我們手動將後端的兩臺web服務器的web服務停止掉,然後,在瀏覽器中訪問

頁面只顯示DR1上的web服務器的頁面

 

查看此時的ipvs規則,只監聽在本地的web服務上

我們可以讓DR1假裝宕機,然後,訪問我們的web服務

[root@node1 keepalived]# service keepalived stop


顯示的DR2上的web服務器的頁面,查看node2上的ipvs規則

再次將後面的web服務上線,訪問到的網頁就是後面的內容了


上面這種事例,我們只有VIP,但是,我們可以使用兩個VIP,做一個雙主的keepalived,來實現lvs-DR的高可用

這時,我們就要將node2作爲node1的主節點了,而且,要添加一個VIP

 

更改配置文件爲如下

[root@node1 keepalived]# vim keepalived.conf     #添加下面的instance
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 130
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 01234
    }
    virtual_ipaddress {
        192.168.77.30
    }
}

注意:同時,還要將上面的virtual_server複製一份給這個實例,只要修改IP地址就行,其他不需要更改

virtual_server 192.168.77.30 80 {
……後面部分省略


[root@node2 keepalived]# vim keepalived.conf
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 130
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 01234
    }
    virtual_ipaddress {
        192.168.77.30
    }
}
virtual_server 192.168.77.30 80 {
……後面部分省略
 
停掉node1和node2上的keepalived服務,到後端的real server上添加192.168.77.30這個地址
[root@localhost ~]# ifconfig lo:1 192.168.77.30 netmask 255.255.255.255 broadcast 192.168.77.30 up
[root@localhost ~]# route add -host 192.168.77.30 dev lo:1
 
使用route -n查看路由
 
然後,在node2上啓動keepalived服務
[root@node2 keepalived]# service keepalived start

查看我們的ipvs規則

然後,在瀏覽器中訪問我們的地址

輸入192.168.77.20時,刷新一次,得到的情況

輸入192.168.77.30時,刷新一次,得到的情況

然後,啓動node1的keepalived服務,可以發現,資源都轉到了node1上了

最後,我們在前端藉助了DNS,將一個域名解析爲兩個IP地址192.168.77.20和192.168.77.30

兩臺前端的DR節點,兩臺都是keepalived的主節點,兩臺都能負載均衡,任何一臺掛了,另一臺都能補上,而且,在DR上又使用keepalived實現了lvs的負載均衡到後點的RS


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章