keepalived構建LVS_DR和Nginx的高可用集羣

keepalived原理、keepalived+LVS_DRkeepalived+Nginx的實現

一.keepalived和其工作原理:

keepalived是一個類似於Layer2,4,7交換機制的軟件。是Linux集羣管理中保證集羣高可用的一個服務軟件,其功能是用來防止單點故障。

keepalived的工作原理:

keepalived是基於VRRP協議實現的保證集羣高可用的一個服務軟件,主要功能是實現真機的故障隔離和負載均衡器間的失敗切換,防止單點故障。在瞭解keepalived原理之前先了解一下VRRP協議。

VRRP協議:Virtual Route Redundancy Protocol虛擬路由冗餘協議。是一種容錯協議,保證當主機的下一跳路由出現故障時,由另一臺路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。在介紹VRRP之前先介紹一些關於VRRP的相關術語:

虛擬路由器:由一個 Master 路由器和多個 Backup 路由器組成。主機將虛擬路由器當作默認網關。

VRID:虛擬路由器的標識。有相同 VRID 的一組路由器構成一個虛擬路由器。

Master 路由器:虛擬路由器中承擔報文轉發任務的路由器。

Backup 路由器: Master 路由器出現故障時,能夠代替 Master 路由器工作的路由器。

虛擬 IP 地址:虛擬路由器的 IP 地址。一個虛擬路由器可以擁有一個或多個IP 地址。

IP 地址擁有者:接口 IP 地址與虛擬 IP 地址相同的路由器被稱爲 IP 地址擁有者。

虛擬 MAC 地址:一個虛擬路由器擁有一個虛擬 MAC 地址。虛擬 MAC 地址的格式爲 00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器迴應 ARP 請求使用的是虛擬 MAC 地址,只有虛擬路由器做特殊配置的時候,纔回應接口的真實 MAC 地址。

優先級: VRRP 根據優先級來確定虛擬路由器中每臺路由器的地位。

非搶佔方式:如果 Backup 路由器工作在非搶佔方式下,則只要 Master 路由器沒有出現故障, Backup 路由器即使隨後被配置了更高的優先級也不會成爲Master 路由器。

搶佔方式:如果 Backup 路由器工作在搶佔方式下,當它收到 VRRP 報文後,會將自己的優先級與通告報文中的優先級進行比較。如果自己的優先級比當前的 Master 路由器的優先級高,就會主動搶佔成爲 Master 路由器;否則,將保持 Backup 狀態。

虛擬路由示例示意圖:

wKiom1Yvcm6TLWz8AAEOfFyE9Rs687.jpg

VRRP將局域網內的一組路由器劃分在一起,形成一個VRRP備份組,它在功能上相當於一臺路由器的功能,使用虛擬路由器號進行標識。虛擬路由器有自己的虛擬IP地址和虛擬MAC地址,它的外在變現形式和實際的物理路由完全一樣。局域網內的主機將虛擬路由器的IP地址設置爲默認網關,通過虛擬路由器與外部網絡進行通信。

虛擬路由器是工作在實際的物理路由器之上的。它由多個實際的路由器組成,包括一個Master路由器和多個Backup路由器。 Master路由器正常工作時,局域網內的主機通過Master與外界通信。當Master路由器出現故障時, Backup路由器中的一臺設備將成爲新的Master路由器,接替轉發報文的工作。

VRRP的工作工程:

(1) 虛擬路由器中的路由器根據優先級選舉出 Master Master 路由器通過發送免

ARP 報文,將自己的虛擬 MAC 地址通知給與它連接的設備或者主機,從

而承擔報文轉發任務;

(2) Master 路由器週期性發送 VRRP 報文,以公佈其配置信息(優先級等)和工

作狀況;

(3) 如果 Master 路由器出現故障,虛擬路由器中的 Backup 路由器將根據優先級

重新選舉新的 Master

(4) 虛擬路由器狀態切換時, Master 路由器由一臺設備切換爲另外一臺設備,新

Master 路由器只是簡單地發送一個攜帶虛擬路由器的 MAC 地址和虛擬 IP

地址信息的ARP 報文,這樣就可以更新與它連接的主機或設備中的

ARP 相關信息。網絡中的主機感知不到 Master 路由器已經切換爲另外一臺

設備。

(5) Backup 路由器的優先級高於 Master 路由器時,由 Backup 路由器的工作方

式(搶佔方式和非搶佔方式)決定是否重新選舉 Master

VRRP優先級的取值範圍爲0到255(數值越大表明優先級越高)

keepalived的工作原理就是基於VRRP實現的,keepalived的體系結構圖如下

wKioL1YvcrPCGlZqAAJmPFXrK7Q619.jpg


在這個機構圖中,處於內核的IPVSNETLINK,其中NETLINK是提供高級路由及其他相關的網絡功能,如果在負載均衡器上啓用iptables/netfilter,將會直接影響它的性能。對於圖中不同模塊功能的介紹如下:

VRRP Stack負責負載均衡器之間的失敗切換FailOver

Checkers負責檢查調度器後端的Real server 或者 Upstream Server的健康狀況;

WatchDog 負責監控checkersVRRP進程的狀況;

IPVS wrapper 用來發送設定的規則到內核IPVS

Netlink Reflector 用來設定VRRPvip地址。

keepalived運行時,會啓動3個進程,分別爲:core(核心進程)checkvrrp

core:負責主進程的啓動,維護和全局配置文件的加載;

check:負責健康檢查

vrrp:用來實現vrrp協議

keepalived配置文件的介紹:

yum安裝好keepalived之後,keepalived會產生一個配置文件/etc/keepalived/keepalived.conf ,配置文件包含了三個段:全局定義段,VRRP實例定義段和虛擬服務器定義段。

global_defs {
   notification_email { #指定keepalived在發生切換時需要發送email到的對象。
     [email protected]
   }
   notification_email_from [email protected]#指定發件人
   smtp_server 192.168.200.1 #指定smtp服務器地址
   smtp_connect_timeout30  #指定smtp連接超時時間
   router_id LVS_DEVEL  #運行keepalived的一個標識
}
vrrp_sync_group VG_1{ #監控多個網段的實例              
    group{              
        inside_network#實例名              
        outside_network              }
        notify_master /path/xx.sh #指定當切換到master時,執行的腳本       
        netify_backup /path/xx.sh #指定當切換到backup時,執行的腳本       
        notify_fault "path/xx.shVG_1" #故障時執行的腳本       
        notify /path/xx.sh  #腳本所在目錄       
        smtp_alert #使用global_defs中提供的郵件地址和smtp服務器發送郵件通知}
vrrp_instance VI_1 {
    state MASTER #指定哪個爲master,哪個爲backup
    interface eth0  #設置實例綁定的網卡
    virtual_router_id 51 #VPID標記
    priority 100 #優先級,高優先級的會搶佔爲master (默認爲搶佔模式)
    advert_int 1 #檢查間隔,1秒
    authentication { #設置認證
        auth_type PASS #認證方式
        auth_pass 1111  #認證字符串(使用 openssl rand -hex 6生成隨機字符串)
    }
    virtual_ipaddress {  #設置VIP
<IPADDR>/<MASK> brd <IPADDR> dev <STRING>scope <SCOPE> label <LABEL>
        192.168.200.17/24 deveth1
        192.168.200.18/24 deveth2 label eth2:1
    }
    notify_master<STRING>|<QUOTED-STRING>
    notify_backup<STRING>|<QUOTED-STRING>
    notify_fault<STRING>|<QUOTED-STRING>
    notify<STRING>|<QUOTED-STRING>
    smtp_alert
}
 
virtual_server 192.168.200.100 443 {
    delay_loop 6  #健康檢查時間間隔,單位秒
    lb_algo rr              #負載調度算法,支持的算法:rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR  #LVS的類型:有NAT|DR|TUN
    nat_mask255.255.255.0  #子網掩碼
    persistence_timeout50   #會話保持時間,單位秒(可以適當延長時間以保持session)
    protocol TCP  #轉發協議類型,有TCP和UDP兩種
sorry_server 127.0.0.1 80 #web服務器全部失敗,可以指定Sorry web
    real_server 192.168.201.100443 {   #定義RS 服務
    weight 1#權重
inhibit_on_failure #當服務器健康檢查失效時,將weight設置爲0不是直接從ipvs中刪除
notify_up <STRING>|<QUOTED-STRING>#Server啓動時執行的腳本
notify_down <STRING>|<QUOTED-STRING>#Server down時執行的腳本
 
#後端RS服務器的檢查 (HTTP_GET 和SSL_GET):
    SSL_GET { 
       url {  #檢查url,可以指定多個,status_codeand digest
         path /
          digest ff20ad   #或者status_code 200 ....
         }
        connect_timeout 3 #連接超時時間
        nb_get_retry 3  #重連次數
        delay_before_retry 3 #重連間隔時間
    }
#也可以通過TCP_CHECK判斷RealServer的健康狀況:
    }
}

二.keepalived+LVS_DR模型負載均衡實現集羣高可用:

1.    單主模型(master/backup

實驗環境:

wKioL1YvgWuh5T2_AAF1iwiNXIQ626.jpg

環境搭建:

1.分別在兩臺Director上安裝keepalived和相關的配置:

安裝前注意事項:

本機的主機名,要與hostname(uname -n)獲得的名稱保持一致;各節點要能相互解析主機名,一般建議通過hosts文件進行解析;各節點要進行時間同步(使用ntp時間服務器同步),確保iptablesselinux不會成爲服務阻塞。

(1)Master上配置時間服務器並進行同步:

yum 安裝ntp服務器:yum install ntp -y

配置成本地時間服務器:編輯配置文件~]# vim/etc/ntp.conf添加如下內容:

        restrict 172.16.0.0 netmask 255.255.0.0 nomodify notrap        
        server 127.127.1.0
        fudge 127.127.1.0 stratum 8
        #server 0.centos.pool.ntp.org iburst
        #server 1.centos.pool.ntp.org iburst
        #server 2.centos.pool.ntp.org iburst
        #server 3.centos.pool.ntp.org iburst


啓動服務即可。其他節點可以通過命令ntpdate netserverIP來進行時間同步如:ntpdate172.16.99.3

(2)安裝keepalived和相關配置:

a.分別在172.16.99.3172.16.99.5上安裝keepalived;此處可以yum安裝或者源碼安裝。此處使用yum安裝:yum install keepalived -y

b.配置:在172.16.99.3上的配置信息。

        global_defs {        
           notification_email {
             [email protected]
           }
           [email protected]
           smtp_server 127.0.0.1
           smtp_connect_timeout 3
           router_id LVS_DEVEL
        #   vrrp_mcast_group4224.99.99.18
        }
        vrrp_script chk_down {   #爲測試使用
            script "[[ -f/etc/keepalived/down ]] && exit 1 || exit 0"
            interval 1
            weight -2
        }
        vrrp_instance VI_1 {
            state MASTER
            interface eth0
            virtual_router_id 77
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass b17bfcfebf52
            }
            virtual_ipaddress {
                172.16.99.200/32 deveth0 label eth0:0
            }
            sorry_server 172.16.99.380
            track_script {
                chk_down
            }
        }
        virtual_server 172.16.99.200 80 {
            delay_loop 6
            lb_algo rr
            lb_kind DR
            persistence_timeout 50
            protocol TCP
            real_server 172.16.99.1180 {
                weight 1
                HTTP_GET {
                    url {
                      path /
                      status_code 200
                    }
                    connect_timeout 3
                    nb_get_retry 3
                    delay_before_retry3
                }
            }
            real_server 172.16.99.1280 {
               weight 1
               HTTP_GET {
                   url {
                       path /
                       status_code 200
                   }
                   connect_timeout 3
                   nb_get_retry 3
                   dalay_before_retry3
               }
            }
        }

在備用節點Backup172.16.99.5上的配置,只需要修改state BACKUPvirtual_router_id 77priority 99即可,其他的配置和Master上的配置完全相同。

2.分別在兩臺RS上進行相關的配置:

通過編寫腳本進行相應的配置:

在其中一臺的RS172.16.99.11上的配置

        #!/bin/bash        
        echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 >/proc/sys/net/ipv4/conf/eth0/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/eth0/arp_announce
        echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
        sleep 3
        ifconfig lo:0172.16.99.200 netmask 255.255.255.255 broadcast 172.16.99.200 up
        route add -host172.16.99.200 dev lo:0

另一臺RS腳本信息和172.16.99.11上的相同;

兩臺RS開啓web服務器。爲了演示實驗效果,讓網頁內容不同:

RS1網頁內容爲:

<h1>The web is 99.11 </h1>

RS2網頁內容爲:

<h1>The web is 99.12</h1>

關閉兩臺的iptables防火牆,關閉selinux.

3.啓動keepalived進行測試


wKiom1Yvg1rxGmsPAAFb1uY3WRs921.jpg

查看一下ipvsadm 規則是否已經自動生成:

wKioL1Yvg42RTeu7AAE6Hz-MxOg379.jpg

在目錄/etc/keepalived/下創建一個文件down,進行測試,當創建文件後,MASTER主機weight將會減2,最終導致VIPBACKUP搶佔,keepalived默認工作在搶佔模式。

1.172.16.99.3/etc/keepalived/目錄下創建down文件,查看VIP地址是否還存在:

日誌文件

wKioL1YvhFCyUvO2AANhYtJtKXY595.jpg

wKiom1YvhB3gHO6WAAJF6RPrKmI038.jpg

2.172.16.99.5上查看VIP是否存在

日誌文件:  


wKiom1YvhJCwuz9QAANYdv1iCWY793.jpg

wKioL1YvhMSSLpDEAAJ1dnn0F1g830.jpg

2.雙主模型(MASTER/MASTER

實驗結構:

wKiom1YvhPSAIHLWAAJm2nvTnuY076.jpg

雙主模型的實現主要是讓主Director和備用Director都能接受客戶端的訪問,設置兩個VIP,通過DNS服務器輪詢解析這兩個VIP來完成。

雙主模型的實現只需在單主模型的配置下,在配置文件中再加一個vrrp_instanceVI_2。只需做一下相應的修改,如下:

1.其中一臺Director172.16.99.3

vrrp_instance VI_1state MASTER時:

vrrp_instance VI_2 {

   stateBACKUP

   interface eth0

   virtual_router_id 177

   priority 99

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass d7a9dfb86ec4

   }

   virtual_ipaddress {

       172.16.99.100/32 dev eth0 label eth0:1

   }

   track_script {

        chk_down

   }

其他的virtual_server 區域的配置和vrrp_instance VI_1的相同

2.在另一臺Director172.16.99.5)上的配置:只需將上述的配置文件複製過去,然後修改以下幾項:

vrrp_instance VI_2中,state MASTERpriority 100

重新啓動keepalived

99.3的日誌文件和IP

wKioL1YvhYCjnnAQAAOOyADMoUs389.jpg

wKioL1YvhbuiWJLyAAKiJtpCIk4474.jpg

99.5的日誌文件和IP

wKioL1YvhevjUh-4AAR9RuYzl30412.jpg

            wKiom1YvhgDAYC55AAL1PgnCTqs456.jpg

2.在兩臺RS進行相關配置:

通過腳本進行修改:

        #!/bin/bash        
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/eth0/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/eth0/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        sleep 3
        ifconfig lo:0 172.16.99.200 netmask 255.255.255.255  broadcast 172.16.99.200 up
        route add -host 172.16.99.200 dev lo:0
        ifconfig lo:1 172.16.99.100 netmask 255.255.255.255  broadcast 172.16.99.100 up
        route add -host 172.16.99.100 dev lo:1

wKioL1YvhprSf-l6AAH2TGUPdKg695.jpg

兩臺RS配置相同:

4.測試:

wKioL1YvhunCxW6mAAHF6QMqkHE472.jpg

在一臺Director/etc/keepalived/目錄下創建文件down,會發現兩個VIP會集中到另一臺上:

wKiom1Yvhu3BvxJ6AAPPDhvtF1o158.jpg


三.keepalived+Nginx負載均衡實現集羣高可用:

實現雙主模型:(MASTER/MASTER

實驗結構圖:

wKioL1Yvh2aSZi0RAAIciNGeF3A976.jpg

實驗步驟:

1.在兩臺Nginx負載均衡器上進行配置keepalived和實現Nginx的負載均衡:

a.實現Nginx的負載均衡

編輯nginx的配置文件/etc/nginx/nginx.conf添加如下內容:

http{}內添加:

    upstream Rserver {

        server 172.16.99.11:80 weight=1;

        server 172.16.99.12:80 weight=1;

        server 172.16.99.10:80 backup; 

        #當兩臺Upstream server宕機了,就會               

      # 顯示此web服務器的界面消息

    }

再編輯/etc/nginx/conf.d/default.com文件,在server{}內添加:

    location / {

        proxy_pass http://Rserver/;

        root   /web/nginx/;

        index index.html index.htm;

    }

兩臺Nginx的負載均衡器配置相同。

進行測試,判斷nginx是否實現了負載均衡

b.編輯keepalived的配置文件(雙主模型)來實現Nginx負載均衡器的高可用:

配置內容如下:(先在172.16.99.3上配置)

        global_defs {        
           notification_email {
             [email protected]
           }
           [email protected]
           smtp_server 127.0.0.1
           smtp_connect_timeout 3
           router_id LVS_DEVEL
        #   vrrp_mcast_group4224.99.99.18
        }
        vrrp_script chk_nginx {  #檢查Nginx的運行狀態
            script "killall -0nginx &> /dev/null"
            interval 1
            weight -2
        }
        vrrp_instance VI_1 {
            state MASTER
            interface eth0
            virtual_router_id 77
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass b17bfcfebf52
            }
            virtual_ipaddress {
                172.16.99.200/32 deveth0 label eth0:0
            }
           track_script {
                chk_nginx  
           }
        }
        vrrp_instance VI_2 {
          state BACKUP
          interface eth0
          virtual_router_id 100
          priority 99
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass d7a9dfb86ec4
          }
          virtual_ipaddress {
              172.16.99.100/32 deveth0 label eth0:1
          }
          track_script {
                chk_down
                chk_nginx
          }
        }

172.16.99.5上的配置,只需將此配置文件複製過去,然後修改以下幾項:

vrrp_instance VI_1中:

state BACKUP

 priority 99

vrrp_instance VI_2中:

state MASTER

 priority 100

2.啓動keepalived進行測試:

wKiom1YviBHiHkRSAAMe86HmI-c194.jpg

wKioL1YviEXiNkpvAAMf7jVpOG8118.jpg

進行訪問:

wKiom1YviGjDBJ5NAAJZrvYNJaU483.jpg

172.16.99.5Nginx服務關閉:VIP172.16.99.100)將轉移到另一臺的eth0:1上如下圖:訪問服務器能正常顯示網頁內容。

wKiom1YviMaCW76LAALouCHNYA4647.jpg

wKioL1YviPnhP2ovAAMXtRD1_OQ978.jpg

如果後端Upstream server 服務器都宕機了,客戶端在此訪問時,將會顯示server172.16.99.10:80 backup; web服務器的界面消息。如:

wKiom1YviPWhnV7gAAHbwYE62B8646.jpg



    







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