实际生产中,系统压力不大且仅两台物理服务器;实际一个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

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: