keepalived可用于多种软件的高可用实现,用来解决单点故障问题,同时在主、备服务器部署相同nginx,通过一个虚拟IP地址(即VIP)对外提供服务,当主服务器的nginx出现故障时,虚拟IP就会自动漂移到备服务器上,整个漂移过程是自动实现的,无需人工干预,从而保障了服务的高可用性。
本文以主备方式,抢占模式(如果使用非抢占模式,仅需将文中两台主机keepalived配置都改为state BACKUP)。
注意:请同步时间,保持时间一致性,自行关闭或配置防火墙和selinux规则
环境准备:
至少两台服务器,3个IP地址,本文操作系统环境为CentOS7.9,keepalived版本1.3.5,nginx版本1.20.2
10.10.10.11 MASTER服务器IP
10.10.10.12 BACKUP服务器IP
10.10.10.10 VIP虚拟IP
访问流程图如下:
1、安装nginx
在两台服务器上同时安装好nginx,我这里通过wlnmp一键包进行安装
rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
yum install wnginx -y
2、修改默认index文件
为了访问区分演示,修改index.html文件,其中MASTER服务器index.html修改为10.10.10.11,BACKUP服务器index.html修改为10.10.10.12
vi /usr/local/nginx/html/index.html
3、安装keepalived
分别在两台服务器上安装keepalived,为了方便演示,我直接通过yum进行安装了
yum install keepalived -y
4、创建nginx脚本文件
在两台主机上分别创建nginx脚本文件
vi /etc/keepalived/nginx_check.sh
!/bin/bash
x=ps -C nginx --no-heading | wc -l
if [ $x -eq 0 ];then
/etc/init.d/nginx start
sleep 2
x=`ps -C nginx --no-heading | wc -l`
if [ $x -eq 0 ];then
systemctl stop keepalived
fi
fi
赋予执行权限
chmod +x /etc/keepalived/nginx_check.sh
注:该脚本判断nginx启动是否正常,如果nginx的进程数为0,表示nginx服务异常,则启动nginx(我这里的nginx启动命令是 /etc/init.d/nginx start),睡眠延迟2秒,防止资源抢占,然后再次判断nginx是否正常,如果还不正常,则停止keepalived,停止后进行IP漂移。
5、MASTER服务器配置
MASTER服务器keepalived配置文件如下
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 10.10.10.11
#表示运行keepalived服务器的唯一标识,可以是任意值,我这里是把本地IP当作标识10.10.10.11
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #定时检测nginx状态脚本
interval 2 #2秒检测一次
timeout 10 #脚本超时时间
weight -20 #权重
}
vrrp_instance VI_1 {
state MASTER
interface ens192 #本地网卡名称
virtual_router_id 51 #虚拟路由ID号,必须保持一致
priority 100 #节点优先级0~254,MASTER要高于BACKUP
advert_int 1 #组播信息发送的时间间隔,默认1秒,节点之间设置需保持一致
nopreempt #state配置项都为BACKUP时生效
authentication {
auth_type PASS
auth_pass 1111
} #账户校验信息,节点之间必须保持一致
virtual_ipaddress {
10.10.10.10
} #VIP(虚拟IP),节点之间必须保持一致
track_script {
chk_nginx
} #检测脚本配置
}
6、BACKUP服务器配置
BACKUP服务器keepalived配置文件如下
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id 10.10.10.12
#表示运行keepalived服务器的唯一标识,可以是任意值,我这里是把本地IP当作标识10.10.10.12
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #定时检测nginx状态脚本
interval 2 #2秒检测一次
timeout 10 #脚本超时时间
weight -20 #权重
}
vrrp_instance VI_1 {
state BACKUP
interface ens192 #本地网卡名称
virtual_router_id 51 #虚拟路由ID号,必须保持一致
priority 99 #节点优先级0~254,BACKUP要低于MASTER
advert_int 1 #组播信息发送的时间间隔,默认1秒,节点之间设置需保持一致
nopreempt #state配置项都为BACKUP时生效
authentication {
auth_type PASS
auth_pass 1111
} #账户校验信息,节点之间必须保持一致
virtual_ipaddress {
10.10.10.10
} #VIP(虚拟IP),节点之间必须保持一致
track_script {
chk_nginx
} #检测脚本配置
}
7、启动keepalived
两台主机分别启动keepalived,并配置开机自启
systemctl start keepalived
systemctl enable keepalived
8、验证环节开始
8-1、网络验证
拔掉MASTER网线后,访问VIP地址10.10.10.10,此时可看到显示内容变成10.10.10.12即BACKUP主机,IP漂移成功。
重新插回MASTER的网线后,访问VIP地址10.10.10.10,此时看到显示内容变成10.10.10.11,即MASTER主机,当MASTER恢复后,IP自动漂移回来了。
8-2、服务宕机验证
停止MASTER上的nginx服务,访问VIP地址10.10.10.10,此时看到访问显示地址依旧是10.10.10.11即MASTER主机。
当MASTER上的nginx服务停止后,keepalived通过nginx脚本重新启动了nginx服务,VIP没有触发漂移操作。
8-3、服务器重启验证
直接poweroff关闭MASTER机器,主机关闭后,访问VIP地址10.10.10.10,此时看到访问显示地址是10.10.10.12即BACKUP主机,IP漂移成功。
启动关闭的MASTER机器,启动成功后,访问VIP地址10.10.10.10,此时可看到访问显示地址是10.10.10.11即MASTER主机,IP自动漂移回来了。