redis主從實現10秒檢查與恢復

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文件,做一個小時一次的備份。


腳本的思路 主要實現上述思路原理,腳本有點彆扭,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主從實現方式,請分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章