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主从完成法,请分享。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)