一、简介
是实现主备切换的一种方式。主机发生故障,自动切换到备机。
vip:虚拟ip。例如主机ip是192.168.1.18,备机是192.168.1.9,keepalived提供一个虚拟ip为vip
二、工作模式
抢占模式:默认。当主节点恢复后主动将vip再次抢回来,按优先级来判断
非抢占模式:不抢回来。按是否是故障来判断切换,不是按优先级
三、配置介绍
配置文件默认位置:/etc/keepalived/keepalived.conf
日志文件默认位置:/var/log/messages
检测脚本位置:/tools/nginx_check.sh
网卡位置:/etc/sysconfig/network-scripts/ifcfg-ens33
#周期识别集群服务是否正常,如果返回状态码是0,那么就认为服务正常,反之亦然
vrrp_script nginx_check { #nginx_check名字随便取,一般跟脚本名字一致
script"/tools/nginx_check.sh" #检测脚本
script_user root
#enable_script_security
interval 60 #检测周期60s
fall 2 #2次失败算失败
rise 1 #1次成功算成功
}
vrrp_instance VI_1 {
state MASTER #角色,MASTER表示主服务器,BACKUP表示备服务器
interface ens33 #网卡
virtual_router_id 52 #虚拟路由标识,master和backup必须一致
priority 100 #节点优先级,master必须比backup大
advert_int 1
nopreempt #设置为非抢占模式,同一实例下主备设置必须一样
authentication {
auth_type PASS
auth_pass 1111 #设置密钥
}
virtual_ipaddress {
192.168.149.100 #设置虚拟IP地址
}
track_script { #调用vrrp_script定义的脚本
nginx_check
}
notify_master /tools/master.sh #keepalived切换到master时执行的脚本
notify_backup /tools/backup.sh #keepalived切换到backup时执行的脚本
notify_fault /tools/fault.sh #keepalived出现故障时执行的脚本
notify_stop /tools/stop.sh #keepalived停止运行前执行的脚本
}
一些命令:
systemctl restart keepalived
systemctl start keepalived
systemctl stop keepalived
四、缺陷
1、即使没有配置文件,Keepalived 也照样能够启动,所以一定要保证配置文件正确。
2、脑裂
五、坑
1、记得关闭selinux
vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled,然后保存退出,reboot
看状态:sestatus
2、记得关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
3、记得设置检测脚本、父路径的权限为 744或者755,不能是777
4、非抢占模式必须主机和备机的state配置必须相同,都设置成BACKUP
state BACKUP
nopreempt
5、关于抢占和非抢占的理解
非抢占模式:不需要权重变更,因为不是按权重来的,是按是否是故障来的
基于优先级的主备切换是在抢占模式下才有效的,非抢占模式优先级低是不会切换的
fall 2表示脚本检测失败两次就置当前主机为故障状态,如果主节点故障,就会发生切换。
rise 1表示脚本检测成功一次就置当前主机为正常状态。
抢占模式:按权重来切换,所以需要配置权重变更
weight -10
6、keepalived停了但是虚拟ip还在:手动停
# 释放虚拟IP地址
ip addr del 192.168.92.153/24 dev ens192
ip addr show dev ens192
使用ip命令刷新ARP缓存:
sudo ip neigh flush all
六、实战
希望达到的效果:
1、在主机停掉nginx,主备能实现切换
2、但主机的keepalived不停
3、其他很多教程检测nginx挂了,停掉keepalived来实现切换的,我这里想自动切换,我不服
主机配置:
global_defs {
router_id LVS_DEVEL
script_user root
}
vrrp_script nginx_check {
script "/tools/nginx_check.sh"
interval 30
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
track_script {
nginx_check
}
}
备机配置:
global_defs {
router_id LVS_DEVEL
script_user root
}
vrrp_script nginx_check {
script "/tools/nginx_check.sh"
interval 30
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 95
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
track_script {
nginx_check
}
}
nginx检测脚本:
#!/bin/bash
counter=$(ps -C nginx |grep -v PID |wc -l)
if [ $counter -gt 0 ];then
# 0代表正常
exit 0
else
exit 1
fi
在主机停掉nginx
vip成功漂移至备机
七、抢占模式的试验
notify_master 和 notify_backup执行时机
// 前提:a的优先级高,b的优先级低
a启动主机
2023-07-14 06:04:46 INFO backup1 // 开始时备机 配置文件指定的
2023-07-14 06:04:51 INFO master1 // 5s后是主机
b启动备机
2023-07-14 06:08:48 INFO backup22 // 开始时备机,a主b备机 配置文件指定的
a停止nginx
a
2023-07-14 06:09:32 INFO def1 // 5s后是失败 当前节点出现故障
b
2023-07-14 06:09:34 INFO master22 // 备机切主机
a启nginx
a
2023-07-14 08:16:06 INFO backup1 // 按初始启动,a备b主
b停nginx
b
2023-07-14 08:18:28 INFO def22
a
2023-07-14 08:18:29 INFO master1 // 新备机切到主机
b启nginx
b
2023-07-14 08:21:27 INFO backup22 // 又回到了a主b备
a的优先级高于b的优先级,所以非抢占模式主备切换跟优先级没有关系,谁先启动谁就是master,
先启动b
2023-07-14 08:27:51 INFO backup22
2023-07-14 08:27:56 INFO master22
再启动a
2023-07-14 08:28:14 INFO backup1
非抢占模式总结:
优先级:优先级好像一点用都没有。因为首次先启动b,再启动a,b是主a是备
首次启动主:如果默认是备,则首次启动是备,等脚本检测完就变成主了
主备切换条件:主备都正常运行,然后主挂了
后续恢复:只会重新形成keepalived集群,不会进行切换,只有主挂了才会切换
完美~