對於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