【Redis】shell脚本实现redis双机房容灾切换(主从模式)

熟悉redis的人都会知道,redis可以使用sentinel哨兵模式进行容灾切换,但是在一些生产中不方便用到redis的哨兵模式,那么我们就需要对双机房发生容灾进行手动的切换。本次是通过shell脚本实现的双机房容灾切换。

1、双机房切换场景模拟

1、初始的双机房场景
在这里插入图片描述
2、A机房宕机切换至B机房场景
在这里插入图片描述
3、A机房修复后,同步数据场景
在这里插入图片描述
4、调整A、B机房为初始环境
在这里插入图片描述

2、A机房的主从切换

  • 当我们需要解决双机房的容灾时,首先要解决的是单个机房的容灾。这里我们用keepalived对A机房的redis进行心跳检测,再通过通知脚本实现redis主从的来回切换。
2.1、A机房的主从切换方案

1、初始的A机房场景
在这里插入图片描述

  • A机房在Master与Slave节点分别搭建Keepalived,设置虚拟vip;
  • B机房salveof A机房的vip;

2、A机房容灾的场景
在这里插入图片描述

  • 编写keepalived脚本检测Master心跳,当A机房的Master宕机后,将A机房的Slave设置为新的Master;
  • 当宕机的Master恢复后,将宕机的Master改为Slave,进行同步数据;
  • 数据同步完毕后,切换回初始的Master与slave;
2.2、A机房的容灾测试过程

服务器172.18.40.173为A机房的Master
服务器172.18.40.174为A机房的Slave
173,174服务器上分别搭建keepalive,设置虚拟IP为172.18.40.222

1、在A机房的173、174服务器上搭建keepalived;

① keepalived的虚拟地址监控redis的Master节点, 所以搭建好keepalived虚拟VIP在173的master节点;
② 在173节点上通过ip addr就可以看到
在这里插入图片描述

2、分别修改与编写173,174服务器的Master与slave的keepalived.conf与redis_check.sh、redis_master.sh、redis_backup.sh脚本;

keepalived.conf与redis_check.sh、redis_master.sh、redis_backup.sh脚本具体见[2.3、A机房的keepalived配置文件与脚本]

3、启动向redis存储的程序,配置地址为虚拟Vip的地址;
在这里插入图片描述
4、查看Master与Slave的存储状态,发现Master写入数据正常,Slave备份数据正常;

由于程序在循环存入数据,查看数据时不是同一时间,所以图片显示的存储数量不同. 此处要说明Master在写入数据,Slave在进行备份,存储良好
在这里插入图片描述

5、关闭173的Master的节点;
在这里插入图片描述
6、keepalived的虚拟Vip已经漂移到174服务器,数据转移到174服务器进行写入;

keepalived的虚拟vip监控Master节点, 说明173的master宕机后,174的slave切换master成功
在这里插入图片描述

7、查看174服务器的存储情况与节点信息,174已经变为Master的状态,且正在进行写入数据;
在这里插入图片描述
在这里插入图片描述
8、重启173服务器的redis;
在这里插入图片描述
9、虚拟vip已经又漂移到173服务器;

说明当173的服务器恢复后,keepalived让主从切换为原来的状态
在这里插入图片描述

10、查看174服务器的节点状态,已改变为slave,且备份的偏移量相同
在这里插入图片描述
11、停止写入数据程序,查看173、174服务器存储情况,数据一致没有丢失;
在这里插入图片描述

2.3、A机房的keepalived配置文件与脚本

1.Master的keepalived.conf配置文件

! Configuration File for keepalived
global_defs {
   router_id redis01
}
vrrp_script chk_redis{
     script "/etc/keepalived/script/redis_check.sh 172.18.40.173 6379 auth"   ## 修改auth为密码
     interval 2
     timeout 2
     fall 3
}
vrrp_instance redis {
    state MASTER
    interface ens192   ##需要修改为实际网卡名称
    virtual_router_id 60
    priority 100          ##权重,数字越大权重越大,主节点数值大于备节点
    advert_int 1
authentication {   #all node must same
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.18.40.222     ##需要修改为实际分配的虚拟IP
    }
    track_script {
         chk_redis
    }

    notify_master "/etc/keepalived/script/redis_master.sh 127.0.0.1 172.18.40.174 6379 auth"     ## 172.18.40.174 6379需要修改为实际的远端主机IP   ## 修改auth为密码

    notify_backup "/etc/keepalived/script/redis_backup.sh 127.0.0.1 172.18.40.174 6379 auth"     ## 172.18.40.174 6379需要修改为实际的远端主机IP   ## 修改auth为密码
}

2.Master的redis_check.sh脚本文件

#!/bin/bash 

ALIVE=`/app/soft/redis-5.0.5/bin/redis-cli -h $1 -p $2 -a $3 PING` 
LOGFILE="/app/log/keepalived/status" 
echo "[CHECK]" >> $LOGFILE
date >> $LOGFILE
if [ "$ALIVE" == "PONG" ]; then
    echo "Success: redis-cli -h $1 -p $2 -a $3  PING $ALIVE" >> $LOGFILE 2>&1
    exit 0   
else  
    echo "Failed:redis-cli -h $1 -p $2 -a $3 PING $ALIVE " >> $LOGFILE 2>&1
    exit 1 
fi 

3.Master的redis_master.sh脚本文件

#!/bin/bash

REDISCLI="/app/soft/redis-5.0.5/bin/redis-cli -h $1 -p $3 -a $4"
LOGFILE="/app/log/keepalived/status"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE
echo "Run MASTER cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE

##判断偏移量,也可以使用下面注释掉的sleep进行同步数据的等待

slave=$(/app/soft/redis-5.0.5/bin/redis-cli -h $2 -a $4 info | grep slave0 | awk -F "=" '{print $5}' | awk 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值