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 检查脚本
| #!/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 主机
| #!/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 备机
| #!/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 |
| |
| #!/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 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了