Redis配置keepalive主从异动切换(双节点)

发布时间 2023-05-22 09:37:17作者: 书中黄金屋

Redis配置keepalive主从异动切换

前言

​ 文章中记录的内容配置成功后可以达到异常后vip自动飘逸,并且redis可以自动切换主从关系,但还存在两个问题需要优:

  • keepalived-MASTER异常后VIP会飘逸到keepalived-BACKUP,但是只要keepalived-MASTER恢复正常,VIP一定会飘逸到keepalived-MASTER上,造成不必要的主备切换,对于这个情况网上有设置成双BACKUP。
  • 采用这种方式存在数据丢失问题,只能通过优化notify_master、notify_backup脚本或者其他的方式尽可能地减少数据丢失。

核心思想

使用keepalived监控redis,keepalived检测到redis异常后触发主备切换,执行keepalived的notify_master、notify_backup脚本进行相应处理。

  • notify_master:keepalived变为Master时调用
  • notify_backup:keepalived变为Slave时调用

角色

机器 IP 角色
vip 192.168.207.28 虚拟IP
db01 192.168.207.25 master
db02 192.168.207.26 slave

1 配置

1.1 redis配置

mkdir /opt/redis1/{data,log,script} -p

# master配置
port 6379
protected-mode no
appendonly yes
timeout 3600
daemonize yes
pidfile /opt/redis/pid/redis.pid
logfile "/opt/redis/log/redis.log"
dir "/opt/redis/data"
# 主节点认证密码,如果设置了密码,就要设置
# masterauth 123456

# slave配置
port 6379
appendonly yes
timeout 3600
protected-mode no
daemonize yes
pidfile /opt/redis/pid/redis.pid
logfile "/opt/redis/log/redis.log"
dir "/opt/redis/data"
slaveof 192.168.207.25 6379
# 主节点认证密码,如果设置了密码,就要设置
# masterauth 123456

1.2 keepalive配置

​ keepalive通知shell

定义通知脚本:
notify_master <STRING>|<QUOTED-STRING>:当前节点成为主节点时触发的脚本

notify_backup <STRING>|<QUOTED-STRING>:当前节点转为备节点时触发的脚本

notify_fault <STRING>|<QUOTED-STRING>:当前节点转为“失败”状态时触发的脚本

notify <STRING>|<QUOTED-STRING>:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

脚本需要放在/etc/keepalived/ 下,不然不会生效。权限 777

​ 主机:25

#检测脚本
vrrp_script redis_check {
    script "/opt/redis/scripts/redis_check.sh localhost 6379"
	#检查时间间隔
	interval 2
	rise 3
	fall 3
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
    state MASTER                        # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens33                      # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 66                # 虚拟路由编号,主从要一直
    priority 100                         # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1                        # 检查间隔,默认为1s(vrrp组播周期秒数)
    #授权访问
    authentication {
        auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    track_script {
        redis_check                   #(调用检测脚本)
    }
    virtual_ipaddress {
    	192.168.207.28                   # 定义虚拟ip(VIP),可多设,每行一个
    }

	notify_master /etc/keepalived/redis_master.sh
}

​ 备机:26

#检测脚本
vrrp_script redis_check {
    script "/opt/redis/scripts/redis_check.sh localhost 6379"
	#检查时间间隔
	interval 2
	rise 3
	fall 3
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
    state BACKUP                        # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens33                      # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 66                # 虚拟路由编号,主从要一直
    priority 99                         # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1                        # 检查间隔,默认为1s(vrrp组播周期秒数)
    #授权访问
    authentication {
        auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    track_script {
        redis_check                   #(调用检测脚本)
    }
    virtual_ipaddress {
    	192.168.207.28                   # 定义虚拟ip(VIP),可多设,每行一个
    }

	notify_master /etc/keepalived/redis_master.sh
	notify_backup /etc/keepalived/redis_slave.sh
}

2 脚本

2.1 检查脚本

  • redis_check.sh
#!/bin/bash
# 检测master是否在线
ALIVE=`echo 'PING' | /opt/redis/bin/redis-cli -h $1 -p $2`
LOGFILE="/opt/redis/log/redis-state.log"
echo "[CHECK]" >> $LOGFILE
date '+%F %T' >> $LOGFILE
if [ "$ALIVE" = "PONG" ];then
    echo "Success: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1
    exit 0
else
    echo "Failed:redis-cli -h $1 -p $2 PING $ALIVE " >> $LOGFILE 2>&1
    exit 1
fi

2.2 主机

  • redis_master.sh 25
#!/bin/bash
REDISCLI="/opt/redis/bin/redis-cli"
LOGFILE="/opt/redis/log/redis-master.log"
# 日志
echo "[master]" >> $LOGFILE
date '+%F %T' >> $LOGFILE

# 1 同步备机数据
echo SLAVEOF 192.168.207.26 6379 | $REDISCLI >>$LOGFILE  2>&1
# 2 延迟10秒以后待数据同步完成后再取消同步状态
sleep 10
# 3 设置master
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
echo "SLAVEOF NO ONE" | $REDISCLI  >> $LOGFILE 2>&1

2.2 备机

  • redis_master.sh
#!/bin/bash
REDISCLI="/opt/redis/bin/redis-cli"
LOGFILE="/opt/redis/log/redis-master.log"
# 日志
echo "[master]" >> $LOGFILE
date '+%F %T' >> $LOGFILE

# 1 设置master
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
echo "SLAVEOF NO ONE" | $REDISCLI  >> $LOGFILE 2>&1

  • redis_slave.sh
#!/bin/bash
REDISCLI="/opt/redis/bin/redis-cli"
LOGFILE="/opt/redis/log/redis-slave.log"
# 日志
echo "[SLAVE]" >> $LOGFILE
date '+%F %T' >> $LOGFILE

# 1 延迟12秒,待数据主机同步数据
echo "Being slave wait 15 m for anthor sync data ...." >> $LOGFILE
sleep 12

# 2 设置备机
echo "Run SLAVEOF CMD ..." >> $LOGFILE
echo "SLAVEOF 192.168.207.25 6379" | $REDISCLI >>$LOGFILE  2>&1

3验证

3.1 redis-cli查看

# 是用redis-cli连接redis,master
info replication

# 是用redis-cli连接redis,slave
info replication