nginx+keepalived高可用


一次面試過程中...

作者:IT王小二
博客:https://itwxe.com

面試官:你這個使用 nginx 做負載,是使用單台 nginx 嗎?如果 nginx 掛了怎么辦?
我:是的,由於業務訪問量不大 nginx 掛的可能性不大,考慮服務的穩定性可以使用 keepalived。
面試官:你知道實現的思路和配置嗎?
我:。。。

一、傳統高可用

tomcat 高可用的思路是在 tomcat 集群前面加一層負載nginx,如下圖:

傳統高可用

但是這種結構一旦 nginx 掛掉了,那么整個服務就癱瘓了。

二、LVS思想解決高可用問題

1. 什么是LVS

LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一 -- 摘自百度百科

LVS 個人理解就是利用多個物理機集群虛擬出一個虛擬ip(Virtual Server IP,簡稱VIP),虛擬ip不是實際存在的物理機,所以虛擬ip不會掛,而 LVS 的實現 Linux 內核已經幫助我們實現了,結構如下圖:

LVS示意圖

2. nginx+keepalived

在傳統高可用的基礎上,利用多台服務器集群借助 keepavlied 管理 LVS 虛擬出一個虛擬ip,只要兩台 nginx 服務器不宕機那么服務就不會癱瘓,如下圖:

nginx+keepalived

三、環境說明

  1. 演示機器ip:192.168.5.11,192.168.5.12
  2. Linux版本:CentOS Linux release 7.6.1810 (Core)
  3. keepalived版本:1.3.4
  4. nginx版本:1.13.1

四、keepalived具體配置

1. 前提

注意:兩台機器都需要進行此步操作

1、修改 selinux,關閉 SELINUX,打開 vim /etc/sysconfig/selinux,設置 SELINUX=disabled,我 VMWare 里面安裝的 Linux 和騰訊雲的雲服務器都默認關閉了,如下圖:

關閉selinux

2、安裝需要的依賴包。

yum -y install libnl libnl-devel libnfnetlink-devel

2. keepalived安裝

注意:兩台機器都需要進行此步操作

1、不要使用 yum 方式安裝(有bug),keepalived 官網下載 keepalived 上傳,或者使用 wget 下載,下載后解壓。

wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
tar -zxvf keepalived-1.3.4.tar.gz

2、解壓之后,指定目錄。

cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived --sysconf=/etc

注:

  • --prefix:指定安裝目錄。
  • --sysconf:keepalived配置文件目錄,如果指定了其他配置目錄需要指定配置文件啟動keepalived,如:/usr/local/keepalived/sbin/keepalived -D -f 配置文件路徑

3、編譯安裝。

make && make install

3. keepalived配置

這一步略有不同,其中一台機器作為主機(192.168.5.11),另外一台機器作為備份機(192.168.5.12)

主機(192.168.5.11)配置

打開 keepalived 配置文件目錄(我的是/etc/keepalived)下的 keepalived.conf 文件,配置如下信息,其余多余配置刪除。

! Configuration File for keepalived

global_defs {
   router_id 192.168.5.11       # keepalived的唯一標識
}

vrrp_instance VI_1 {
    state MASTER                # 初始狀態,MASTER 和 BACKUP
    interface ens33             # 系統使用的網卡接口名稱,可以使用ip addr查看
    virtual_router_id 51        # 組名,參與此虛擬機ip的機器配置一樣的值,即一個集群內的機器都使用同一個值
    priority 200                # 優先級,數值大的優先級高,組內最高的勝出
    advert_int 1                # 心跳檢測1秒一次
    authentication {            # 授權,無需改動
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.5.10            # 虛擬ip
    }
}

備份機(192.168.5.12)配置

同樣打開 keepalived 配置文件目錄 ,打開 keepalived.conf 文件,配置如下信息,和主機不同的是 router_id,interface,priority,配置如下:

! Configuration File for keepalived

global_defs {
   router_id 192.168.5.12       # keepalived的唯一標識
}

vrrp_instance VI_1 {
    state BACKUP                # 初始狀態,MASTER 和 BACKUP
    interface ens33             # 系統使用的網卡接口名稱,可以使用ip addr查看
    virtual_router_id 51        # 組名,參與此虛擬機ip的機器配置一樣的值,即一個集群內的機器都使用同一個值
    priority 100                # 優先級,數值大的優先級高,組內最高的勝出
    advert_int 1                # 心跳檢測1秒一次
    authentication {            # 授權,無需改動
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.5.10            # 虛擬ip
    }
}

4. 校驗LVS效果

1、分別啟動兩個機器上的 keepalived。

/usr/local/keepalived/sbin/keepalived

2、使用 ip addr 查看效果,正常的結果是虛擬ip位於 192.168.5.11 這台機器上,因為其配置的優先級更高。可是...結果...不出意外的翻車了,哈哈哈!出現的問題是兩個機器出現了雙VIP,翻車截圖如下:

VM11ipaddr

VM12ipaddr

個人猜測是防火牆的原因,於是一波 Google 大法,果不其然,找到了原因:防火牆將 vrrp 廣播給攔截了,所以導致 BACKUP 接收不到 MASTER 的廣播。

查找問題的過程:

局域網內任意一台機器安裝抓包工具 tcpdump,命令:yum -y install tcpdump

執行 tcpdump -i ens33 vrrp -n 命令查看情況,發現兩台機器都在廣播,正常情況 BACKUP 不應該在廣播的。

抓包異常情況

為了驗證一下,把兩台機器的防火牆全部關閉,命令:systemctl stop firewalld.service,發現情況正常了。

抓包正常情況

ip addr 查看,發現配置成功了。

master_success

backup_success

不關閉防火牆放行 vrrp 廣播

正常情況咱們肯定不裸奔需要防火牆的,那么就需要放行 vrrp 廣播。

# 需要注意命令中的網卡名稱
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 重啟防火牆
firewall-cmd --reload

3、配置正常了,那么就需要檢驗一下當 MASTER 主機宕機之后虛擬ip是否會自動漂移到 BACKUP 備份機器了,當然為了模擬場景我只需要把 keepalived 服務干掉就可以了。

kill_master

可以看到 BACKUP 備份機已經接管了。

BACKUP_MASTER

而當 MASTER 主機重啟之后,MASTER 主機又會搶回虛擬ip的控制權。

五、nginx+keepalived配合使用

前面配置好 keepalived 之后有人會問,這和nginx貌似沒啥關系,是滴,確實沒啥關系,但是接下來的配置就有關系了。

有時候,並非是服務器宕機了,而只是 nginx 掛掉了,而 keepalived 中並沒有相關配置,這樣的話如果 MASTER 主機中的 nginx 掛掉了,那么虛擬ip也不會自動飄逸到 BACKUP 備份機,接下來就是為了結合 nginx的配置,使用 keepalived 來監控 nginx 。

1. 編輯心跳執行腳本

我的執行腳本位置保存在 /usr/local/keepalived/chk_nginx_pid.sh,內容如下:

#!/bin/bash

A=`ps -C nginx --no-header |wc -l` # 統計nginx進程數,若為0,表明nginx被殺
if [ $A -eq 0 ];then
        # 重啟nginx,不是默認配置路徑所以需要指定路徑,因人而異
        /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
        # nginx重啟失敗,則停掉keepalived服務,進行VIP轉移
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                # 殺掉,VIP就漫游到另一台機器
                killall keepalived
        fi
fi

注意:

  1. 保存后賦予可執行權限:chmod +x chk_nginx_pid.sh
  2. 查看是否可以使用 killall 命令,如果無法使用 killall 命令則安裝psmisc: yum -y install psmisc

2. 配置keepalived配置文件

增加的配置如圖:

keepalived心跳檢測nginx

vrrp_script check_nginx {
    script "/usr/local/keepalived/check_nginx.sh"       # 心跳執行的腳本
    interval 2                                          # 每2秒檢測一次
    weight 2                                            # 腳本結果導致的優先級變更:10表示優先級+10;-10則表示優先級-10
}

track_script {
    check_nginx             # 調用檢測腳本
}

3. 測試是否生效

關閉 keepalived 和 nginx的進程,重啟 keepalived,看 keepalived 是否可以自動啟動 nginx 。

killall keepalived

killall nginx

/usr/local/keepalived/sbin/keepalived

打不死的nginx

同理,BACKUP 備份機也同樣增加相同的心跳檢測腳本和配置即可 。

測試發現,后面無論怎么 kill 掉 nginx,nginx都會被 keepalived自動重啟,變成了打不死的小強,也就實現了 nginx 的高可用。

都讀到這里了,來個 點贊、評論、關注、收藏 吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM