主从实现秒检查与恢复

主从实现秒检查与恢复,第1张

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

Redis主从架构

问题:redisdown重启后,键值可以修复,时间会延迟,down机中间的值可能会丢失。

在自然环境中,主机和从机位于一个网络服务器上,使用不同的端口号。

解决方案:redis的主从到目前为止还不完善。大家都是用redis的主从密钥做redis的备份。主服务器宕机后,尽量在10s内修复键值。万能钥匙可读写,实现快速读写能力。rdb可以代替所有备份方法,简单方便地完成备份。

想法:

Redis有两种持久方式,rdb和aof。考虑到aof提升太快,修复慢,我们只是从顶层做rdb。main关闭后,脚本制作检查main的情况,然后从顶层做bgsave,将rdb文件从顶层复制到main的数据文件目录下,并重新启动main。根据母盘上的密钥是否值总数,是否跟随母盘上的总数,可以区分是否恢复,进而判断密钥是否值完全恢复。备份方法是:每小时复制一次网站上的rbd文档,每小时备份一次。


剧本制作的关键是完成上述原则。脚本制作有点奇怪,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

在整个修复过程中,使用主密钥和主服务器宕机后的从密钥来区分是否恢复。

遇到的问题:在整个修复过程中,主密钥的值始终低于从密钥的值,但主启动完全正常,密钥的值完全相同。思考后发现是程序运行的问题,脚本制作实现太快。当实现比较完整的时候,关键还是很值得的,总人数完全恢复只是时间问题。所以,睡眠3秒后,一切正常。每个人都要根据自己钥匙总数的大小来决定分辨睡眠的时间。

如果有更强的redis主从完成法,请分享。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/784406.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存