1.前言
搭建了redis哨兵集群后,一般以master节点接收写请求,然而当master节点出现故障后哨兵会投票选举一台slave节点晋升为master节点,此时master的ip地址就发生了变化,就需要重新给写请求指定访问的ip地址,所以使用keepalive去代理master节点的地址,使用keepalive的vrrp_script模块通过脚本是否执行成功去增加节点的权重,若脚本执行成功状态为0则权重增加,若脚本执行不成功状态不为0则权重回退到原来的权重,即使脚本多次执行成功权重也只会增加一次
2.节点信息
名称 | ip | port |
redisA | 10.1.60.114 | 6379,26379 |
redisB | 10.1.60.115 | 6379,26379 |
redisC | 10.1.60.80 | 6379,26379 |
vip | 10.1.60.116 |
3.搭建环境并配置服务
3.1关闭防火墙(三个节点执行)
systemctl stop firewalld
3.2关闭selinux
setenforce 0
3.3安装keepalive服务(三个节点执行)
yum -y install keepalived
3.4更改原来的配置文件名作为备份(三个节点执行)
find / -name keepalived.conf(查找配置文件路径)
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
3.5创建新的keepalive配置文件(三个节点都配置下列的配置文件信息,只有router_id不同)
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
script_user root
enable_script_security
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id redis01 #三台节点需要配置不一致的id,随机命名即可
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_script check_redis {
script "/etc/keepalived/check-redis-role.sh" #
interval 5 #每间隔5秒执行一次脚本检测
weight 20 #脚本退出状态为0则权重增加20,脚本退出状态不为0则不执行权重增加,当权重设置为负,则需要脚本退出状态为1才会执行,退出为0是不会执行权重为负的设置
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 70 #初始权重配置70
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.60.116
}
track_script {
check_redis
}
}
3.6编辑监控脚本(三个节点均需配置)
vi /etc/keepalived/check-redis-role.sh
#!/bin/bash
state=`redis-cli -p 6379 -a Nfd@9527 info replication | grep -i "role" |grep -i "master"|wc -l` #检测当前节点是否是master
redis=`ps -ef |grep redis-server|grep -v grep |wc -l` #检测redis服务是否存活
if [ $redis == 0 ]; then #等于0证明redis服务挂掉了
systemctl stop keepalived
else
if [ $state == 0 ]; then #等于0证明不是master节点,不等于0证明是master节点
exit 1 #节点不是master脚本退出状态为1
else
exit 0 #节点是master脚本退出状态为0
fi
fi
3.7给脚本增加执行权限(三个节点均需配置)
chmod +x /etc/keepalived/check-redis-role.sh
3.8搭建redis哨兵集群(使用此三个节点搭建)
参考redis哨兵集群搭建_redis搭建哨兵集群-CSDN博客
3.9启用redis服务与哨兵服务(三个节点均需配置)
systemctl start redis
redis-sentinel /root/redis-6.2.11/sentinel.conf
3.10启用keepalive服务(三个节点均需配置)
systemctl start keepalived
3.11查看keepalive服务是否正常识别到master节点
4.模拟哨兵故障切换
4.1把master节点的redis服务关闭
systemctl stop redis
4.2查看原来master节点信息
4.3查看新master节点信息
5.重启挂掉的redis服务与keepalived服务
redis服务重启后会先默认是master状态,需要一会才会识别为slave状态,当节点为slave状态后再启动keepalive服务,所以在写redis检测脚本的时候在redis挂掉后需要把keepalive也干掉,不然redis重启的时候是master状态,keepalive也会竞选vip地址
6.若是防火墙没关闭需要配置开放防火墙规则否则keepalived直接不能互访(知识点补充)
Keepalived使用vrrp组播,默认地址是224.0.0.18,因此要配置防火墙放过
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload