keepalived + nginx 實現高可用

原理

nginx 能夠實現負載均衡,但 nginx 自身存在單點故障的問題,這時候最早想到的就是 keepalived,能夠解決單點故障的問題nginx

因爲沒有使用 lvs,因此這裏 nginx 之間不存在負載均衡bash

同時,若是 keepalived 的 master 節點 nginx 服務宕了之後,若是 keepalived 還在運行,則用戶就訪問不到 nginx 服務了,因此須要添加監控腳本,當 nginx 宕機時,殺死本機的 keepalived 服務服務器

這樣,keepalived 的 master 就會切換,同時用戶訪問的 nginx 服務也會切換到原來的 backup 節點負載均衡

測試節點

  RIP VIP
MASTER 192.168.132.136 192.168.132.200
SLAVE 192.168.132.140 192.168.132.200

配置nginx

安裝 nginx 不是重點,這裏就是用 yum 簡單安裝
yum -y install nginx
systemctl start nginx

 

配置keepalived

安裝 keepalived 使用 yum 安裝便可
keepalived 配置以下:
global_defs {
   notification_email {
     chen@test.com
   }
   notification_email_from chen@test.com
   smtp_server smtp.exmail.qq.com
   smtp_connect_timeout 30
   router_id my-slave
}
 
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 5
}
 
vrrp_instance my_nginx {
    state MASTER            # BACKUP 節點這裏配置成 BACKUP
    interface ens37
    virtual_router_id 51
    priority 200            # BACKUP 節點配置要比該值小
    advert_int 1
    
    # vrrp_script定義的chk_nginx須要放到vrrp_instance裏,用track_script指定,才能執行
    track_script {
        chk_nginx
    }
    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.132.200/24 dev ens37 label ens37:200
    }
}

 

以上配置中,重點在腳本 /etc/keepalived/nginx_check.sh
該腳本會被每 5s 執行一次,用來檢測 nginx 是否存活,若是不存活,則嘗試重啓 nginx,啓動失敗的話,會將本機的 keepalived 服務也殺死,保證切換主節點,不影響 nginx 訪問
腳本 /etc/keepalived/nginx_check.sh 內容以下:
#!/bin/bash
 
# 注意,整個腳本的執行時間必須小於keepalived中定義的時間間隔,即interval定義的時間,不然下次執行腳本時,會殺死上次正在執行的腳本
systemctl status nginx &> /dev/null
# 檢查nginx狀態,nginx正常運行,$?爲0,不然爲非零數
if [ $? -ne 0 ];then
    systemctl start nginx
 
    # 啓動nginx後等待2s,保證nginx已經正常啓動運行,若是nginx還未正常運行,則關閉keepalived服務,使用備用keepalived
    sleep 2
    systemctl status nginx &> /dev/null
 
    if [ $? -ne 0 ];then
        systemctl stop keepalived
    fi
fi

 

keepalived 配置公網虛擬IP

由於內網IP咱們能夠隨意支配,隨意容易配置,但配置公網虛擬IP時,仍是有很大不一樣的,這裏以雲廠商提供的雲主機爲例
首先,須要主備keepalived機器都包含兩個網卡,其中一個網卡爲綁定內網,另外一個綁定公網
事實上,兩臺雲主機只須要有一個綁定了公網便可,但網卡數量不能少
大部分雲廠商提供的雲主機中,都包含公網網卡,可是也有隻有內網網卡的
之因此可使用公網IP訪問,應該是經過路由器設置的,如金山雲的雲主機就只有內網網卡,這種機器暫時不知道怎麼配置keepalived 的虛擬公網IP
 
這裏服務器ip以下:
服務器 內網 外網
A 192.168.10.30 118.110.20.14
B 192.168.10.40  
外網IP的默認路由爲118.110.20.11
內網網卡名爲 ens224
外網網卡名爲 ens160
 
方法一:
這裏須要將兩個服務器外網網卡都配置成不包含IP的配置並啓動:
[admin@test ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens160
# 其中大部分配置都不是必須的,只須要能保證網卡能正常啓動且不包含IP便可
HWADDR=00:50:56:8b:72:14
NAME=ens160
# GATEWAY=118.110.20.12
# NETMASK=255.255.255.240
# IPADDR=118.110.20.14
DNS1=8.8.4.4
DNS2=8.8.8.8
DOMAIN=example
DEVICE=ens160
ONBOOT=yes
USERCTL=no
BOOTPROTO=static
PEERDNS=no
 
check_link_down() {
 return 1;
}

 

keepalived配置以下:
# 這裏只列出了主要部分,其餘部分按照前面的例子來便可
vrrp_instance my_nginx {
    state MASTER
    interface ens224        # 這裏必須寫成內網網卡名,不能寫成外網網卡名
    virtual_router_id 51
    priority 100
    advert_int 1
 
    track_script {
        chk_nginx
    }
 
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        118.110.20.14/28 dev ens160    # 這裏配置和上面的例子不同,至關於直接配置ens160網卡,沒用到label
    }
    virtual_routes {
        default via 118.110.20.12       # 這裏配置默認路由
    }
}

 

注意,咱們前面的例子中,interface 和虛擬網卡指定的網卡名都是同樣,但事實上,這兩個是沒有聯繫的
interface 指定的網卡是用來發送arrp包的源地址,而虛擬網卡指定的網卡是爲了作虛擬IP的
由於,若是咱們這裏interface 指定的網卡名爲ens160,因爲這個網卡沒有IP,則因爲發送arrp包時找不到源地址,而致使啓動keepalived失敗,報錯以下,在/var/log/message中能找到報錯信息:
Cannot find an IP address to use for interface

 

方法二:
主要思路是,兩臺機器都配置好公網網卡,IP都配置成118.193.20.4,而後讓主的公網網卡啓動,從的公網網卡關閉
具體步驟以下:
網卡配置以下:
[root@test sites]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
HWADDR=00:50:56:8b:0e:60
NAME=ens160
GATEWAY=118.110.20.12
DNS1=8.8.4.4
DNS2=8.8.8.8
DOMAIN=example
DEVICE=ens160
ONBOOT=yes
USERCTL=no
BOOTPROTO=static
NETMASK=255.255.255.240
IPADDR=118.110.20.14
PEERDNS=no
 
check_link_down() {
 return 1;
}

 

keepalived配置以下:
vrrp_instance my_nginx {
    state BACKUP
    interface ens224        # 這裏必須寫成內網網卡名,不能寫成外網網卡名
    virtual_router_id 51
    priority 100
    advert_int 1
 
    track_script {
        chk_nginx
    }
 
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    notify_master /etc/keepalived/script/master.sh
    notify_backup /etc/keepalived/script/backup.sh
}

 

這裏master.sh內容以下,主要功能是保證公網網卡啓動:
#!/bin/bash
 
ifconfig | grep 118.110.20.14
if [ $? -ne 0 ];then
    ifconfig ens160 up
fi

 

backup.sh內容以下,主要功能就是關閉公網網卡:
#!/bin/bash
 
# 即便已經關閉了,再執行該命令也不會有報錯,因此不用作斷定
ifconfig ens160 down
相關文章
相關標籤/搜索