Redis配置keepalive主从异动切换(双节点)
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