keepalived工作在虚拟路由器冗余协议 VRRP (Virtual Router Redundancy Protocol) 上,它允许一个静态 IP 在两个 Linux 系统之间进行故障转移。
环境准备:
两台虚拟机centos7,IP:192.168.213.4(backup) 192.168.213.6(master)
安装了Nginx。
关闭Firewalld、SELinux。
访问http://192.168.213.4/,效果如下:
访问http://192.168.213.6/,效果如下:
1、安装Keepalived
sudo yum install -y keepalived
备份配置文件:
keepalived的配置文件路径:/etc/keepalived
将配置文件备份,修改原来的配置文件 keepalived.conf
。
cp keepalived.conf keepalived.conf-bk
修改配置文件:
master 192.168.213.6:
global_defs {# 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)router_id 192.168.213.6
}# 定时运行的脚本文件配置
vrrp_script check_nginx_pid_restart {# 之前编写的nginx重启脚本的所在位置script "/bin/keepalived/check_nginx_pid_restart.sh" # 每间隔3秒执行一次interval 3# 如果脚本中的条件成立,重启一次则权重-20weight -20
}# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)
vrrp_instance VI_1 {# 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)state MASTER# 绑定虚拟IP的网络接口,根据自己的机器的网卡配置interface ens33 # 虚拟路由的ID号,主从两个节点设置必须一样virtual_router_id 121# 填写本机IPmcast_src_ip 192.168.213.6 # 节点权重优先级,主节点要比从节点优先级高priority 100# 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题nopreempt# 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)advert_int 1authentication {auth_type PASSauth_pass 1111}# 将track_script块加入instance配置块track_script {# 执行Nginx监控的脚本check_nginx_pid_restart}virtual_ipaddress {# 虚拟IP(VIP),也可扩展,可配置多个。192.168.213.20}
}
backup 192.168.213.4:
global_defs {# 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)router_id 192.168.213.4
}# 定时运行的脚本文件配置
vrrp_script check_nginx_pid_restart {# 之前编写的nginx重启脚本的所在位置script "/bin/keepalived/check_nginx_pid_restart.sh" # 每间隔3秒执行一次interval 3# 如果脚本中的条件成立,重启一次则权重-20weight -20
}# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)
vrrp_instance VI_1 {# 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)state BACKUP# 绑定虚拟IP的网络接口,根据自己的机器的网卡配置interface ens33 # 虚拟路由的ID号,主从两个节点设置必须一样virtual_router_id 121# 填写本机IPmcast_src_ip 192.168.213.4# 节点权重优先级,主节点要比从节点优先级高priority 90# 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题nopreempt# 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)advert_int 1authentication {auth_type PASSauth_pass 1111}# 将track_script块加入instance配置块track_script {# 执行Nginx监控的脚本check_nginx_pid_restart}virtual_ipaddress {# 虚拟IP(VIP),也可扩展,可配置多个。192.168.213.20}
}
check_nginx_pid_restart.sh:
#!/bin/sh
# 通过ps指令查询后台的nginx进程数,并将其保存在变量nginx_number中
nginx_number=`ps -C nginx --no-header | wc -l`
# 判断后台是否还有Nginx进程在运行
if [ $nginx_number -eq 0 ];then# 如果后台查询不到`Nginx`进程存在,则执行重启指令systemctl start nginx# 重启后等待1s后,再次查询后台进程数sleep 1# 如果重启后依旧无法查询到nginx进程if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then# 将keepalived主机下线,将虚拟IP漂移给从机,从机上线接管Nginx服务systemctl stop keepalived.servicefi
fi
给执行文件授权:
chmod +x /bin/keepalived/check_nginx_pid_restart.sh
启动keepalived:
systemctl start keepalived
设置开机启动:
systemctl enable keepalied
查看启动状态:
systemclt status keepalied
查看ip:
ip addr
宿主机ping 192.168.213.20:
访问:http://192.168.213.20/
2、测试
测试场景:
2.1、停止192.168.213.6的Nginx
systemctl stop nginx
2.2、停止192.168.213.6的keepalived
systemctl stop keepalived
2.3、启动192.168.213.6的keepalived
systemctl start keepalived