上一篇博文中我們使用keepalived實現了haproxy的高可用,但keepalived問世之初卻是爲LVS而設計,與LVS高度整合,LVS與haproxy一樣也是實現負載均衡,結合keepalived可以實現LVS的高可用架構,這一篇主要介紹RedHat 7配置keepalived+LVS實現高可用的Web負載均衡,架構圖如下:
一、測試環境
計算機名 | 操作系統 | IP地址 | VIP | 安裝的軟件 |
RH7-LVS01 | Redhat 7.2 | 192.168.10.31 | 192.168.10.30 | ipvsadm 1.27、keepalived 1.2.13 |
RH7-LVS02 | Redhat 7.2 | 192.168.10.32 | ipvsadm 1.27、keepalived 1.2.13 | |
RH7-Web-01 | Redhat 7.2 | 192.168.10.33 | —— | Apache httpd 2.4 |
RH7-Web-02 | Redhat 7.2 | 192.168.10.34 | —— | Apache httpd 2.4 |
二、安裝配置lvs與keepalived
1、分別在兩臺lvs服務器rh7-lvs01和rh7-lvs02上安裝ipvsadm和keepalived
[root@rh7-lvs01 ~]# yum install ipvsadm keepalived -y
[root@rh7-lvs02 ~]# yum install ipvsadm keepalived -y
2、修改rh7-lvs01上的keepalived配置文件,按以下內容進行修改,將rh7-lvs01配置爲MASTER節點,並設置LVS的負載均衡模式爲DR模式
[root@rh7-lvs01 ~]# vi /etc/keepalived/keepalived.conf
! Configuration Filefor keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER #MASTER interface eno16777736 virtual_router_id 52 priority 100 #必須比BACKUP的值大 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.30 #VIP } } virtual_server192.168.10.30 80 { delay_loop 6 lb_algo rr #輪詢算法 lb_kind DR #DR模式 #persistence_timeout 50 protocol TCP real_server 192.168.10.33 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.10.34 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
3、修改rh7-lvs02上的keepalived配置文件,按以下內容進行修改,其實只有2處地方與主節點的配置文件不同,即state 要修改爲Backup,priority數值要比master的小
[root@rh7-lvs02 ~]# vi /etc/keepalived/keepalived.conf
! Configuration Filefor keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP #BACKUP interface eno16777736 virtual_router_id 52 priority 90 #必須比MASTER的值小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.30 #VIP } } virtual_server192.168.10.30 80 { delay_loop 6 lb_algo rr #輪詢算法 lb_kind DR #DR模式 #persistence_timeout 50 protocol TCP real_server 192.168.10.33 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.10.34 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
4、在rh7-lvs01上設置keepalived開機自動啓動,並啓動keepalived服務
[root@rh7-lvs01 keepalived]# systemctl enable keepalived
[root@rh7-lvs01 keepalived]# systemctl start keepalived
5、觀察rh7-lvs01的日誌可觀察到keepalived啓動後所發生的一連串動作,根據配置文件的參數進入了MASTER狀態,並綁定了VIP地址
[root@rh7-lvs01 ~]#tail -f /var/log/messages
6、查看rh7-lvs01的IP地址,可以看到VIP已經綁定到網卡上
7、在rh7-lvs02上設置keepalived開機自動啓動,並啓動keepalived服務
[root@rh7-lvs02 keepalived]# systemctl enable keepalived
[root@rh7-lvs02 keepalived]# systemctl start keepalived
8、觀察rh7-lvs02的日誌可觀察到keepalived啓動後所發生的一連串動作,根據配置文件的參數進入了BACKUP狀態
9、查看rh7-lvs02的IP地址,可以看到VIP不在網卡上
10、查看LVS的狀態,可以看到VIP和兩臺Realserver的相關信息
11、由於DR模式是後端兩臺realserver在響應請求時直接將數據包發給客戶端,無需再經過LVS,這樣減輕了LVS的負擔、提高了效率,但由於LVS分發給realserver的數據包的目的地址是VIP地址,因此必須把VIP地址綁定到realserver的迴環網卡lo上,否則realserver會認爲該數據包不是發給自己因此會丟棄不作響應。另外由於網絡接口都會進行ARP廣播響應,因此當其他機器也有VIP地址時會發生衝突,故需要把realserver的lo接口的ARP響應關閉掉。我們可以用以下腳本來實現VIP綁定到lo接口和關閉ARP響應。
12、執行該腳本設置該腳本開機自動執行,查看IP地址,發現lo接口已經綁定了VIP地址
13、同理,在RH7-Web-02上也綁定了VIP地址到lo接口上
本文出自江健龍的技術博客 http://jiangjianlong.blog.51cto.com/3735273/1909031
三、LVS負載均衡測試
1、在兩臺WEB上分別配置不同的默認頁面,以方便區分訪問到的是哪臺WEB,從而看出負載均衡效果是否生效
2、使用瀏覽器訪問VIP,先是訪問到Web01,進行刷新,又訪問到Web02,說明負載均衡已經生效
3、查看LVS的狀態,可以看到兩臺realserver各有2個不活動的連接,說明按1:1權重的輪詢也有生效,不活動連接是因爲我們只是訪問一個靜態頁面,訪問過後很快就會處於不活動狀態
本文出自江健龍的技術博客 http://jiangjianlong.blog.51cto.com/3735273/1909031
四、Keepalived高可用測試
1、停止rh7-lvs01上的keepalived服務,再觀察它的日誌,可以發現其綁定的VIP被移除,兩個realserver節點也被移除了
[root@rh7-lvs01 ~]# systemctl stop keepalived
[root@rh7-lvs01 ~]# tail -f /var/log/messages
2、再看看rh7-lvs02的日誌,再看看rh7-lvs02的日誌,可以看到它立刻檢測到主節點出現故障,馬上將自己進入MASTER狀態,同時接管了VIP,將VIP綁定到自己的網卡上,成功完成一次切換。
[root@rh7-lvs02 ~]# tail -f /var/log/messages
3、使用瀏覽器訪問一下VIP,依然正常負載均衡地成功訪問,對用戶來說並未覺察到VIP剛發生過一次漂移。
4、再將rh7-lvs01的keepalived服務啓動,通過日誌可以看到它啓動後進入了MASTER狀態,把剛纔rh7-lvs02剛綁定的VIP又奪了回去,誰叫它配置爲MASTER呢,天生爲主呀,然王侯將相寧有種乎,我們其實也可以在主節點的keepalived配置文件中增加nopreempt參數控制它不要強行奪佔VIP
[root@rh7-lvs01 ~]# systemctl start keepalived
[root@rh7-lvs01 ~]# tail -f /var/log/messages
[root@rh7-lvs02 ~]# tail -f /var/log/messages
五、keepalived故障監控測試
1、我們將web01的httpd服務停止,模擬web01出現故障不能提供web服務,測試keepalived能否及時監控到並將web01從LVS中剔除,不再分發請求給web01,防止用戶訪問到故障的web服務器
[root@RH7-Web-01 ~]# systemctl stop httpd
2、通過查看rh7-lvs01的日誌可以看到keepalived檢查到web01的80端口失敗,於是將它從羣集中移除,並嘗試通過SMTP服務器發送郵件,由於我沒配SMTP服務器因此連接失敗報了錯誤
[root@rh7-lvs01 ~]# tail -f /var/log/messages
3、通過查看rh7-lvs02的日誌發現它作爲備機也是觸發了相同的操作,說明備機也是時刻在監控着後端realserver的健康狀態
[root@rh7-lvs012~]# tail -f /var/log/messages
4、分別在rh7-lvs01和rh7-lvs02上查看LVS的狀態,可以看到確實都移除了故障的web節點
5、再把web01的httpd服務啓動
[root@RH7-Web-01 ~]# systemctl start httpd
6、通過rh7-lvs01和rh7-lvs02的日誌可以看到它們監控到web01的80端口已成功連接,便再次把web01加入到LVS中去,這個監控的方法可以是檢測端口,也可以檢測URL等其他方法,具體取決於keepalived配置文件中的參數設置。
[root@rh7-lvs01 ~]# tail -f /var/log/messages
[root@rh7-lvs02 ~]# tail -f /var/log/messages
7、分別在rh7-lvs01和rh7-lvs02上查看LVS的狀態,可以看到確實都把web01節點又加了進來
本文出自江健龍的技術博客 http://jiangjianlong.blog.51cto.com/3735273/1909031