1. 程式人生 > >Keepalived實現高可用Nginx

Keepalived實現高可用Nginx

        Keepalived是一個高效能的伺服器高可用或熱備解決方案,Keepalived主要用來防止伺服器單點故障發生的問題,可以通過其與Nginix的配合來實現Web服務端的高可用。

      關於安裝Keepalived我這裡就不介紹了,網上的一大堆,但是注意的是,一般我們會將Keepalived安裝成系統服務。

     下面最主要是keepalived的配置檔案和檢測nginx的指令碼檔案。我們現在做兩個Nginx的高可用。

下面是Master的Keepalived.conf:

! Configuration File for keepalived
 
global_defs {
   router_id hyf112 ##標識節點的字串,通常為hostname
}
## keepalived 會定時執行指令碼並且對指令碼的執行結果進行分析,動態調整vrrp_instance的優先順序。這裡的權重weight 是與下面的優先順序priority有關,如果執行了一次檢查指令碼成功,則權重會-20,也就是由100 - 20 變成了80,Master 的優先順序為80 就低於了Backup的優先順序90,那麼會進行自動的主備切換。
如果指令碼執行結果為0並且weight配置的值大於0,則優先順序會相應增加。
如果指令碼執行結果不為0 並且weight配置的值小於0,則優先順序會相應減少。
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" ##執行指令碼位置
    interval 2 ##檢測時間間隔
    weight -20 ## 如果條件成立則權重減20(-20)
}
## 定義虛擬路由 VI_1為自定義標識。
vrrp_instance VI_1 {
state MASTER   ## 主節點為MASTER,備份節點為BACKUP
    ## 繫結虛擬IP的網路介面(網絡卡),與本機IP地址所在的網路介面相同(我這裡是eth6)
interface eth6 
virtual_router_id 112## 虛擬路由ID號(主備要一致)
    mcast_src_ip 192.168.1.112  ## 本機ip地址
    priority 100  ##優先順序配置(0-254的值)
    Nopreempt  ##
    advert_int 1 ## 組播資訊傳送間隔,倆個節點必須配置一致,預設1s
    authentication { 
        auth_type PASS
        auth_pass hyf## 真實生產環境下對密碼進行匹配
    }
 
    track_script {
        chk_nginx
    }
 
    virtual_ipaddress {
        192.168.1.110 ## 虛擬ip(vip),可以換行指定多個
    }
}

Backup節點的keepalived.conf:

! Configuration File for keepalived
 
global_defs {
   router_id hyf113
}
 
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth7
    virtual_router_id 112
    mcast_src_ip 192.168.1.113
    priority 90 ##優先順序配置
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass hyf
    }
 
    track_script {
        chk_nginx
    }
 
    virtual_ipaddress {
        192.168.1.110
    }
}

檢測Nginx指令碼(主備一樣):

    1、先通過命令看nginx是否在啟動中,

    2、如果沒啟動就命令啟動nginx,然後休眠2秒讓足夠時間啟動nginx

    3、再次通過命令檢視nginx是否已經啟動,如果還是沒啟動就直接kill掉keepalived

#!/bin/sh
A = `ps -C nginx --no-header | wc -l`
if [ $A -eq 0];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [`ps -C nginx --no-header | wc -l`];then
        killall keepalived
    fi
fi

測試:首先啟動兩臺伺服器的nginx和keepalived

1、看兩臺機器的ip a命令下誰有虛擬ip。很明顯112的權重比113的權重大,虛擬ip必須在112機子上。

瀏覽器訪問虛擬IP192.168.1.110:

2、停掉主節點112的keepalived,看是否會切換到113.

先用ip a命令看是否虛擬IP移到113機子上:

繼續訪問瀏覽器看看:

3、我們假如重新啟動112機子的keepalived服務,可以發現nginx也被一起啟動了,而且虛擬ip肯定是重新移到112機子上,因為112的權重是100,而113是90.

訪問瀏覽器:

4、我們可以測試在nginx出現問題的情況下,實現切換,這個時候我們只需要把nginx的配置檔案進行修改,讓其變得不可用,然後強殺掉nginx程序即可,發現也會實現自動切換伺服器節點。