使用Keepalived實現Nginx的自動重啟及雙主熱備高可用

追風人聊Java發表於2021-09-08

1、概述

之前我們使用Keepalived實現了Nginx服務的雙機主備高可用,但是有幾個問題沒有解決,今天一起探討一下。

1)在雙機主備機制中,Keepalived服務如果宕了,會自動啟用備機進行服務,但Nginx服務如果負載過大宕了,虛擬ip是不會指向備機的。

2)雙機主備的特點是,只有1臺機器在提供服務,備機在主機的Keepalived服務宕掉後才會提供服務,大大的造成了資源的浪費。

3)目前比較流行租用雲伺服器去運營公司的產品,那雲伺服器支不支援虛擬IP呢?

今天我們就上述的三個問題來講解一下。

 

2、使用Keepalived實現Nginx的自動重啟

2.1 藉助Shell指令碼,完成Nginx的重啟

Keepalived不能直接啟動Nginx,但可以執行shell指令碼,因此這裡我們需要藉助Shell指令碼啟動Nginx。

在 /etc/keepalived 目錄下,新建一個指令碼 check_nginx.sh,以下是指令碼的具體內容:

#!/bin/bash

# 執行檢視Nginx程式的命令,並放在變數A中
A=`ps -C nginx --no-header | wc -l`

# 判斷是否當機,如果當機嘗試重啟,如果重啟不成功,則停止Keepalived
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 3
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived

    fi
fi

指令碼來源於網路

 

2.2 為指令碼賦予執行許可權

# chmod +x /etc/keepalived/check_nginx.sh

 

2.3 在Keepalived配置檔案中增加配置

開啟Keepalived配置檔案,# vi /etc/keepalived/keepalived.conf

修改配置檔案,增加 vrrp_script 和 track_script的配置,配置如下:

global_defs {
   
   # 全域性唯一的主機標識
   router_id server_a
   
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 3 # 每隔3秒執行一次Shell指令碼
    weight 10 # 指令碼執行成功,權重加10
}

vrrp_instance VI_1 {

    # 標識是主節點還是備用節點,值為 MASTER 或 BACKUP
    state MASTER
    # 繫結的網路卡
    interface ens33
    # 虛擬路由id,保證主備節點是一致的
    virtual_router_id 51
    # 權重
    priority 100
    # 同步檢查時間,間隔預設1秒
    advert_int 1
    # 認證授權的密碼,所有主備需要一樣
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        check_nginx
    }

    # 虛擬IP
    virtual_ipaddress {
        192.168.1.88
    }
}

 

2.4 重啟Keepalived服務

重啟後,發現,Nginx停掉後,很快會自動啟動。

 

3、雙主熱備的搭建

3.1 雙主熱備概述

由於雙機主備機制,每次只會由一臺伺服器對外提供服務,且主備機的配置是相同的,因此極大地造成了資源的浪費。

雙主熱備則解決了這個問題,雙主熱備的原理是兩臺伺服器利用Keepalived互為主備,因此需要兩個虛擬IP,再利用DNS輪詢的配置,讓一個域名按輪詢的方式分別路由到兩個虛擬IP上,最終達到高可用的目的。

 

3.2 場景說明

虛擬IP1:192.168.1.88

虛擬IP2:192.168.1.66

A伺服器IP(主):192.168.1.144

B伺服器IP(備):192.168.1.22

 

3.3 修改A伺服器配置

配置如下:

! Configuration File for keepalived

global_defs {
   
   # 全域性唯一的主機標識
   router_id server_a
   
}

vrrp_instance VI_1 {

    # 標識是主節點還是備用節點,值為 MASTER 或 BACKUP
    state MASTER
    # 繫結的網路卡
    interface ens33
    # 虛擬路由id,保證主備節點是一致的
    virtual_router_id 51
    # 權重
    priority 100
    # 同步檢查時間,間隔預設1秒
    advert_int 1
    # 認證授權的密碼,所有主備需要一樣
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP
    virtual_ipaddress {
        192.168.1.88
    }
}

vrrp_instance VI_2 {

    # 標識是主節點還是備用節點,值為 MASTER 或 BACKUP
    state BACKUP
    # 繫結的網路卡
    interface ens33
    # 虛擬路由id,保證主備節點是一致的
    virtual_router_id 52
    # 權重
    priority 80
    # 同步檢查時間,間隔預設1秒
    advert_int 1
    # 認證授權的密碼,所有主備需要一樣
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP
    virtual_ipaddress {
        192.168.1.66
    }
}

 

3.4 修改B伺服器配置

配置如下:

! Configuration File for keepalived

global_defs {
   
   router_id server_b
   
}

vrrp_instance VI_1 {
    
    # 設定為備機
    state BACKUP
    interface ens33
    virtual_router_id 51
    # 權重設定的要比主機低
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP需要主備設定成一樣
    virtual_ipaddress {
        192.168.1.88
    }
}

vrrp_instance VI_2 {
    
    # 設定為主機
    state MASTER
    interface ens33
    virtual_router_id 52
    # 權重設定的要比主機低
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虛擬IP需要主備設定成一樣
    virtual_ipaddress {
        192.168.1.66
    }
}

 

3.5 重啟兩臺伺服器的Keepalived

重啟Keepalived即可。

 

3.6 設定DNS輪詢

聯絡網路運營商解決。

 

4、雲伺服器的負載均衡

現在,很多公司都會選擇租用雲伺服器執行自己的產品,因為更划算、更穩定,有專業人員負責運維。

但使用了雲伺服器,就要受雲服務運營商的限制。

就拿虛擬IP這個事兒來說,一些雲服務運營商就是不支援的。

如果不支援虛擬IP,則Keepalived這個方案就只能放棄了。

但即使Keepalived用不了,Nginx的高可用還是有解決方案的,很多雲服務商都已經推出了自己的負載均衡服務(例如:阿里雲的負載均衡 SLB 和 騰訊雲的負載均衡 CLB)。我們直接租用就好了,不需要我們自己去配置。

 

5、綜述

今天大概聊了一下KeepAlived自動重啟Nginx,Keepalived的雙主熱備高可用的搭建,以及雲伺服器負載均衡的解決方案,希望能對大家有所幫助。

希望大家多多評論交流,共同進步。

 

相關文章