Redis + Keepalived 实现双机主从互备【互为主从、主从自动切换】

实际生产中,系统压力不大且仅两台物理服务器;实际一个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
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Redis主从+Keepalived是一种常见的Redis高可用方案。它的基本原理是通过使用Keepalived实现Redis主从切换。具体步骤如下: 1. 首先,需要安装和配置Keepalived。可以按照以下步骤进行操作: - 下载并解压Keepalived的源代码。 - 进入解压后的目录,并执行以下命令进行编译和安装: ``` ./configure --prefix=/usr/local/keepalived/ make make install ``` - 拷贝所需的文件到相应的目录,例如: ``` cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/keepalived cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir -p /etc/keepalived/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf ``` - 修改keepalived.conf文件,根据实际情况配置虚拟IP(VIP)和监控脚本等参数。 2. 然后,需要配置Redis主从复制。可以按照以下步骤进行操作: - 在Redis的主节点上,修改redis.conf文件,将`slaveof`参数设置为空,即不指定从节点。 - 在Redis的从节点上,修改redis.conf文件,将`slaveof`参数设置为主节点的IP和端口,例如:`slaveof <master_ip> <master_port>`。 3. 最后,启动KeepalivedRedis服务。 - 在Master节点上,启动Keepalived服务。 - 在Master和Slave节点上,分别启动Redis服务。 这样,当Redis的Master节点发生故障时,Keepalived会检测到故障并自动切换到Slave节点,确保Redis服务的高可用性。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [redis高可用:keepalived+redis主从部署](https://blog.csdn.net/liuguanghui1988/article/details/77098143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Keepalived+redis主从](https://blog.csdn.net/qq_37668945/article/details/88618390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值