阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis主从实现10秒检查与恢复

226次阅读
没有评论

共计 3358 个字符,预计需要花费 9 分钟才能阅读完成。

Redis 主从架构

问题 :redis down 重启后,能恢复 key 值,时间会有延迟,down 机之间的值将会丢失。

实验环境,主从做在一台服务器上,利用不同端口。

解决方案:redis 主从至今还不算完善,我们利用 redis 主从主要做 redis 备份,master 宕机后,实现 10s 内尽可能的恢复 key 值,主主要做读写,实现快速读写,不做任何备份方式,从就简单实用 rdb 方式实现备份。

思路原理

redis 有两种持久化方式,rdb 与 aof 模式,考虑到 aof 模式增长过快,恢复比较缓慢,就在从上做 rdb 模式,主 down 之后,脚本检查主的状态,之后在从上做 bgsave,把从上的 rdb 文件 copy 到主的 data 目录里,重新启动主。通过判断主上 key 值得数量,是否跟从上的数量一样,来判断是否恢复正常,然后就可以实现 key 值得完全恢复。备份方式为,一个小时 copy 一次从上的 rbd 文件,做一个小时一次的备份。

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

脚本的思路 主要实现上述思路原理,脚本有点别扭,2 做了主,1 做的 redis 从。别扭,实验,没时间修改

#!/bin/bash

DATE=`date +%Y%m%d%M%s`

REDIS_DIR=/usr/local/redis

REDIS2_DIR=/usr/local/redis2

BIN_DIR=/usr/local/redis/bin

DATA1_DIR=/usr/local/redis/data

DATA2_DIR=/usr/local/redis2/data

PORT1=6378

PORT2=6379

 

function BACKUP_RDB {

    ps -ef |grep $PORT2 >/dev/null

    if  [$? -eq 0];then

        ${BIN_DIR}/redis-cli -p $PORT2 bgsave >/dev/null

        if [$? -eq 0];then

            echo -e “\033[31m MASTER REDIS DOWN AND SLAVE bgsave DONE\033[0m”

            ${BIN_DIR}/redis-cli -p $PORT2 SLAVEOF NO ONE >/dev/null

        fi

    fi

}

 

function CP_RDB {

    [-d ${DATA1_DIR}/redisbackup ]  || mkdir ${DATA1_DIR}/redisbackup

    if [-f $DATA2_DIR/dump.rdb];then

        mv ${DATA1_DIR}/dump.rdb  ${DATA1_DIR}/redisbackup/dump.rdb.$DATE

        cp ${DATA2_DIR}/dump.rdb  ${DATA1_DIR}/

    fi

}

 

function  START_REDIS {

    KEY2_NUM=`${BIN_DIR}/redis-cli -p $PORT2 INFO  |grep db[0-9]*.key |awk -F[:=,] ‘{total+=$3}END{print total}’`

    ${BIN_DIR}/redis-server ${REDIS_DIR}/etc/redis.conf

    netstat -tnlp |grep “$PORT1” >/dev/null

    a=$?

    if [$a -ne 0];then

        while [$a -ne 0];do

            sleep 2

            netstat -tnlp | grep “127.0.0.1:$PORT1” 1>/dev/null 2>/dev/null

            a=$?

        done

        echo -e “\033[32m MASTER REDIS RUNNING ……..\033[0m”

        sleep 7

        KEY1_NUM=`${BIN_DIR}/redis-cli -p $PORT1  INFO  |grep db[0-9]*.key |awk -F[:=,] ‘{total+=$3}END{print

 

total}’`

#        echo ${KEY1_NUM}

        if [$KEY1_NUM -ge $KEY2_NUM];then

            ${BIN_DIR}/redis-cli -p $PORT2 SLAVEOF 127.0.0.1 $PORT1 >/dev/null

            echo -e “\033[32m MASTER AND SLAVE are Normal sync \033[0m”

        else

            echo -e “\033[31m KEY NUM are not equal, MASTER AND SLAVE are not Normal sync,place to check ! \033[0m”

            break

        fi

    else

        echo -e “\033[32m MASTER REDIS RUNNING ……..\033[0m”

        sleep 7

        KEY1_NUM=`${BIN_DIR}/redis-cli -p $PORT1 INFO  |grep db[0-9]*.key |awk -F[:=,] ‘{total+=$3}END{print total}’`

#        echo ${KEY1_NUM}

        if [$KEY1_NUM -ge $KEY2_NUM];then

            ${BIN_DIR}/redis-cli -p $PORT2 SLAVEOF 127.0.0.1 $PORT1 >/dev/null

            echo -e “\033[32m MASTER AND SLAVE are Normal sync \033[0m”

        else

            echo -e “\033[31m KEY NUM are not equal, MASTER AND SLAVE are not Normal sync,place to check ! \033[0m”

            break

        fi

    fi

}

 

 

while true;do

    sleep 10

    netstat -tnlp | grep “127.0.0.1:$PORT1” 1>/dev/null 2>/dev/null

    TRAP1=$?

    ps -ef |grep “$PORT1” >/dev/null

    TRAP2=$?

    if [$TRAP1 -ne  0] || [$TRAP2 -ne  0];then

        #echo redis-master down

        BACKUP_RDB

        CP_RDB

        START_REDIS

    fi

done

在恢复的过程中,比较主的 key 和主宕机后从的 key,来判断是否恢复正常,

遇到的问题:在恢复过程中,主 key 的值一直小于从的 key 的值,但是主启动完全正常,key 值也完全一样,经过思考发现,是程序执行问题,脚本执行太快,当执行到比较的时候,key 值得数量未完全恢复,只是时间的问题,所以执行了 sleep 3 秒之后,一切正常。大家要根据自己 key 值得数量的大小来决定判断 sleep 的时间。

如果有更好的 redis 主从实现方式,请分享。

CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis 安装部署学习笔记 http://www.linuxidc.com/Linux/2014-07/104306.htm

Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

Redis 的详细介绍 :请点这里
Redis 的下载地址 :请点这里

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计3358字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中