Nginx 和 KeepAlived 构建高可用的应用场景
配置多个 Nginx,当一个Nginx 挂了,切换到其他 Nginx
keepAlived 也可以使用到 redis 中,哨兵,服务器高可用、热备、防止单点故障
KeepAlived 以 VRRP 协议,实现高可用,VRRP(Virtual Router Redundancy Protocol)协议时用于实现路由器冗余的协议,VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP (一个或多个)
复制默认的配置文件到默认路径
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/init.d/keepalived /etc/init.d
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
chkconfig keepalived on
keepalived.conf
! Configuration File for keepalived
global_defs {
router_id zie6 #机器标识,通常可以为 hostname ,故障发送时,邮件通知会用到
}
# 定义脚本,主要是告诉 keepalived 在什么情况下切换,可以定义多个 vrrp_script
vrrp_script chk_nginx {
# script <!--more-->
"killall -0 nginx"
script "/etc/keepalived/check_nginx.sh" #自己写的检测脚本
interval 2 #检测时间间隔
weight -20 #检测失败(脚本返回非 0 )则优先级 -20
fall 3 #检测连续两次失败才算是真正的失败
rise 2 #检测一次成功就算成功,但不修改优先级
}
vrrp_instance VI_1 {
state MASTER #指定 instance 的初始状态,但是实际的状态还是通过优先级竞选来确定状态,状态分为:MASTER 和 BACKUP
interface ens33 #实际用于访问网卡
virtual_router_id 26 #设置 VRID,这里非常重要,相同的 VRID 为一个组,它决定多播的 MAC 地址
priority 106 #设置本节点的优先级,优先级高的为:master
advert_int 2 #检查间隔,默认为 1s
authentication { #定义认证方式和密码,主从必须一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置的虚拟 IP 地址,这里可以设置多个 IP 地址
192.168.123.66
}
track_script { #引用 VRRP 脚本,即在 vrrp_script 部分指定的名字,定期运行它来改变优先级,并最终引发准备切换
chk_nginx
}
}
注意:
检测脚本一般有两种写法:
接下来分别提供两个脚本:
第一种:(根据状态改变相应的权重)
#!/bin/bash
# curl -IL http://localhost/
# curl --data "" http://localhost/
count=0
for (( k=0; k<2; k++))
do
check_code=$( curl --connect-timeout 3 -sL -w "%{http_code}\\n" http://localhost/ -o /dev/null)
if [ "$check_code" != "200" ]; then
count=$(expr $count + 1)
sleep 3
continue
else
count=0
break
fi
done
if [ "$count" != "0" ]; then
exit 1
else
exit 0
fi
第二种:(比较暴力直接 kill 服务)
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/local/nginx/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
killall keepalived
fi
fi
注意:
测试截图:
使用第一种脚本
此时我们开始搞事情,使用第一种检测脚本,我们关闭 Nginx 时,由于 curl 不通,第三台机器的权重会 -20 此时,轮到了第二台机器上了
停止 Nginx 服务,执行命令:
此时 keepalived 服务还启动着:
使用第二种脚本
起始状态
思路:
首先自己停止 Nginx ,检测脚本就会瞬间启动,效果不明显,我们只有先修改配置,故意少个分号,让启动报错,此时完成场景模拟
修改配置文件:
杀死进程:
来再切换一波:
至此,基本的 Nginx 和 Keepalived 高可用的场景基本搭建完毕。