天天看點

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式。

keeplived簡介

Keepalived是用純ANSI/ISO C編寫的。該軟體圍繞一個中央I/O多路複用器進行連接配接,以提供實時網絡設計。

1.1 Keepalived程序被分為3個不同程序

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

A.一個極簡的父程序,負責fork和監控子程序,父程序監控架構稱為watchdog

B.兩個子程序,一個負責VRRP架構,另一個負責健康檢查

1.2 使用場景

mysql資料庫雙主架構;

nginx主從架構;通過keepalived進行切換。

1.3 故障切換架構

Keepalived實作了用于導向器故障切換的VRRP協定。在實作的VRRP堆棧中,VRRP資料包排程程式負責為每個VRRP執行個體多路分發特定的I/O。

VRRP執行個體同步:我們可以指定2個VRRP執行個體之間的狀态監控,也稱為VRRP同步組。它保證2個VRRP執行個體保持相同狀态,同步執行個體間互相監視。

二、安裝部署

2.1 通過二進制安裝

1)安裝依賴

yum install curl gcc openssl-devel libnl3-devel net-snmp-devel
           

2)下載下傳解壓安裝包并編譯

tar xz keepalived-1.2.15.tar.gz
./configure
Make && make install
           

3)安裝到指定目錄

2.2 通過依賴包安裝

yum -y install keepalived
yum -y install nmap-ncat
           

– 測試

systemctl status keepalived.service
systemctl start keepalived.service
           

三、配 置

例如兩台互為主主的nginx或mysql同時可提供服務,一台服務宕掉後另一台可接管。

示例:主節點

! Configuration File for keepalived

global_defs {
    router_id test_kp
}

vrrp_script chk_local {
    script "/local/keepalived/etc/stop.sh"
    interval 15
    fall 3
    rise 1
# weight 10
}
vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 1001
    priority 100
    advert_int 1
    nopreempt   ## backup 節點不需要配置
    authentication {
        auth_type PASS
        auth_pass server101
    }
    track_script {
        chk_local
    }
    virtual_ipaddress {
        192.168.10.101/24
    }
}
           

示例:備節點

! Configuration File for keepalived

global_defs {
    router_id test_kp
}

vrrp_script chk_local {
    script "/local/keepalived/etc/stop.sh"
    interval 3
    weight -5
    }


vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 1001
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass server101
    }
    virtual_ipaddress {
        192.168.10.101/24
    }
track_script {
    chk_local
    }
}
           

參數詳解

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

四、常見問題

4.1 日志提示

原因:備機上keepalived監控腳本沒有執行權限。

解決:

chmod +x ~/check_nginx.sh

4.2 Keeplived主備vip位址無法切換

原因:keeplived配置的優先級相同。

解決:檢查keepalived.cof配置檔案的priority參數,主從節點優先級設定為不同。

1.概述

前面有了解keepalive 的主備的基本使用, 但是那種是針對當機等情況 停止了keepalive 的程序實作的 vip的漂移,本篇把keepalive 添加校驗nginx存活腳本 實作針對nginx的監控, 實作nginx的高可用

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

2.準備工作

準備2台機器 , 把111定義為 keepalive 的 MASTER 節點

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

分别在2台伺服器上配置好nginx 并且修改預設的 index.html 添加上 ip 辨別友善區分. 如下:

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

3.配置 keepalived

在keepalived 的配置檔案中的 instance 裡面配置 track_script 指定 檢查nginx是否存活的腳本

3.1 master (172.16.225.111)

! Configuration File for keepalived

global_defs {
  router_id LB111
}

vrrp_script chk_nginx {
  # 具體的腳本
  script "/etc/keepalived/nginx_check.sh"
  interval 2 # 2s執行一次
  weight -20 # 失敗一次 則優先級 -20
}

vrrp_instance VI_1 {
   state MASTER
   interface ens160
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
  }
   virtual_ipaddress {
      172.16.225.200
  }
   # 指定腳本
   track_script {
     chk_nginx
  }
}

           

3.2 master (172.16.225.110)

! Configuration File for keepalived

global_defs {
  router_id LB111
}

vrrp_script chk_nginx {
  script "/etc/keepalived/nginx_check.sh"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
   state BACKUP
   interface ens160
   virtual_router_id 51
   priority 90
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
  }
   virtual_ipaddress {
      172.16.225.200
  }

   track_scrip {
     chk_nginx
  }
}

           

4.配置 nginx_check.sh

主要是這個腳本 這個腳本的内容就是 通過ps指令檢查 nginx程序是否存活 ,如果不存活 則嘗試啟動一次 則檢查 ,如果還是啟動不起來 則 把keepalived 關閉, 進而讓 keepalived 能檢測到 并且 vip 能夠漂移到其他機器:

#!/bin/bash
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
           # 嘗試啟動一次
          systemctl start nginx
       # 再次檢查ngixn 程序
       status2=$(ps -C nginx --no-heading|wc -l)
       if [ "${status2}" = "0" ]; then
               # 關閉 keepalived
              systemctl stop keepalived
       fi
fi
           

需要在2台機器上都配置上這個腳本:

# 給腳本一個 可執行的權限
chmode +x /etc/keepalived/nginx_check.sh
           
# 重新開機或者啟動 keepalived
systemctl restart keepalived
           

5.關閉 selinux

如果重新開機後或者啟動後 檢視日志有如下抛錯 , 則是 selinux 沒有關閉。

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式
# 臨時關閉
setenforce 0

#永久關閉
sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config
           

6.模拟測試

2台機器 分别啟動nginx 和 keepalive 後。通路 vip 172.16.225.200 這個vip 目前在 111 master機器上。

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

在master機器上 把ngixn關閉。

# 關閉 nginx
./nginx -s stop
           
# 此時檢視 keepalived 的狀态就是 dead了
systemctl status keepalived

● keepalived.service - LVS and VRRP High Availability Monitor
  Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
  Active: inactive (dead)
           

再次通路vip 172.16.225.200 , 可以看到 vip 已經跑到了 backup機器110上了。

keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式

總結

keepalive + nginx 的基本的主備配置 實作了 nginx 的高可用,核心點就是配置 nginx_check.sh腳本給keepalive 的執行, 這個nginx_check.sh 腳本内如果發現nginx 不存活 嘗試啟動 如果還是不存活 則直接關閉 keepalive 程序。

繼續閱讀