lvs-dr的keepalived實現

利用Keepalived實現lvs-dr的簡單示例:
一共使用5臺服務
a.時間服務器、調度器(Director1):
CentOS 7.2A
b.調度器(Director2)
CentOS 7.2B
c.後端服務器(Real Server1):
CentOS 7.2C
d.後端服務器(Real Server1):
CentOS 7.2D
f.進行測試的客戶端:
CentOS 7.5A

1.修改對應的主機名;爲了方便觀察
    Director(CentOS 7.2A):
        ~]# hostnamectl set-hostname drct1
    Director(CentOS 7.2B):
        ~]# hostnamectl set-hostname drct2
    Real Server1(CentOS 7.2C):
        ~]# hostnamectl set-hostname rs1
    Real Server2(CentOS 7.2D):
        ~]# hostnamectl set-hostname rs2

2.對比無keepalived的lvs-dr模型,無需在調度器上的DIP配置對應的VIP,因爲後續會在keepalived的主配置文件中進行VIP的配置;

3.在rs1、rs2上利用腳本進行配置
    #!/bin/bash
    #
    VIP=172.16.72.254
    MASK=255.255.255.255

    case $1 in
    setup)
    #調整ARP相關的內核參數:
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce        

    #在lo的標籤接口上配置VIP
        ifconfig lo:0 $VIP netmask $MASK broadcast $VIP up

    #爲了能夠使響應報文從lo:0標籤接口向外封裝發送數據,需要指定一條特殊的靜態路由:
        route add -host $VIP dev lo:0       
        ;;
    delete)
        ifconfig lo:0 down

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
    *)
        echo "Usage: $(basename $0) { setup | delete }"
        ;;
    esac

4.關閉防火牆、SELinux,確保調度器裝上ipvsadm、keepalived、mailx;http服務所有服務器都要裝上;

5.在調度器上的配置:
    drct1:
        ~]# cd /etc/keepalived
        keepalived]# vim keepalived.conf
            ! Configuration File for keepalived

            global_defs {
               notification_email {
                    root@localhost
               }
               notification_email_from keepalived@localhost
               smtp_server 127.0.0.1
               smtp_connect_timeout 30
               router_id drct1
               vrrp_mcast_group4 224.0.100.18
            }

            vrrp_instance VI_1 {
                state MASTER
                interface eno16777736
                virtual_router_id 36
                priority 100
                advert_int 1
                authentication {
                    auth_type PASS
                    auth_pass 1111
                }
                virtual_ipaddress {
                    172.16.72.254/32 dev eno16777736 brd 172.16.72.254 label eno16777736:0
                    #只在lvs-dr模型中才這樣寫
                }
            }

            virtual_server 172.16.72.254 80 {
                delay_loop 1
                lb_algo wrr
                lb_kind DR
                protocol TCP

                real_server 172.16.72.3 80 {
                    weight 1
                    HTTP_GET {
                        url {
                          path /index.html
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }

                real_server 172.16.72.4 80 {
                    weight 3
                    HTTP_GET {
                        url {
                          path /index.html
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }
            }   

    drct2:
        ~]# cd /etc/keepalived
        keepalived]# vim keepalived.conf
            ! Configuration File for keepalived

            global_defs {
               notification_email {
                    root@localhost
               }
               notification_email_from keepalived@localhost
               smtp_server 127.0.0.1
               smtp_connect_timeout 30
               router_id drct2
               vrrp_mcast_group4 224.0.100.18
            }

            vrrp_instance VI_1 {
                state BACKUP
                interface eno16777736
                virtual_router_id 36
                priority 90
                advert_int 1
                authentication {
                    auth_type PASS
                    auth_pass 1111
                }
                virtual_ipaddress {
                    172.16.72.254/32 dev eno16777736 brd 172.16.72.254 label eno16777736:0
                    #只在lvs-dr模型中才這樣寫
                }
            }

            virtual_server 172.16.72.254 80 {
                delay_loop 3
                lb_algo wrr
                lb_kind DR
                protocol TCP

                real_server 172.16.72.3 80 {
                    weight 1
                    HTTP_GET {
                        url {
                          path /index.html
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }

                real_server 172.16.72.4 80 {
                    weight 3
                    HTTP_GET {
                        url {
                          path /index.html
                        }
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                    }
                }
            }

6.rs1、rs2上都開啓http服務,並配置好相關的文件,令訪問rs1、rs2時顯示的內容不相同,這樣能夠方便觀察keepalived的VRRP;實際生產環境中是使後端服務器顯示的內容都相同;

7.drct1、drct2上都開啓keepalived服務,利用ipvsadm查看集羣配置情況:
    keepalived]# systemctl start keepalived.service
    keepalived]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  172.16.72.254:80 wrr
      -> 172.16.72.3:80               Route   1      0          0         
      -> 172.16.72.4:80               Route   3      0          0         
    You have new mail in /var/spool/mail/root

8.客戶端測試
    當兩臺調度服務器都正常工作、後端提供的http服務也正常時;
        ~]# for i in {1..10} ; do curl http://172.16.72.254 ; done
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/
        this is CentOS 7.2C for /var/www/html/

    關閉其中一臺調度服務器的keepalived、後端提供的http服務也正常時:
        ~]# for i in {1..10} ; do curl http://172.16.72.254 ; done
        This is CentOS 7.2D for /var/www/html
        this is CentOS 7.2C for /var/www/html/
        This is CentOS 7.2D for /var/www/html
        This is CentOS 7.2D for /var/www/html
        This is CentOS 7.2D for /var/www/html
        this is CentOS 7.2C for /var/www/html/
        This is CentOS 7.2D for /var/www/html
        This is CentOS 7.2D for /var/www/html
        This is CentOS 7.2D for /var/www/html
        this is CentOS 7.2C for /var/www/html/

    當兩臺調度服務器都正常工作、關閉rs1的http服務:
        調度器上:
            keepalived]# ipvsadm -ln
            IP Virtual Server version 1.2.1 (size=4096)
            Prot LocalAddress:Port Scheduler Flags
              -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
            TCP  172.16.72.254:80 wrr
              -> 172.16.72.4:80               Route   3      0          0

        客戶端訪問:
            ~]# for i in {1..10} ; do curl http://172.16.72.254 ; done
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html
            This is CentOS 7.2D for /var/www/html

        //客戶端測試結果顯示:
            1.調度器能夠實現高可用
            2.後端RS也能夠實現負載均衡

其他較爲有用的配置命令:
一.在LVS CONFIGURATION配置段的virtual server的上下文添加:
sorry_server <IPADDR> <PORT>

    示例:
        sorry_server 127.0.0.1 80

    作用:當後端RS都無法使用時,前段的調度器給客戶端返回一個友好的錯誤頁面;

    1) 把RS的http服務都關閉,同時開啓調度器的http服務,配置sorry_server顯示的web站點;重啓keepalived服務;若此前keepalived主配置文件已添加sorry_server的配置,無需重啓服務;

    2) 此時兩臺調度器都應該處於正常的keepalived狀態,
        在客戶端測試
            ~]# for i in {1..10} ; do curl http://172.16.72.254 ; done
            sorry page for 1
            sorry page for 1
            sorry page for 1
            sorry page for 1
            sorry page for 1
            sorry page for 1
            sorry page for 1
            sorry page for 1
            sorry page for 1
            sorry page for 1

        在調度器(drct1)上:
            keepalived]# ipvsadm -ln
            IP Virtual Server version 1.2.1 (size=4096)
            Prot LocalAddress:Port Scheduler Flags
              -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
            TCP  172.16.72.254:80 wrr
              -> 127.0.0.1:80                 Route   1      0          10

    3) 關閉調度器1(drct1)的keepalived,
        在客戶端測試:
            ~]# for i in {1..10} ; do curl http://172.16.72.254 ; done
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222
            sorry page for 2222222222222222222

        //利用keepalived的sorry_server的配置也可實現

二.在VRRPD CONFIGURATION配置段的上下文中添加:
    notify_master <STRING>|<QUOTED-STRING>
    notify_backup <STRING>|<QUOTED-STRING>
    notify_fault <STRING>|<QUOTED-STRING>
        //設置噹噹前服務器狀態發生變化時,所觸發的腳本文件的路徑及相關參數;

    狀態變更通知腳本示例:/etc/keepalived/notify.sh
        #!/bin/bash
        #

        CONTACT='root@localhost'
        notify() {
            MAILSUBJECT="$(hostname) changed state to $1, VIP reflact."
            #發送電子郵件的主題
            MAILBODY="$(date +'%F %T'): VRRP STATUS CHANGED, $(hostname) change state to $1"
            #郵件的正文
            echo "$MAILBODY" | mail -s "$MAILSUBJECT" "$CONTACT"
        }

        #case $1的$1指的是執行腳本時後面給定的參數
        #notify()函數的$1指的是case引用notify()函數執行命令時notify後面的參數

        case $1 in
        master)
            notify MASTER
            ;;
        backup)
            notify BACKUP
            ;;
        fault)
            notify FAULT
            ;;
        *)
            echo "Usage: $(basename $0) { master | backup | fault}"
            ;;
        esac

    示例:兩臺調度器都要完成相同的操作
        keepalived]# vim notify.sh
        keepalived]# chmod +x notify.sh
        keepalived]# vim keepalived.conf
            VRRP的配置段:
                vrrp_instance VI_1 {
                    state MASTER
                    interface eno16777736
                    virtual_router_id 36
                    priority 100
                    advert_int 1
                    authentication {
                        auth_type PASS
                        auth_pass 1111
                    }
                    virtual_ipaddress {
                        172.16.72.254/32 dev eno16777736 brd 172.16.72.254 label eno16777736:0
                    }
                    notify_master "/etc/keepalived/notify.sh master"
                    notify_backup "/etc/keepalived/notify.sh backup"
                    notify_fault "/etc/keepalived/notify.sh fault"
                }

    測試:
        1) 兩臺調度器重啓keepalived服務;若此前keepalived主配置文件已添加notify的配置,無需重啓服務;

        2) 兩臺調度器都重啓後,利用mail查看
            查看調度器1(drct1)的郵箱:
                keepalived]# mail
                >N 11 root                  Fri May  3 23:58  18/698   "drct1 changed state to MASTER, VIP reflact."

                //調度器1(drct1)進入MASTER

            查看調度器2(drct2)的郵箱:
                keepalived]# mail
                >N 11 root                  Fri May  3 23:58  18/698   "drct2 changed state to BACKUP, VIP reflact."

                //調度器2(drct2)進入BACKUP

        3) 停止調度器1(drct1)的keepalived,利用mail查看
            查看調度器2(drct2)的郵箱:
                keepalived]# mail
                >N 12 root                  Fri May  3 23:58  18/698   "drct2 changed state to MASTER, VIP reflact."

                //因爲停止了調度器1(drct1),所以調度器2(drct2)進入MASTER

三.利用外部輔助腳本,完成MASTER/BACKUP的手動切換;
    keepalived允許調用外部輔助腳本,完成對於資源的監控,並根據健康的返回狀態結果實現動態調整;

    如下指令應該使用在vrrp實例定義之前
    vrrp_script <STRING> {
        script ""
        interval <INT>
        weight -<INT>
    }

    如下述指令使用的vrrp示例上下文之中;
    track_script {
        SCRIPT_NAME
    }

    示例:在調度器1(drct1)上實現手動的MASTER/BACKUP切換
        keepalived]# vim keepalived.conf
            ! Configuration File for keepalived

            global_defs {
               notification_email {
                    root@localhost
               }
               notification_email_from keepalived@localhost
               smtp_server 127.0.0.1
               smtp_connect_timeout 30
               router_id drct1
               vrrp_mcast_group4 224.0.100.18
            }

            vrrp_script check_state {
            #script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
            #用上述配置keepalived啓動時會顯示:Unable to access script `[[`;此條vrrp_script不可用,無法被執行啓動;改爲如下;
               script "/etc/keepalived/keep_down.sh"
               interval 1
            }

            vrrp_instance VI_1 {
                state MASTER
                interface eno16777736
                virtual_router_id 36
                priority 100
                advert_int 1
                authentication {
                    auth_type PASS
                    auth_pass 1111
                }
                virtual_ipaddress {
                    172.16.72.254/32 dev eno16777736 brd 172.16.72.254 label eno16777736:0
                }
                track_script {
                    check_state
                }
                notify_master "/etc/keepalived/notify.sh master"
                notify_backup "/etc/keepalived/notify.sh backup"
                notify_fault "/etc/keepalived/notify.sh fault"

            }

        keepalived]# vim keep_down.sh
            #!/bin/bash
            #
            if [ -f /etc/keepalived/down ];then
            weight -20
            fi

        keepalived]# chmod +x keep_down.sh

        keepalived]# touch down
            //調度器1(drct1)的優先級從100降到80(weight -20);此時調度器2(drct2)的優先級爲90,
            //調度器1(drct1)爲BACKUP;調度器2(drct2)爲MASTER;可用mail查看狀態轉換的信息;

        keepalived]# rm -f down
            //調度器1(drct1)的優先級從80回到100;此時調度器2(drct2)的優先級爲90,調度器2(drct2)的優先級爲90;
            //調度器1(drct1)爲MASTER;調度器2(drct2)爲BACKUP;可用mail查看狀態轉換的信息;

四.利用外部輔助腳本,高可用其他的系統服務:
用兩臺調度器上的進行http服務的高可用實現

搶佔式(默認)下的高可用http服務實現:
    1.編輯兩臺調度器的keepalived的主配置文件
    調度器1(drct1):
        keepalived]# vim keepalived.conf
            ! Configuration File for keepalived

            global_defs {
               notification_email {
                    root@localhost
               }
               notification_email_from keepalived@localhost
               smtp_server 127.0.0.1
               smtp_connect_timeout 30
               router_id drct1
               vrrp_mcast_group4 224.0.100.18
            }

            vrrp_script check_state {
            #script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
            #用上述配置keepalived啓動時會顯示:Unable to access script `[[`;此條vrrp_script不可用,無法被執行啓動;改爲如下;
               script "/etc/keepalived/keep_down.sh"
               interval 1
            }

            vrrp_script check_httpd {
                script "/usr/bin/killall -0 httpd && exit 0 || exit 1"
                interval 1
                weight -20
            }

            vrrp_instance VI_1 {
                state MASTER
                interface eno16777736
                virtual_router_id 36
                priority 100
                advert_int 1
                authentication {
                    auth_type PASS
                    auth_pass 1111
                }
                virtual_ipaddress {
                    172.16.72.100
                }
                track_script {
                    check_state
                    check_httpd
                }
                notify_master "/etc/keepalived/notify.sh master"
                notify_backup "/etc/keepalived/notify.sh backup"
                notify_fault "/etc/keepalived/notify.sh fault"

            }

    調度器2(drct2):
        keepalived]# vim keepalived.conf
            ! Configuration File for keepalived

            global_defs {
               notification_email {
                    root@localhost
               }
               notification_email_from keepalived@localhost
               smtp_server 127.0.0.1
               smtp_connect_timeout 30
               router_id drct2
               vrrp_mcast_group4 224.0.100.18
            }

            vrrp_script check_state {
            #script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
            #用上述配置keepalived啓動時會顯示:Unable to access script `[[`;此條vrrp_script不可用,無法被執行啓動;改爲如下;
               script "/etc/keepalived/keep_down.sh"
               interval 1
            }

            vrrp_script check_httpd {
                script "/usr/bin/killall -0 httpd && exit 0 || exit 1"
                interval 1
                weight -20
            }

            vrrp_instance VI_1 {
                state BACKUP
                interface eno16777736
                virtual_router_id 36
                priority 90
                advert_int 1
                authentication {
                    auth_type PASS
                    auth_pass 1111
                }
                virtual_ipaddress {
                    172.16.72.100
                }
                track_script {
                    check_state
                    check_httpd
                }
                notify_master "/etc/keepalived/notify.sh master"
                notify_backup "/etc/keepalived/notify.sh backup"
                notify_fault "/etc/keepalived/notify.sh fault"

            }

        //兩臺調度器的主配置文件中主要是加入了vrrp_script check_httpd和track_script這兩個配置

    3.配置兩個調度器的http服務頁面

    4.測試
        a.先開啓調度器2(drct2)的keepalived和http服務:
            keepalived]# systemctl start keepalived.service
            keepalived]# ip addr list
                //查看是否有172.16.72.100這個VIP

        b.用客戶端測試:
            ~]# curl http://172.16.72.100
            sorry page for 2222222222222222222

        c.再打開調度器1(drct1)的keepalived和http服務;
            keepalived]# systemctl start keepalived.service
            keepalived]# ip addr list
                //查看是否有172.16.72.100這個VIP,相應的調度器2(drct2)上的VIP就沒有了;因爲此時調度器1(drct1)爲MASTER,調度器2(drct2)爲BACKUP;

        d.用客戶端測試:
            ~]# curl http://172.16.72.100
            sorry page for 1
                //此時訪問到的頁面已經是調度器1(drct1)上的http配置的頁面

非搶佔式下的高可用http服務實現:
    與搶佔式不同的是:
        1.當A調度器的http服務故障時,B調度器馬上就會變成BACKUP狀態,後來A調度器的http服務修復恢復後,不會立即搶佔爲MASTER狀態,依然處於BACKUP狀態;即使A比B優先級高;
        2.直到B調度器的http服務故障時,A纔會從BACKUP狀態回到MASTER

    drct1的配置文件:/etc/keepalived/keepalived.conf
        ! Configuration File for keepalived

        global_defs {
           notification_email {
                root@localhost
           }
           notification_email_from keepalived@localhost
           smtp_server 127.0.0.1
           smtp_connect_timeout 30
           router_id drct1
           vrrp_mcast_group4 224.0.100.18
        }

        vrrp_script check_state {
            script "/etc/keepalived/keep_down.sh"
            interval 1
        }

        vrrp_script check_httpd {
            script "/usr/bin/killall -0 httpd && exit 0 || exit 1"
            interval 1
            weight -20
        }

        vrrp_instance VI_1 {
            state MASTER
            interface eno16777736
            virtual_router_id 36
            nopreempt
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
            virtual_ipaddress {
                172.16.72.100
            }
            track_script {
                check_state
                check_httpd
            }
            notify_master "/etc/keepalived/notify.sh master"
            notify_backup "/etc/keepalived/notify.sh backup"
            notify_fault "/etc/keepalived/notify.sh fault"

        }

        //注意:
            1.killall命令寫進腳本的時候用絕對命令的絕對路徑,否則可能會引起vrrp_script執行失敗
            2.drct1的初始狀態爲MASTER,需要填寫在vrrp_instance VI_1填寫nopreempt
            3.vrrp_script check_httpd{}中需要寫weight

    drct2的配置文件:/etc/keepalived/keepalived.conf
        ! Configuration File for keepalived

        global_defs {
           notification_email {
                root@localhost
           }
           notification_email_from keepalived@localhost
           smtp_server 127.0.0.1
           smtp_connect_timeout 30
           router_id drct2
           vrrp_mcast_group4 224.0.100.18
        }

        vrrp_script check_state {
           script "/etc/keepalived/keep_down.sh"
           interval 1
        }

        vrrp_script check_httpd {
            script "/usr/bin/killall -0 httpd && exit 0 || exit 1"
            interval 1
        }

        vrrp_instance VI_1 {
            state BACKUP
            interface eno16777736
            virtual_router_id 36
            priority 90
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
            virtual_ipaddress {
                172.16.72.100
            }
            track_script {
                check_state
                check_httpd
            }
            notify_master "/etc/keepalived/notify.sh master"
            notify_backup "/etc/keepalived/notify.sh backup"
            notify_fault "/etc/keepalived/notify.sh fault"

        }

        //注意:
            1.killall命令寫進腳本的時候用絕對命令的絕對路徑,否則可能會引起vrrp_script執行失敗;
            2.drct2作爲初始狀態爲BACKUP,所以不需要填寫vrrp_instance VI_1中的nopreempt
            3.vrrp_script check_httpd{}中不需要寫weight

        狀態通知和轉變情況腳本:
        keepalived]# vim notify.sh
            #!/bin/bash
      #

      CONTACT='root@localhost'
      notify() {
      MAILSUBJECT="$(hostname) changed state to $1, VIP reflact."
      #發送電子郵件的主題
      MAILBODY="$(date +'%F %T'): VRRP STATUS CHANGED, $(hostname) change state to $1"
      #郵件的正文
      echo "$MAILBODY" | mail -s "$MAILSUBJECT" "$CONTACT"
      }

      #case $1的$1指的是執行腳本時後面給定的參數
      #notify()函數的$1指的是case引用notify()函數執行命令時notify後面的參數

      case $1 in
      master)
        notify MASTER
        ;;
      backup)
        notify BACKUP
          systemctl start httpd.service
        ;;
      fault)
        notify FAULT
          systemctl start httpd.service
        ;;
      *)
        echo "Usage: $(basename $0) { master | backup | fault}"
        ;;
      esac

     keepalived]# chmox +x notify.sh

     //兩臺調度器上都需要此腳本

   測試:
    a.先開啓調度器2(drct2)的keepalived和http服務,客戶端測試
        ~]# curl http://172.16.72.100
            sorry page for 2222222222222222222

        b.然後開啓調度器1(drct1)的keepalived服務但不開啓http服務,客戶端測試:
            ~]# curl http://172.16.72.100
            sorry page for 2222222222222222222
                //此時表明訪問到的依然是drct2上http服務,而不是drct1;
                //因爲如果訪問到的是drct1,由於沒有開啓http服務,客戶端得到的返回結果將會是:
                    curl: (7) Failed connect to 172.16.72.100:80; Connection refused
                //這也間接證明了非搶佔式的實現

        c.開啓調度器1(drct1)的http服務,客戶端再測試:
            ~]# curl http://172.16.72.100
            sorry page for 2222222222222222222
                //返回結果依然是drct2的http服務配置的頁面信息;

        d.關閉調度器2(drct2)的http服務,客戶端測試:
            ~]# curl http://172.16.72.100
            sorry page for 1

        f.打開關閉調度器2(drct2)的http服務,客戶端測試:
            ~]# curl http://172.16.72.100
            sorry page for 1
                //根據e,f可以看出,調度器2(drct2)的http服務從故障到恢復正常後,依然訪問調度器1(drct1)的http服務配置的頁面信息;

    測試總結:
        1.當調度器2的keepalived、http第一開啓,調度器1還沒有開啓keepalived、http服務,調度器2先處於MASTER狀態;
        2.直到調度2的http服務下線,調度器1的狀態才能從BACKUP變成MASTER狀態,調度器1開啓的http服務才能被應用;
        3.只要調度器1的http、keepalived服務一直正常工作,MASTER的狀態就會一直不變,返回的信息依然是調度器1的http服務配置的內容信息;

設計非搶佔式下的高可用http服務實現的要點:
    1.killall命令寫進腳本的時候用絕對命令的絕對路徑,否則可能會引起vrrp_script執行失敗;
    2.drct1的初始狀態爲MASTER,需要填寫在vrrp_instance VI_1填寫nopreempt
    3.vrrp_script check_httpd{}中需要寫weight
    4.drct2作爲初始狀態爲BACKUP,所以不需要填寫vrrp_instance VI_1中的nopreempt
    5.vrrp_script check_httpd{}中不需要寫weight
    6.狀態通知和轉變情況腳本(/etc/keepalived/notify.sh)必須根據狀態的改變進行對應的編寫

個人心得總結:
1.搶佔式下的高可用http服務(其他服務)實現屬於強制性地選用某個調度器作爲MASTER(在沒有其他約束的條件下);因此我覺得配合外部輔助腳本:MASTER/BACKUP的手動切換的腳本使用比較好;
搶佔式 + MASTER/BACKUP的手動切換的腳本
2.非搶佔式下的高可用http服務(其他服務)實現可以根據調度器自身的情況進行MASTER/BACKUP狀態轉換;
3.兩者比較:
a.搶佔式的設計來得易懂些,邏輯簡單;自動化較非搶佔式低一些;
b.非搶佔式的設計邏輯比搶佔式複雜一點,自動化程度更高些;

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