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主從實現方式,請分享。