前文我們聊了下keepalived的郵件通知相關配置,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13645163.html;今天我們來說說keepalived高可用LVS叢集;
我們知道一個服務通常是以一個套接字形式對外提供服務,所謂套接字就是ip+埠;前面的部落格中我們主要聊到了keepalived對ip地址的高可用,但通常對ip地址高可用沒有多大實質的作用,重要的是我們高可用的ip地址後端對應的服務才是根本,這一篇部落格主要講怎麼利用keepalived高可用LVS叢集,生成ipvs規則,以及對LVS叢集的rs做健康狀態檢測;
環境說明
名稱 | ip地址 | 埠 |
keepalived-node01(master) | 192.168.0.41 | \ |
keepalived-node02(backup) | 192.168.0.42 | \ |
LVS-RS1 | 192.168.0.43 | 80 |
LVS-RS2 | 192.168.0.44 | 80 |
VIP | 192.168.0.111 | 80 |
準備LVS叢集RS1和RS2
1、安裝webserver
yum install nginx -y
提示:rs1和rs2上都要安裝nginx服務,用於後端rs提供的服務;
2、提供測試頁
3、啟動rs1和rs2上的nginx服務
4、編寫修改核心引數,並配置vip給RS1和RS2的指令碼
#/bin/bash # vip='192.168.0.111' mask='255.255.255.255' interface='lo:0' case $1 in start) echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore ifconfig $interface $vip netmask $mask broadcast $vip up route add -host $vip dev $interface ;; stop) ifconfig $interface down echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore ;; *) echo "Usage:bash $0 start|stop" exit 1 ;; esac
提示:以上指令碼主要實現了兩個引數,給定start引數就把對應的核心引數修改以後,並vip配置到指定的介面;給stop引數就把vip從指定的埠上刪除,並還原核心引數的設定;
在rs1和rs2上執行設定核心引數的指令碼
提示:到此後端兩個RS的環境就準備好了;
配置keepalived,生成lvs規則
完整的配置
[root@node01 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from node01_keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node01 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 vrrp_mcast_group4 224.0.12.132 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.0.111/24 brd 192.168.0.255 dev ens33 label ens33:1 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 192.168.0.111 80 { delay_loop 3 lb_algo wrr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 192.168.0.43 80 { weight 1 nb_get_retry 2 delay_before_retry 2 connect_timeout 30 HTTP_GET { url { path /index.html status_code 200 } } } real_server 192.168.0.44 80 { weight 1 nb_get_retry 2 delay_before_retry 2 connect_timeout 30 HTTP_GET { url { path /index.html status_code 200 } } } } [root@node01 ~]#
提示:virtual_server用於定義LVS對外叢集ip地址和埠(vip),用大括號括起來,其中delay_loop用於指定對後端rs做健康狀態檢查的時間間隔;lb_algo/lvs_sched用於指定lvs的排程演算法,常用的演算法有rr,wrr,lc,wlc,lblc,sh,dh;lb_kind/lvs_method用於指定lvs叢集的型別,常用的型別有DR,NAT,TUN,需注意這裡的型別的值必須大寫,否則服務有異常;有關LVS叢集型別的相關說明請參考https://www.cnblogs.com/qiuhom-1874/p/12327506.html;protocol用於指定4層協議,常用的4層協議有TCP ,UDP,SCTP,需注意這裡的值必須大寫;sorry_server用於指定,當後端RS都當機情況下,臨時對使用者說sorry的伺服器地址和埠;real_server:用來定義後端RS的相關配置,其中weight用於指定當前rs的權重,nb_get_retry用指定對rs檢測的重試次數,如果在指定的次數上都監測失敗就標記該RS為下線狀態,並從當前叢集中下線;delay_before_retry用於指定重試之前延遲的時間;connect_timeout用於指定對rs檢測的超時時長;HTTP_GET 用於配置對rs的檢查方法,HTTP_GET表示應用層http檢測,其中path用於指定檢測到uri,status_code用於指定對指定URI檢測到狀態碼,通常為200;以上virtual_server的配置在node02上也是相同的配置;
安裝sorryserver,並配置測試頁面
啟動keepalived
提示:到此基於keepalived高可用LVS叢集就配置完成了;
驗證:用瀏覽器對VIP訪問,看看是否能夠訪問到後端RS提供的頁面?
提示:我們用瀏覽器訪問VIP並沒有訪問到後端的rs提供的頁面;其中的原因是我們在配置keepalived時,開啟了嚴格遵守vrrp協議,所以啟動keepalived它預設會自動生成iptables規則,禁止任何地址訪問VIP;
提示:解決辦法用iptables -F清空iptables規則;這種清空iptables規則的方式只是臨時的方式,重啟以後,或者vip飄逸後,對應的規則又會生成,永久解決辦法是在keepalived的配置檔案,禁用它自動生成iptabels規則;
提示:在/etc/keepalived/keepalived.conf的global_defs中加上vrrp_iptables這個配置,這個配置表示禁用自動生成iptables規則;當然我們也可配置不嚴格遵守vrrp協議,把vrrp_strict去掉也行;選擇其中一種方式即可;
驗證:重啟keepalived,看看對應iptables規則是否還會生成?
提示:可以看到現在vip所在節點的iptables規則就沒有在自動生成了,對於node02也是相同的配置,重啟keepalived即可解決自動生成iptables規則的問題;
現在在用瀏覽器訪問vip,看看是否能夠訪問到後端RS提供的頁面?
提示:可以看到我們在瀏覽器上訪問VIP是可以正常訪問到後端rs提供的頁面;
驗證:把node01上的keepalived停掉,看看node02是否會自動將vip配置上對應的介面?用瀏覽器是否還會訪問到rs提供的頁面呢?
提示:可以看到當node01的keepalived當機以後,對應vip會自動飄逸到node02上去,並且在客戶端訪問VIP幾乎不受影響;
驗證:在node01上檢視ipvs規則,看看是否都生成了ipvs規則呢?
提示:可以看到node01上並沒有生成ipvs規則,原因是keepalived停掉了,對應的ipvs規則也就刪除了;node02上的keepalived是活躍狀態,所以對應ipvs規則也是有keepalived自動生成;
驗證:把rs1的web服務停掉,看看keepalived是否會檢測到rs1不再線,從而把rs1自動從叢集踢出去呢?
提示:可以看到當rs1故障以後,keepalived會檢測到rs1故障,然後把rs1從叢集中提出去,所以我們在ipvs規則表中就沒有rs1;
驗證:把rs2停掉,看看對應的sorryserver是否會被啟用?
提示:可以看到把rs2停掉以後,對應ipvs規則表中就沒有RS2,並且它會把我們之前配置的sorryserver 的地址和埠配置上;
驗證:用瀏覽器訪問VIP看看對應相應的內容是否是vip所在節點的sorryserver提供的頁面呢?
提示:可以看到當rs都當機以後,再次訪問VIP就會響應我們之前在配置檔案中提供的sorryserver的頁面;
驗證:啟動rs1或rs2看看對應sorryserver是否會下線呢?
提示:可以看到當rs2恢復以後,對應的sorryserver就從叢集下線;
到此基於keepalived高可用LVS叢集的配置,測試就結束了;