Keepalived之高可用LVS叢集

1874發表於2020-09-13

  前文我們聊了下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的指令碼

Keepalived之高可用LVS叢集
#/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
View Code

  提示:以上指令碼主要實現了兩個引數,給定start引數就把對應的核心引數修改以後,並vip配置到指定的介面;給stop引數就把vip從指定的埠上刪除,並還原核心引數的設定;

  在rs1和rs2上執行設定核心引數的指令碼

  提示:到此後端兩個RS的環境就準備好了;

  配置keepalived,生成lvs規則

  完整的配置

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 ~]# 
View Code

  提示: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叢集的配置,測試就結束了;

相關文章