keepalive + nginx 來實作 對于nginx的高可用, 以及如何搭建主備模式。
keeplived簡介
Keepalived是用純ANSI/ISO C編寫的。該軟體圍繞一個中央I/O多路複用器進行連接配接,以提供實時網絡設計。
1.1 Keepalived程序被分為3個不同程序
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
}
}
參數詳解
四、常見問題
4.1 日志提示
原因:備機上keepalived監控腳本沒有執行權限。
解決:
chmod +x ~/check_nginx.sh
。
4.2 Keeplived主備vip位址無法切換
原因:keeplived配置的優先級相同。
解決:檢查keepalived.cof配置檔案的priority參數,主從節點優先級設定為不同。
1.概述
前面有了解keepalive 的主備的基本使用, 但是那種是針對當機等情況 停止了keepalive 的程序實作的 vip的漂移,本篇把keepalive 添加校驗nginx存活腳本 實作針對nginx的監控, 實作nginx的高可用
2.準備工作
準備2台機器 , 把111定義為 keepalive 的 MASTER 節點
分别在2台伺服器上配置好nginx 并且修改預設的 index.html 添加上 ip 辨別友善區分. 如下:
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 沒有關閉。
# 臨時關閉
setenforce 0
#永久關閉
sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config
6.模拟測試
2台機器 分别啟動nginx 和 keepalive 後。通路 vip 172.16.225.200 這個vip 目前在 111 master機器上。
在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 的高可用,核心點就是配置 nginx_check.sh腳本給keepalive 的執行, 這個nginx_check.sh 腳本内如果發現nginx 不存活 嘗試啟動 如果還是不存活 則直接關閉 keepalive 程序。