keepalived實現前端負載均衡器的高可用

概述:

    在之前的內容中,我們了解了當一個網站并發量大時,可以利用前端負載均衡器將用戶請求調度到后端的多個real server上,實現分散服務壓力,橫向擴展的方式,形成LB集群,但是試想一下,作為前端負載均衡器:

    如果是LVS,萬一作為前端調度器的Director故障,則會導致所有服務器不可用,還有LVS無法對后端的各個Real Server做健康狀況檢測,無論后端Real Server是否故障,作為LVS調度器而言,都會將請求調度到根據算法指定的Real Server上,也就是如果某個Real Server故障,那么調度到該Real Server上的請求將會無法正常響應。

    如果是Nginx作為前端調度器,雖然Nginx可以對后端的Upstream Server做健康狀況探測,當某個節點故障時,不會將請求調度到該節點上;但是,萬一Nginx調度器的節點本身發生故障,也會造成所有的服務不可用,也就是Nginx自身就是單點故障所在。

    針對以上的情況,我們有必要對服務器進行高可用,當某個節點故障時,不會讓整個服務不可用,本篇就介紹一下利用keepalived實現對前端調度器的高可用的實現方案,具體分為以下幾個部分:

    1、keepalived的相關概念簡介

    2、keepalived實現vrrp(實現虛擬IP資源的轉移)

    3、keepalived實現對LVS負載均衡調度器的高可用(主/備模型)

    4、keepalived實現對Nginx服務的高可用(主/備模型)

    5、keepalived實現雙主模型的高可用實現方案(主/主模型)

      

第一章    keepalived的相關概念簡介

    1、VRRP協議,virtual redundant route protocol,虛擬冗余路由協議

        能夠把多個物理路由器虛擬為一個虛擬路由器對外提供服務,vrrp協議能夠自動的識別當前哪個是活動節點,當活動節點故障后,能夠自動的將另一個作為活動節點對外提供服務

        vrrp對外提供服務是,是利用虛擬出來一個地址,包括mac也是虛擬出來的,對外提供服務

    2、VRRP協議的相關術語解釋

        虛擬路由器:由一個主路由器和多個備份路由器組成,將其虛擬為一個路由器向外提供服務(注意,可能虛擬出來的不止一個虛擬路由器)

        VRID:虛擬路由器標識,當虛擬出來多個虛擬路由器時,用來唯一標識某個虛擬路由器的ID號,0-255之間的有效數字

        Master路由器:物理路由器中的主路由器,ACTIVE,用來承擔報文轉發任務的路由器,一般一個虛擬路由器集群只有一個Master路由器

        Backup路由器:當Master路由器發生故障時,能夠代替Master路由器工作的路由器

        虛擬IP地址(VIP):虛擬路由器向外提供服務的IP地址,一個虛擬路由器可以有一個或多個IP地址

        IP地址擁有者:物理路由器的接口的IP地址與虛擬IP地址相同的路由器,稱為IP地址擁有者,也就是Master路由器

        虛擬MAC(VMAC):虛擬路由器的虛擬MAC地址,虛擬MAC地址的格式為00-00-5E-00-01-{VRID},因此,VRID范圍就是0-255,VMAC前5段是固定的,后面是VRID

        優先級:VRRP是根據優先級來決定誰是Master路由器,誰是Backup路由器,優先級由數字表示,可用范圍為0-254

    3、VRRP的工作模式:

        搶占方式:僅根據優先級來判斷哪個路由器作為Master路由器。當原來的Master故障后,Backup路由器會作為新的Master路由器,但是當原來的Master恢復后,由于其優先級高,會又變回Master路由器,從新將資源搶占回來

        非搶占方式:當原來的Master故障后,Backup路由器會作為新的Master路由器,當原來的Master恢復后,不會搶占成為Master路由器,而是作為Backup路由器

        為了保證Master路由器和Backup路由器能夠協調工作,VRRP需要實現以下功能:

            <1>Master路由器的選舉

            <2>Master路由器的狀態通告(傳遞心跳信息,優先級等)

            <3>為了提高安全性,還需要提供認證功能(防止外來的路由器隨意加入到集群中),支持的認證方式有:

                無認證

                簡單字符串認證,預共享秘鑰

                md5認證

    4、keepalived簡介

    keepalived最初的設計目標是為了實現lvs設備的高可用,keepalived能夠根據配置文件中的定義生成ipvs規則,并能夠對各個real server的健康狀態進行檢測(LVS實際上按照高可用的角度來講,只有兩個資源,一個是VIP,一個是內核上的ipvs規則)

    keepalived的功能主要是:

        <1> vrrp協議的軟件實現,原生設計的目的是為了高可用ipvs服務

        <2> vrrp協議完成地址流動

        <3> 為vip地址所在的地址生成ipvs規則(在keepalived配置文件中預先定義)

        <4> 為ipvs集群的各RS做健康狀態檢測

        <5> 基于腳本調用接口,通過執行腳本完成腳本中定義的功能(如對其他服務的高可用),進而影響集群事物

    5、keepalived的軟件結構

    Software Design.gif

     

        一般啟動keepalived之后,會啟動一個主進程(讀取和分析配置文件,并根據配置文件,指揮兩個子進程完成相關工作),兩個子進程,其中一個子進程用來實現VRRP協議,另一個是checkers進程,用來監控lvs后端的各個real server的健康狀況,還有一些外圍其他服務的監控腳本的實現

        主進程還能利用內核提供的watchdog模塊,實現對兩個子進程的健康性檢查,當發現某個子進程故障后,主進程會kill掉這個子進程,然后再從新啟一個子進程

        watchdog能夠讓兩個子進程每隔一段時間,向主進程的socket套接字上發送信息,當某一時刻,主進程無法收到子進程的信息,就判斷子進程故障,然后就殺掉,重啟子進程

        兩個節點之間哪個為主,哪個為備用節點,是由優先級來決定的,當初始時,優先級高的為主節點,當其中某一個節點故障,無法啟動,則另一個節點會替換上來,作為主的,向外提供服務。另一種情況,當節點本身正常,但是節點上的某服務,也就是某資源不正常時,這時keepalived的子進程checkers就會將當前節點的優先級降級,從而實現了另一個備用節點的優先級要高于該節點,當下次節點間相互通告信息時,備用節點就會發現自己的優先級比當前活動節點的優先級要高,然后就提升為主節點,啟動資源,對外提供服務

        優先級的數字是0-255,值越大,優先級越高,0和255被系統自身占用,不能作為可用的優先級的數字進行調整

   

第二章    keepalived實現vrrp(實現虛擬IP資源的轉移)

    1、實驗環境

    blob.png

    2、實驗前準備工作

        <1> 各個節點的時間同步

        在某個節點(本例中為10.1.32.68主機)上安裝ntp服務,作為時間服務器,修改其配置文件中server相關的參數,將server修改為127.127.1.0,從本機同步時間,啟動ntpd服務

        blob.png

        其他keepalived向該服務器同步時間

        blob.png

        驗證各個keepalived節點的時間是否一致

        blob.png

        <2> 節點之間可基于ssh秘鑰進行認證

        blob.png        

        blob.png        

        <3> 各節點解析的主機名與實際主機名保持一致

        在各個節點上的/etc/hosts文件中編輯主機名與IP的對應關系,實現解析結果與實際主機名的一致性

        blob.png

        blob.png

        <4> 確保iptables和selinux不會阻礙實驗的正常進行
        blob.png

    3、配置實驗環境

    blob.png    

    blob.png

    4、安裝keepalived

    blob.png

    blob.png

    

    5、配置node72的keepalived服務

    [root@node72 ~]#     ########   備份配置文件   ########
    [root@node72 ~]# cp /etc/keepalived/keepalived.conf{,.bak}
    [root@node72 ~]#     ########   編輯修改配置文件  ########
    [root@node72 ~]# vim /etc/keepalived/keepalived.conf    
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         root@localhost             ########  定義節點狀態發生變化時發送通知的目標郵箱地址    ########
       } 
       notification_email_from keepalived_test@nwc.com   ########  定義發件人的信息    ########
       smtp_server 127.0.0.1     ########  定義郵箱服務器地址   ########
       smtp_connect_timeout 30   ########  定義郵箱服務器的鏈接超時時間    ########
       router_id node72       ########   定義本機的路由器ID,自定義即可   ########
       vrrp_mcast_group4 224.0.32.18    ########   定義心跳信息通告的組播地址,同一個集群的組播地址一樣   ########
    }  
    
    vrrp_instance VI_1 {  ########   定義一個虛擬路由器的實例,實例名稱為VI_1  ########
        state MASTER      ########   定義本節點在該虛擬路由器實例中的初始角色,MASTER還是BACKUP   ########
        interface eno16777736   ########   虛擬路由器的工作的接口   ########
        virtual_router_id 32    ########   虛擬路由器ID(也就是VRID),用以區別不同的虛擬路由器實例   ########
        priority 100         #####定義當前節點在該虛擬路由器實例中的優先級,MASTER要比BACKUP節點的優先級高#####
        advert_int 1    ########   定義通告信息發送的時間間隔   ########
        authentication {   ########  定義認證機制和認證的秘鑰    ########
            auth_type PASS     ########  PASS為簡單字符認證,建議使用PASS即可    ########
            auth_pass 12345678   ########   認證的秘鑰,最大有效值為8位長度   ########
        }   
        virtual_ipaddress {   ########   定義該虛擬路由器的VIP   ########
            10.1.32.1/16 dev eno16777736 label eno16777736:0
            ########  VIP為10.1.32.1/16,定義在eno16777736接口的 eno16777736:0別名上   ########
        }   
    }
    
    track_interface {  ###定義要監控的接口,一旦接口出現故障,則節點會轉為FAULT狀態,觸發重新選舉,實現資源轉移###
        eno16777736
    }

    blob.png

    6、配置node73的keepalived服務

    [root@node73 ~]#     ########   備份配置文件   ########
    [root@node73 ~]# cp /etc/keepalived/keepalived.conf{,.bak}
    [root@node73 ~]#     ########   編輯修改配置文件  ########
    [root@node73 ~]# vim /etc/keepalived/keepalived.conf    
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         root@localhost             ########  定義節點狀態發生變化時發送通知的目標郵箱地址    ########
       } 
       notification_email_from keepalived_test@nwc.com   ########  定義發件人的信息    ########
       smtp_server 127.0.0.1     ########  定義郵箱服務器地址   ########
       smtp_connect_timeout 30   ########  定義郵箱服務器的鏈接超時時間    ########
       router_id node73       ########   定義本機的路由器ID,自定義即可   ########
       vrrp_mcast_group4 224.0.32.18    ########   定義心跳信息通告的組播地址,同一個集群的組播地址一樣   ########
    }  
    
    vrrp_instance VI_1 {  ########   定義一個虛擬路由器的實例,實例名稱為VI_1  ########
        state BACKUP      ########   定義本節點在該虛擬路由器實例中的初始角色,MASTER還是BACKUP   ########
        interface eno16777736   ########   虛擬路由器的工作的接口   ########
        virtual_router_id 32    ########   虛擬路由器ID(也就是VRID),用以區別不同的虛擬路由器實例   ########
        priority 95         ########  定義當前節點在該虛擬路由器實例中的優先級    ########
        advert_int 1    ########   定義通告信息發送的時間間隔   ########
        authentication {   ########  定義認證機制和認證的秘鑰    ########
            auth_type PASS     ########  PASS為簡單字符認證,建議使用PASS即可    ########
            auth_pass 12345678   ########   認證的秘鑰,最大有效值為8位長度   ########
        }   
        virtual_ipaddress {   ########   定義該虛擬路由器的VIP   ########
            10.1.32.1/16 dev eno16777736 label eno16777736:0
            ########  VIP為10.1.32.1/16,定義在eno16777736接口的 eno16777736:0別名上   ########
        }   
    }
    
    track_interface {  ###定義要監控的接口,一旦接口出現故障,則節點會轉為FAULT狀態,觸發重新選舉,實現資源轉移###
        eno16777736
    }

    blob.png

    7、驗證VRRP的高可用性

    blob.png

    blob.png

    blob.png

    blob.png

    8、利用自定義腳本,在keepalived中調用自定義的腳本實現節點狀態轉移時的通知機制

        實現當節點狀態發生轉移時,發送郵件給當前系統的root用戶

    編寫腳本:
    [root@node72 ~]# 
    [root@node72 ~]# vim /etc/keepalived/notify.sh
    
    #!/bin/bash
    # Author:nwc
    # Time:2016-11-01 12:56:17
    #
    
    contact='root@localhost'
    ##定義變量contact,其值為root@localhost,指明通告給誰,也就是郵件發送給誰
    vip="10.1.32.1"
    ##定義變量vip,其值為VIP的地址
    
    notify() {
        mailsubject="`hostname` to be $1: $vip floating"
        mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1"
        echo $mailbody | mail -s "$mailsubject" $contact
    }
    ##定義一個notify函數,用于發送郵件,定義了郵件的主題和郵件的正文部分,函數可以接受函數自身的位置參數
    
    case $1 in
    master)
        notify master
    ;;
    backup)
        notify backup
    ;;
    fault)
        notify fault
    ;;
    *)
        echo "Usage: `basename $0` master|backup|fault"
    ;;
    esac
    ##定義一個循環,當腳本的位置參數$1為對應值時,調用函數發送郵件

    blob.png

    blob.png

    blob.png

     

第三章    keepalived實現對LVS負載均衡調度器的高可用(主/備模型)

    1、實驗環境

    blob.png

    2、準備實驗環境、各節點時間同步,ssh秘鑰登錄,節點解析與主機名一致配置過程省略

    3、根據實驗環境,配置LVS-DR模型各個Real Server對應的配置(本例中利用腳本實現)

    腳本為:
    #!/bin/bash

    case $1 in
    start)
            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
    
            ifconfig lo:0 10.1.32.1 netmask 255.255.255.255 broadcast 10.1.32.1
    
            route add -host 10.1.32.1 dev lo:0
    ;;
    stop)
            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
    
            ifconfig lo:0 down
    ;;
    *)
            echo "error"
            exit
    ;;
    esac

    blob.png

    blob.png

    

    4、在各個Real Server上提供httpd服務,提供測試頁面,以供測試之用

    blob.png    

    blob.png

    5、在Director1上安裝配置keepalived,實現對LVS調度器的高可用

    ! Configuration File for keepalived

    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived_test@nwc.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node72
       vrrp_mcast_group4 224.0.32.18
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface eno16777736
        virtual_router_id 32
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 12345678
        }
        virtual_ipaddress {
            10.1.32.1/16 dev eno16777736 label eno16777736:0
        }
            track_interface {
        eno16777736 
        }   
    
       notify_master "/etc/keepalived/notify.sh master"
       notify_backup "/etc/keepalived/notify.sh backup"
       notify_fault "/etc/keepalived/notify.sh fault"
    }  


    virtual_server 10.1.32.1 80 {   ####將哪個ip的哪個端口定義為LVS的負載均衡集群服務####
        delay_loop 6    ###  定義服務輪詢時間間隔,單位秒  ###
        lb_algo rr    ### 定義集群調度算法 ###
        lb_kind DR    ### 定義LVS的工作模型 NAT|DR|TUN ###
    #    nat_mask 255.255.255.0    ### 當工作模型是NAT時,NAT的掩碼 ###
    #    persistence_timeout 50    ### 定義LVS的是否啟用持久連接,不加此選項,代表不啟用,如果啟用,定義時長 ###
        protocol TCP   ### 定義集群的服務的協議類型,keepalived只支持TCP的 ###
        
    sorry_server 10.1.32.72 80
    ###定義當LVS后端的real sever全部不可用后的錯誤頁面的服務器###
    
        real_server 10.1.32.68 80 {  ### 定義一個后端real server ###
           weight 1   ### 指明權重 ###
            HTTP_GET {  ### 指明檢測健康狀況的方法 ###
                url {   ## 表示請求某個URL進行檢查,要求響應狀態碼為200 ###
                  path /
                  status_code 200
                } 
                connect_timeout 3   ###檢測時,對方無響應的超時時間###
                nb_get_retry 3   ### 檢測重試次數 ###
                delay_before_retry 3   ### 每次檢測的間隔時間 ###
            }   
        }   
        real_server 10.1.32.168 80 {
           weight 1 
            HTTP_GET {
                url {
                  path /
                  status_code 200
                } 
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }   
        }   
    }

   

    6、在Director2上安裝配置keepalived,實現LVS調度器的高可用

    ! Configuration File for keepalived    
    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived_test@nwc.com
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node73
       vrrp_mcast_group4 224.0.32.18
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eno16777736
        virtual_router_id 32
        priority 95
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 12345678
        }
        virtual_ipaddress {
    	10.1.32.1/16 dev eno16777736 label eno16777736:0
        }
        track_interface {
            eno16777736
        }
       notify_master "/etc/keepalived/notify.sh  master"
       notify_backup "/etc/keepalived/notify.sh backup"
       notify_fault "/etc/keepalived/notify.sh fault"
    }
    
    sorry_server 10.1.32.73 80
     
    virtual_server 10.1.32.1 80 {
        delay_loop 6
        lb_algo rr 
        protocol TCP
        
        real_server 10.1.32.68 80 {
           weight 1 
            HTTP_GET {
                url {
                  path /
                  status_code 200
                } 
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }   
        }   
        real_server 10.1.32.168 80 {
           weight 1 
            HTTP_GET {
                url {
                  path /
                  status_code 200
                } 
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }   
        }   
    }

    

    7、在兩臺Director上提供httpd服務,用于實現提供當所有Real Server都不可用時的錯誤頁面

    blob.png

    blob.png

    8、在兩臺Director上啟動keepalived服務,客戶端訪問VIP,驗證是否正常

    blob.png

    blob.png

    停掉某個Real Server,驗證對后端的real server的健康性檢測是否生效

    blob.png

    停掉keepalived的主節點后的Director后,驗證服務是否可用

    blob.png    

    停掉兩個Real Server,驗證錯誤頁面服務器的配置是否生效

    blob.png

    停掉兩個節點的keepalived服務后,服務就無法正常訪問了

    blob.png

    

第四章    keepalived實現對Nginx服務的高可用(主/備模型)

    1、實驗環境

    blob.png

    2、在兩個nginx節點上yum安裝keepalived,rpm安裝nginx;在兩個web服務器上安裝httpd,提供測試頁面

        

    3、配置網絡環境

    blob.png

    blob.png

    blob.png

    blob.png

    4、啟動后端兩臺web服務器,驗證服務是否正常

    blob.png

    blob.png

    5、配置nginx將用戶請求反代到兩臺web服務器,驗證服務是否正常

    blob.png

    blob.png

    blob.png

    blob.png

    6、在ngx1上配置keepalived,實現對nginx服務的高可用

    6.1.png

    7、在ngx2主機上配置keepalived對nginx服務進行高可用

    7.1.png

    8、啟動兩個節點的keepalived,驗證高可用是否生效

    GIF1.gif

    blob.png

    blob.png

    

    9、利用狀態轉移時的通知腳本機制,定義當節點狀態發生變化時,后續的動作。

        本例以:當節點變為主節點時不做任何操作,當節點變為備用節點時,停止nginx

    腳本為
    #!/bin/bash
    # Author:nwc
    # Time:2016-11-01 12:56:17
    #
    
    contact='root@localhost'
    ##定義變量contact,其值為root@localhost,指明通告給誰,也就是郵件發送給誰
    vip="10.1.32.1"
    ##定義變量vip,其值為VIP的地址
    
    notify() {
        mailsubject="`hostname` to be $1: $vip floating"
        mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1"
        echo $mailbody | mail -s "$mailsubject" $contact
    }
    ##定義一個notify函數,用于發送郵件,定義了郵件的主題和郵件的正文部分,函數可以接受函數自身的位置參數
    
    case $1 in
    master)
        notify master
    ;;
    backup)
        notify backup
        nginx -s reload
    ;;
    fault)
        notify fault
    ;;
    *)
        echo "Usage: `basename $0` master|backup|fault"
    ;;
    esac
    ##定義一個循環,當腳本的位置參數$1為對應值時,調用函數發送郵件

    在keepalived配置文件中進行引用

    9.1.png

第五章    keepalived實現雙主模型的高可用實現方案(主/主模型)

    1、實驗環境

    blob.png

    2、利用上個實驗的環境,實現將前端nginx做成雙主模型

        在上個實驗的基礎上,只需要配置定義兩個vrrp實例,其中一個vrrp實例的ngx1節點上是主節點,在ngx2節點上是備用節點,另一個vrrp實例在ngx1上是備用節點,在ngx2上是主節點

    5.2.1.png

    5.2.2.png

    

    3、啟動keepalived服務,驗證配置

    GIF222.gif

原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/56546

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-11-01
下一篇 2016-11-01

相關推薦

  • 啟動流程排錯和自建linux系統

    一、grub的配置文件/boot/grub/grub.conf default=0        ###設置默認啟動項0表示第一個 timeout=5        ##設置超時時間,如果超過5s用戶…

    Linux干貨 2016-09-18
  • 第六周作業

    vim文本編輯器基本用法     基本模式:         編輯模式,命令模式    輸入模式        末行模式:    …

    Linux干貨 2016-09-19
  • N25第八周博客作業

    1、寫一個腳本,使用ping命令探測172.16.250.1-172.16.250.254之間的所有主機的在線狀態;     在線的主機使用綠色顯示;     不在線的主使用紅色顯示; #!/bin/bash trap ‘mytrap’ INT mytra…

    Linux干貨 2017-02-26
  • IP地址的三種表示格式及在Socket編程中的應用

       使用TCP/IP協議進行網絡應用開發的朋友首先要面對的就是對IP地址信息的處理。IP地址其實有三種不同的表示格式:        1)Ascii(網絡點分字符串)-        2) 網絡地址(32位無符號整形,網絡字節序,大頭) &nbsp…

    Linux干貨 2015-04-10
  • TCP/IP

    TCP/IP協議族     互聯網協議族(英語:Internet Protocol Suite,縮寫IPS)是一個網絡通信模型,以及一整個網絡傳輸協議家族,為互聯網的基礎通信架構。它常被通稱為TCP/IP協議族(英語:TCP/IP Protocol Suite,或TCP/IP Protocols),簡稱TCP/IP。因為該協議家…

    Linux干貨 2017-06-26
  • 文本三劍客 grep sed awk

    模式,選項。常用用法。

    2017-12-03
欧美性久久久久