1. 程式人生 > 其它 >Linux高可用之Keepalived

Linux高可用之Keepalived

Keepalived是基於vrrp協議的一款高可用軟體。Keepailived有一臺主伺服器和多臺備份伺服器,在主伺服器和備份伺服器上面部署相同的服務配置,使用一個虛擬IP地址對外提供服務,當主伺服器出現故障時,虛擬IP地址會自動漂移到備份伺服器。 VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議),VRRP是為了解決靜態路由的高可用。VRRP的基本架構 虛擬路由器由多個路由器組成,每個路由器都有各自的IP和共同的VRID(0-255),其中一個VRRP路由器通過競選成為MASTER,佔有VIP,對外提供路由服務,其他成為BACKUP,MASTER以IP組播(組播地址:224.0.0.18)形式傳送VRRP協議包,與BACKUP保持心跳連線,若MASTER不可用(或BACKUP接收不到VRRP協議包),則BACKUP通過競選產生新的MASTER並繼續對外提供路由服務,從而實現高可用。

簡介

Keepalived是基於vrrp協議的一款高可用軟體。Keepailived有一臺主伺服器和多臺備份伺服器,在主伺服器和備份伺服器上面部署相同的服務配置,使用一個虛擬IP地址對外提供服務,當主伺服器出現故障時,虛擬IP地址會自動漂移到備份伺服器。

VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議),VRRP是為了解決靜態路由的高可用。VRRP的基本架構
虛擬路由器由多個路由器組成,每個路由器都有各自的IP和共同的VRID(0-255),其中一個VRRP路由器通過競選成為MASTER,佔有VIP,對外提供路由服務,其他成為BACKUP,MASTER以IP組播(組播地址:224.0.0.18)形式傳送VRRP協議包,與BACKUP保持心跳連線,若MASTER不可用(或BACKUP接收不到VRRP協議包),則BACKUP通過競選產生新的MASTER並繼續對外提供路由服務,從而實現高可用。

vrrp協議的相關術語:

    虛擬路由器:Virtual Router 
    虛擬路由器標識:VRID(0-255)
    物理路由器:
        master  :主裝置
        backup  :備用裝置
        priority:優先順序
    VIP:Virtual IP 
    VMAC:Virutal MAC (00-00-5e-00-01-VRID)
    GraciousARP

安全認證:

簡單字元認證、HMAC機制,只對資訊做認證
MD5(leepalived不支援)

工作模式:

主/備:單虛擬路徑器;
主/主:主/備(虛擬路徑器),備/主(虛擬路徑器)

工作型別:

搶佔式:當出現比現有主伺服器優先順序高的伺服器時,會發送通告搶佔角色成為主伺服器
非搶佔式:

keepalived

核心元件:

        vrrp stack:vrrp協議的實現
        ipvs wrapper:為叢集內的所有節點生成IPVS規則
        checkers:對IPVS叢集的各RS做健康狀態檢測
        控制組件:配置檔案分析器,用來實現配置檔案的分析和載入
        IO複用器
        記憶體管理元件,用來管理keepalived高可用是的記憶體管理

注意:

  1. 各節點時間必須同步
  2. 確保各節點的用於叢集服務的介面支援MULTICAST通訊(組播);

安裝

從CentOS 6.4開始keepalived隨系統base倉庫提供,可以使用yun -y install keepalived安裝。

配置檔案:
        主配置檔案:/etc/keepalived/keepalived.conf
        主程式檔案:/usr/sbin/keepalived
        提供校驗碼:/usr/bin/genhash
        Unit File:keepalived.service
        Unit File的環境配置檔案:/etc/sysconfig/keepalived

配置

主配置檔案詳解

! Configuration File for keepalived

global_defs {
   notification_email {   #傳送報警郵件收件地址
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]   #指明報警郵件的傳送地址
   smtp_server 192.168.200.1    #郵件伺服器地址
   smtp_connect_timeout 30      #smtp的超時時間
   router_id LVS_DEVEL          #物理伺服器的主機名
   vrrp_mcast_group4            #定義一個組播地址
   static_ipaddress
        {
        192.168.1.1/24 dev eth0 scope global
        }
        static_routes
        {
        192.168.2.0/24 via 192.168.1.100 dev eth0
        }

}
    vrrp_sync_group VG_1 {              #定義一個故障組,組內有一個虛擬路由出現故障另一個也會一起跟著轉移,適用於LVS的NAT模型。
        group {
            VI1     # name of vrrp_instance (below)         
            VI2     # One for each moveable IP

             }
    }


vrrp_instance VI_1 {        #定義一個虛擬路由
    state MASTER|BACKUP     #當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,餘下的都應該為BACKUP;
    interface eth0          #繫結為當前虛擬路由器使用的物理介面;
    virtual_router_id 51    #當前虛擬路由器的惟一標識,範圍是0-255;
    priority 100            #當前主機在此虛擬路徑器中的優先順序;範圍1-254;
    advert_int 1            #通告發送間隔,包含主機優先順序、心跳等。
    authentication {        #認證配置   
        auth_type PASS      #認證型別,PASS表示簡單字串認證
        auth_pass 1111      #密碼,PASS密碼最長為8位

   virtual_ipaddress {
    192.168.200.16          #虛擬路由IP地址,以輔助地址方式設定
    192.168.200.18/24 dev eth2 label eth2:1 #以別名的方式設定
    }

track_interface {
        eth0
        eth1

}                           #配置要監控的網路介面,一旦接口出現故障,則轉為FAULT狀態;
nopreempt                   #定義工作模式為非搶佔模式;
preempt_delay 300           #搶佔式模式下,節點上線後觸發新選舉操作的延遲時長;
   virtual_routes {         #配置路由資訊,可選項
               #  src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope
       <SCOPE> tab
               src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
               192.168.112.0/24 via 192.168.100.254       192.168.113.0/24  via  192.168.200.254  or 192.168.100.254 dev eth1      blackhole 192.168.114.0/24
           }


    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 {    #LVS配置段 ,設定LVS的VIP地址和埠
    delay_loop                          #服務輪詢的時間間隔;檢測RS伺服器的狀態。
    lb_algo rr                          #排程演算法,可選rr|wrr|lc|wlc|lblc|sh|dh。
    lb_kind NAT                         #叢集型別。
    nat_mask 255.255.255.0              #子網掩碼,可選項。
    persistence_timeout 50              #是否啟用持久連線,連線儲存時長
    protocol TCP                        #協議,只支援TCP
    sorry_server <IPADDR> <PORT>        #備用伺服器地址,可選項。

    real_server 192.168.201.100 443 {   #配置RS伺服器的地址和埠
        weight 1                        #權重
     SSL_GET {                          #檢測RS伺服器的狀態,傳送請求報文
            url {
              path /                    #請求的URL
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #對請求的頁面進行hash運算,然後和這個hash碼進行比對,如果hash碼一樣就表示狀態正常
              status_code <INT>         #判斷上述檢測機制為健康狀態的響應碼,和digest二選一即可。

            }                           #這個hash碼可以使用genhash命令請求這個頁面生成
            connect_timeout 3           #連線超時時間
            nb_get_retry 3              #超時重試次數
            delay_before_retry 3        #每次超時過後多久再進行連線
            connect_ip <IP ADDRESS>     #向當前RS的哪個IP地址發起健康狀態檢測請求
            connect_port <PORT>         #向當前RS的哪個PORT發起健康狀態檢測請求
            bindto <IP ADDRESS>         #發出健康狀態檢測請求時使用的源地址;
            bind_port <PORT>            #發出健康狀態檢測請求時使用的源埠;
        }
    }
}
健康狀態檢測機制
    1. HTTP_GET
    2. SSL_GET
    3. TCP_CHECK
    4. SMTP_CHECK
    5. MISS_CHECK #呼叫自定義指令碼進行檢測
      TCP_CHECK 
      { connect_ip
      <IP ADDRESS> #向當前RS的哪個IP地址發起健康狀態檢測請求; connect_port <PORT> #向當前RS的哪個PORT發起健康狀態檢測請求; bindto <IP ADDRESS> #發出健康狀態檢測請求時使用的源地址; bind_port <PORT> #發出健康狀態檢測請求時使用的源埠; connect_timeout <INTEGER> #連線請求的超時時長; }

      實現LVS高可用叢集

      實驗主機
      虛擬IP:192.168.166.100

      2臺CentOS 7.3

      CentOS 7.3   主伺服器,  IP:192.168.166.130
      CentOS 7.3-1 備份伺服器,IP:192.168.166.132

      2臺CentOS 6.9

      CentOS 6.9  IP:192.168.166.129
      CentOS6.9-1 IP:192.168.166.131

      注:在配置服務前需要注意幾臺主機的防火牆策略,和SELinux配置。

      主排程器配置

      [root@CentOS7.3 ~]#yum -y install keepalived ipvsadm        #安裝keepalived和LVS管理軟體ipvsadm
      [root@CentOS7.3 ~]#vim /etc/keepalived/keepalived.conf  #配置keepalived
      ! 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 CentOS7.3                      #主排程器的主機名
         vrrp_mcast_group4 224.26.1.1             #傳送心跳資訊的組播地址
          
      }
      
      vrrp_instance VI_1 {
          state MASTER                            #主排程器的初始角色
          interface eth0                          #虛擬IP工作的網絡卡介面
          virtual_router_id 66                    #虛擬路由的ID
          priority 100                            #主排程器的選舉優先順序
          advert_int 1
          authentication {
              auth_type PASS                      #叢集主機的認證方式
              auth_pass 123456                    #金鑰,最長8位
          }
          virtual_ipaddress {
              192.168.166.100                     #虛擬IP
          }
      }
      
      virtual_server 192.168.166.100 80 {         #LVS配置段,VIP
          delay_loop 6
          lb_algo rr                              #排程演算法輪詢
          lb_kind DR                              #工作模式DR
          nat_mask 255.255.255.0
      #    persistence_timeout 50                  #持久連線,在測試時需要註釋,否則會在設定的時間內把請求都排程到一臺RS伺服器上面
          protocol TCP
          sorry_server 127.0.0.1 80               #Sorry server的伺服器地址及埠
      #Sorry server就是在後端的伺服器全部宕機的情況下緊急提供服務。
          real_server 192.168.166.129 80 {        #RS伺服器地址和埠
              weight 1                            #RS的權重
              HTTP_GET {                          #健康狀態檢測方法
                  url {
                    path /
                    status_code 200               #狀態判定規則
                  }
                  connect_timeout 1
                  nb_get_retry 3
                  delay_before_retry 1
              }
          }
      
          real_server 192.168.166.131 80 {
              weight 1
              HTTP_GET {
                  url {
                    path /
                      status_code 200
                  }
                  connect_timeout 1
                  nb_get_retry 3
                  delay_before_retry 1
              }
          }
      }
      
      [root@CentOS7.3 keepalived]#systemctl start keepalived          #啟動keepalived
      [root@CentOS7.3 keepalived]#ip a l eth0                         #檢視虛擬路由繫結的網絡卡    
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
          link/ether 00:0c:29:b9:7d:cb brd ff:ff:ff:ff:ff:ff
          inet 192.168.166.130/24 brd 192.168.166.255 scope global eth0
             valid_lft forever preferred_lft forever
          inet 192.168.166.100/32 scope global eth0                   #虛擬IP已經繫結在了eth網絡卡上
             valid_lft forever preferred_lft forever
          inet6 fe80::50fe:a3f3:83a0:d38a/64 scope link 
             valid_lft forever preferred_lft forever

      備份排程器的配置

      [root@centos7.3-1 ~]#yum -y install keepalived ipvsadm 
      
      ! 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 CentOS7.3-1                #備份排程器的主機名
         vrrp_mcast_group4 224.26.1.1         #這個組播地址需與叢集內的其他主機相同
      
      }
      
      vrrp_instance VI_1 {
          state BACKUP                        #初始角色,備份伺服器需設定為BACKUP
          interface eth0
          virtual_router_id 66                #虛擬路由的ID一定要和叢集內的其他主機相同
          priority 90                         #選舉優先順序,要比主排程器地一些
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 123456                #金鑰需要和叢集內的主伺服器相同
          }
          virtual_ipaddress {
              192.168.166.100
          }
      }
                      #餘下配置和主伺服器相同
      virtual_server 192.168.166.100 80 {
          delay_loop 6
          lb_algo rr
          lb_kind DR
          nat_mask 255.255.255.0
      #    persistence_timeout 50              
          protocol TCP
          sorry_server 127.0.0.1 80
      
          real_server 192.168.166.129 80 {
              weight 1
              HTTP_GET {
                  url {
                    path /
                    status_code 200
                  }
                  connect_timeout 1
                  nb_get_retry 3
                  delay_before_retry 1
              }
          }
      
          real_server 192.168.166.131 80 {
              weight 1
              HTTP_GET {
                  url {
                    path /
                      status_code 200
                  }
                  connect_timeout 1
                  nb_get_retry 3
                  delay_before_retry 1
              }
          }
      }
      [root@centos7.3-1 ~]#systemctl start keepalived         #啟動備份keepalived
      [root@centos7.3-1 ~]#ip a l eth0                        #檢視虛擬路由繫結的網絡卡介面
      [root@centos7.3-1 ~]#ip a l eth0
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
          link/ether 00:0c:29:7e:ec:ef brd ff:ff:ff:ff:ff:ff
          inet 192.168.166.132/24 brd 192.168.166.255 scope global eth0
             valid_lft forever preferred_lft forever
          inet6 fe80::9aab:52b3:cc1e:fbef/64 scope link 
             valid_lft forever preferred_lft forever

      測試虛擬IP地址漂移

      關閉主伺服器的keepalived,並檢視eth0介面

      檢視備份伺服器的eth0介面,地址已經漂移到了備份伺服器上面

      可以看到上圖提示有新郵件。使用mail命令檢視郵件列表,都是後端伺服器狀態檢測的郵件,說明配置的報警郵件生效了。應為後端伺服器還沒有配置所以檢測的狀態全是down。

      啟動主伺服器,地址又漂移回了主伺服器

    配置RS伺服器

    RS1配置

[root@CentOS6.9 ~]#yum -y install httpd                 #安裝httpd服務
[root@CentOS6.9 ~]#vim lvs.sh                           #建立一個配置指令碼
#!/bin/bash
vip=192.168.166.100                                     #VIP地址
mask=255.255.255.255                    
dev=eth0:1
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 $dev $vip netmask $mask broadcast $vip up
        route add -host $vip dev $dev
;;
stop)
        ifconfig $dev 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) start|stop"
        exit 1
;;
esac

[root@CentOS6.9 ~]#bash lvs.sh start
[root@CentOS6.9 ~]#ip a l eth0:0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:23:38:c9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.166.129/24 brd 192.168.166.255 scope global eth0
    inet 192.168.166.100/32 brd 192.168.166.100 scope global eth0:1
    inet6 fe80::20c:29ff:fe23:38c9/64 scope link 
       valid_lft forever preferred_lft forever
[root@CentOS6.9 ~]#echo WebServer1 > /var/www/html/index.html
[root@CentOS6.9 ~]#cat /var/www/html/index.html 
WebServer1
[root@CentOS6.9 ~]#service httpd start

  使用ipvsadm 命令檢視lvs配置資訊,RS1伺服器已經排程器新增進叢集。

  RS2配置

[root@CentOS6.9-1 ~]#yum -y install httpd
[root@CentOS6.9-1 ~]#vim lvs.sh                        #和上面RS1的lvx.sh內容相同
[root@CentOS6.9-1 ~]#echo WebServer2 > /var/www/html/index.html
[root@CentOS6.9-1 ~]#cat /var/www/html/index.html 
WebServer2
[root@CentOS6.9-1 ~]#service httpd start

第二臺RS伺服器上線

    客戶端測試

    因為使用的是輪詢演算法,所以會在Web1和Web2之間來回排程。

注意:如果在測試是開啟了lvs的長連線,會導致在設定的時間內把客戶端一直排程到同一臺RS伺服器上面。

關閉主排程器

客戶端訪問

我們還可以使用這些主機配置來兩套LVS高可用,做一個雙主模型

第二套LVS資訊

VIP:192.168.166.200

第一臺排程器為備份伺服器

第二臺排程器為主伺服器

第一臺排程器配置

! 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 CentOS7.3
   vrrp_mcast_group4 224.26.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.166.100
    }
}

virtual_server 192.168.166.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#   persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}
#第二套虛擬路由
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88            #ID不要和第一套虛擬路由相同
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
   virtual_ipaddress {
        192.168.166.200         
    }
}

virtual_server 192.168.166.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#   persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.166.129 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

    real_server 192.168.166.131 80 {
        weight 1
        HTTP_GET {
            url {
              path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

第二臺的配置這裡就不列出了,把第一臺伺服器的配置檔案修改一下。下圖是配置好的結果。

第一臺伺服器

第二臺伺服器

RS配置

#!/bin/bash
vip=192.168.166.100
mask=255.255.255.255
dev=eth0:1                      
vip2=192.168.166.200        #新增一個VIP2
mask2=255.255.255.255
dev2=eth0:2                 #再新增一個eth0:2別名
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 $dev $vip netmask $mask broadcast $vip up
        ifconfig $dev2 $vip2 netmask $mask2 broadcast $vip2 up      #設定地址
        route add -host $vip dev $dev
        route add -host $vip2 dev $dev2

;;
stop)
        ifconfig $dev down
        ifconfig $dev2 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) start|stop"
        exit 1
;;
esac

注:上面這份指令碼RS1和RS2通用

RS

RS2

排程器LVS規則

測試

高可用雙主Nginx

配置Nginx主機

[root@centos7.3 ~]#yum -y install nginx                 #安裝nginx,nginx在epel源。
[root@centos7.3 ~]#vim /etc/nginx/nginx.conf            #修改nginx主配置檔案
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    
upstream web {                          #在http上下文中新增一個伺服器組,web是組名。
    server 192.168.166.129:80;              #後端伺服器的地址和埠
    server 192.168.166.132:80;
}

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

定義兩個Nginx虛擬主機

[root@centos7.3 nginx]#vim /etc/nginx/conf.d/host.conf 
server {
        server_name www.test.com;
        listen 80;
        index index.html;
        root /app/web;
        location / {
        proxy_pass http://web;

        }
}

zhu注:以上內容兩臺主機相同

配置keepalived
第一臺

! 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 CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}

第二臺Nginx

! 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 CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 88
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}
! 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 CentOS7.3-1
   vrrp_mcast_group4 224.24.1.1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }

測試

keepalived可以呼叫外部的輔助指令碼進行資源監控,並根據監控的結果狀態能實現優先動態調整;

先定義一個指令碼

vrrp_script <SCRIPT_NAME> {                  #定義指令碼
    script "killall -0 sshd"                 #可以在引號內呼叫命令或者指令碼路徑,如果指令碼執行成功則不變,如果失敗則執行下面的命令
    interval INT                         #檢測間隔時間
    weight -INT                              #減掉權重
    fall    2                                #檢測幾次判定為失敗
    rise    2                                #檢測幾次判定為成功
}

killall -0 只是測試,並不執行操作,用來測試程序是否執行正常
呼叫此指令碼

track_script {
    SCRIPT_NAME_1               #呼叫指令碼
    SCRIPT_NAME_2  weight  -2    #如果指令碼健康狀態檢測失敗優先順序減2
}

配置檔案

! 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 CentOS7.3
   vrrp_mcast_group4 224.24.1.1
}
vrrp_script nginx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -15
        fall 2
        rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.166.100/24 dev eth0
    }
   track_script {
        nginx
   }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    virtual_ipaddress {
        192.168.166.200/24 dev eth0
    }
}

測試

原文連結:Linux高可用之Keepalived

本文來自部落格園,作者:古道輕風,轉載請註明原文連結:https://www.cnblogs.com/88223100/p/Keepalived_Linux_High_Availability.html