实际生产中,系统压力不大且仅两台物理服务器;实际一个Redis服务完全够用,但为了高可用及容灾备份,又不够哨兵模式的三台,所以做此实现方案。
1、资源配置:
实际服务器:
192.168.30.7【从】 、 192.168.30.8【主】(Redis) 虚拟IP: 192.168.30.6
系统服务,配置连接此虚拟IP即可
2、在两台服务器上安装 Redis 安装目录/usr/local/redis
安装步骤,可参考上篇教程: Centos7.9 源码安装Redis 5.x
**【必须用到】**里面的启动脚本文件 redis.sh
3、增加redis配置文件 master.conf
/ slave.conf
在目录 /usr/local/redis/conf
下新增master.conf
从原 redis.conf
复制,配置文件两台服务器一样就行,如果有配置访问密码一定要一致
slave.conf
配置文件,主要区别如下:
192.168.30.8【主】配置:
# replicaof 配置对方IP 端口
replicaof 192.168.30.7 6379
# 访问密码
masterauth "xxx123"
192.168.30.7【从】配置:
# replicaof 配置对方IP 端口
replicaof 192.168.30.8 6379
# 访问密码
masterauth "xxx123"
配置文件修改完成后,启动服务:
启动 Redis 192.168.30.8【主】 以 【master】 方式启动
[root@centos7 redis]# /usr/local/redis/redis.sh startmaster
启动 Redis 192.168.30.7【从】 以 【slave】 方式启动
[root@centos7 redis]# /usr/local/redis/redis.sh startslave
4、支持 Keepalived 配置脚本文件
于目录/usr/local/redis/
创建脚本 vip_keepalived.sh
(主从一样):
#!/bin/sh
# 虚拟IP(Virtual IP) 检测实现 - keepalived 调用实现
#
# Keepalived vrrp_script 原理:
# 根据调用的 script 脚本结果进行分析:
# - 如果执行结果【为0】, 且 weight 配置的值【大于0】,则优先级相应的【增加】
# - 如果执行结果【非0】, 且 weight 配置的值【小于0】,则优先级相应的【减少】
#
# 实现原理: 本方案 weight 配置的值 建议【大于0】, priority 相等、preempt模式
# 1、检测当前节点服务是否正常、若正常且为 master 主节点,则使 vip 为指向本机
# 2、若本机节点服务进程不存在(则由从节点判定),以下为从节点判断逻辑
# - 当前节点服务进程是否正常,若正常则判断下 redis中的 role 是否为 slave
# - 如果是 slave ,判断 master_link_status 是否为 up
# - 如果不为 up, 则代表主节点连接不上,则修改本节点为 master, 则使 vip 为指向本节点
#
# PS: 本脚本需要配合 redis.sh 使用
# @author hal@xhal.net 2022-11-18
BASE_PATH=/usr/local/redis
# 备份方案,仅检测服务状态 (此方案不能切换为 master)
# 0 表示检查进程是否运行
# /usr/bin/killall -0 redis-server
# 本方案 weight 配置的值 建议【大于0】, priority 相等、preempt模式
# 1、检测当前节点服务是否正常、若正常且为 master 主节点,返回 0
check(){
# 判断运行的角色[ master, slave ] master 返回 0, slave 返回 1, 其它 返回2, redis 未运行 返回9
$BASE_PATH/redis.sh role
redisRole=$?
echo "当前 redis role值: [$redisRole]"
if [ $redisRole -eq "0" ]; then
# redis 有运行,且为 master 主节点,返回 0
return 0
elif [ $redisRole -eq "1" ]; then
#echo " redis 有运行,且为 slave 状态"
# 判断 master_link_status 是否为 up
$BASE_PATH/redis.sh slaveup
if [ $? -eq "0" ]; then
#echo "slave 连接 master 正常"
return 1;
else
# slave 连接 master 已断开,修改本节点为 master
$BASE_PATH/redis.sh tomaster
return 0
fi
else
#echo " 其它状态,直接返回对应结果[$redisRole]"
return $redisRole
fi
#echo "redis 未运行,直接返回 1"
return 1
}
check
于目录/usr/local/redis/
创建脚本 vip_log.sh
(主从一样):
#!/bin/sh
# 记录 Keepalived 切换事件日志
# @author hal@xhal.net 2022-11-18
now=$(date "+%Y-%m-%d %H:%M:%S")
LOG_FILE_PATH=/usr/local/redis/logs/keepalived.log
echo "$now -- $1" >> $LOG_FILE_PATH
5、修改 Keepalived 配置
修改 192.168.30.8【主】 Keepalived 配置 /etc/keepalived/keepalived.conf
[root@centos7 redis]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# Redis 相关配置,开始=======================
vrrp_script chk_redis {
script "/usr/local/redis/vip_keepalived.sh "
interval 5 # 检测时间间隔
weight 88 # 如果条件成立的话【script 执行结果为0】,则权重值按此增加
fall 2 # 定义检测失败的最大次数,如果设置为3 表示请求失败2次时,就认为节点故障
rise 1 # 定义请求成功的次数,如果设置为1 表示一次请求成功后,就认为节点恢复正常
}
# 定义虚拟路由,VI_Redis 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_Redis {
state BACKUP # 来决定主从 MASTER BACKUP
interface ens192 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 8 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.30.8 # 填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
preempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将track_script块加入instance 配置块
track_script {
chk_redis #执行 Redis 监控的服务
}
# 变为 MASTER 后执行脚本
notify_master "/usr/local/redis/vip_log.sh to_be_【master】"
# 变为 BACKUP 后执行脚本
notify_backup "/usr/local/redis/vip_log.sh to_be_【slave】"
# 状态变为 FAULT 后执行脚本
notify_fault "/usr/local/redis/vip_log.sh keepalived_is_Fault"
# VRRP 停止 后执行脚本
notify_stop "/usr/local/redis/vip_log.sh keepalived_is_stop...!"
virtual_ipaddress {
192.168.30.6 #虚拟ip
}
}
修改完成后, 重启 keepalived
[root@centos7 redis]# systemctl restart keepalived.service
修改 192.168.30.7【从】 Keepalived 配置 /etc/keepalived/keepalived.conf
[root@centos7 redis]# vim /etc/keepalived/keepalived.conf
# Redis 相关配置,开始=======================
vrrp_script chk_redis {
script "/usr/local/redis/vip_keepalived.sh "
interval 5 # 检测时间间隔
weight 88 # 如果条件成立的话【script 执行结果为0】,则权重值按此增加
fall 2 # 定义检测失败的最大次数,如果设置为3 表示请求失败2次时,就认为节点故障
rise 1 # 定义请求成功的次数,如果设置为1 表示一次请求成功后,就认为节点恢复正常
}
# 定义虚拟路由,VI_Redis 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_Redis {
state BACKUP # 来决定主从 MASTER BACKUP
interface ens192 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 8 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168.30.7 # 填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
preempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将track_script块加入instance 配置块
track_script {
chk_redis #执行 Redis 监控的服务
}
# 变为 MASTER 后执行脚本
notify_master "/usr/local/redis/vip_log.sh to_be_【master】"
# 变为 BACKUP 后执行脚本
notify_backup "/usr/local/redis/vip_log.sh to_be_【slave】"
# 状态变为 FAULT 后执行脚本
notify_fault "/usr/local/redis/vip_log.sh keepalived_is_Fault"
# VRRP 停止 后执行脚本
notify_stop "/usr/local/redis/vip_log.sh keepalived_is_stop...!"
virtual_ipaddress {
192.168.30.6 #虚拟ip
}
# 当存在 IP 冲突时,可指定单播 ip 为对方IP
# unicast_peer {
# 192.168.30.8 # 另一台 IP
#}
}
修改完成后, 重启 keepalived
[root@centos7 redis]# systemctl restart keepalived.service
6、修改开机启动 redis.service
配置命令
[Unit]
# 服务描述
Description=Redis-Server
# 在 XX 服务后启动
After=network.target
# 服务运行参数; 注意本节点内命令要用绝对路径
[Service]
# 后台运行方式
Type=forking
# 启动命令 (主要修改此部分由 start 修改为 startauto)
ExecStart=/usr/local/redis/redis.sh startauto
# 是否给服务分配独立的临时空间
PrivateTmp=true
# 运行级别下服务安装的相关设置, 可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.target