Redis双机热备方案--转

参考资料:

背景

目前,Redis集群的官方方案还处在开发测试中,未集成到稳定版中。且目前官方开发中的Redis Cluster提供的功能尚不完善(可参考官方网站或),在生产环境中不推荐使用。通过调研发现市面上要实现采用单一的IP来访问,大多采用keepalived实现redis的双机热备作为过渡方案。

环境部署

环境介绍:    Master: 192.168.1.218     redis,keepalived     Slave: 192.168.1.219        redis,keepalived     Virtural IP Address (VIP):  192.168.1.220

设计思路:

两个redis server主从备份。提供redis 服务高可用;两个keepalived 服务主从备份,提供VIP 服务的高可用。

1)每台redis server分别有主,从两个配置文件(redis_master.conf,redis_slave.conf),通过启动脚本启动服务,启动脚本会检测这个redis集群中的其他服务器的角色,如果有master 服务存在,则以slave角色启动,否则将自己以master服务器启动;

2) keepalived 监控脚本,定时(频率:每秒一次)检测当前服务器是否获取集群VIP,如果获取集群VIP,则将本服务器上的redis服务器设置为master。同时将远端的其他redis服务器设置为slave;保证获取集群VIP的redis 服务器角色为master,其他的设置为slave。

3) keepalived 监控脚本,还会自动检测当前redis服务器是否正常,如果连续两次检测异常,则停掉本本机的keepalived服务,释放集群VIP,让去漂移到其他可以提供redis 服务的服务器上;

4)当 Master 与 Slave 均运作正常时,Master负责服务,Slave负责同步数据;当 Master 挂掉,Slave 正常时,Slave接管服务,同时关闭主从复制功能;当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。然后依次循环。

实施步骤:

----创建专用用户

useradd -g develop redisadmin    echo Hisun@1125|passwd --stdin redisadmin

说明:以下部署过程都是在root(或具备sudo权限的账号)账户下进行。

----安装配置redis

1.下载redis源码

cd

wget 

2.安装redis

tar -zxvf redis-2.8.3.tar.gz

cd redis-2.8.3

#reds的安装可以不用执行configure

make

#测试

make test

####在速度较慢的机器上执行make test可能出现下列错误,无影响

#*** [err]: Test replication partial resync: no backlog in tests/integration/replication-psync.tcl

3.配置redis

#创建redis主目录

mkdir -p /usr/local/redis-2.8.3/{bin,conf,logs}

cp -a -R -p src/redis-server /usr/local/redis-2.8.3/bin/

cp -a -R -p src/redis-cli /usr/local/redis-2.8.3/bin/

cp -a -R -p src/redis-benchmark /usr/local/redis-2.8.3/bin/

cp -a -R -p src/redis-sentinel /usr/local/redis-2.8.3/bin/

cp -a -R -p src/redis-check-dump /usr/local/redis-2.8.3/bin/

cp -a -R -p src/redis-check-aof /usr/local/redis-2.8.3/bin/

#创建redis启动脚本

vi /usr/local/redis-2.8.3/redis-start.sh

####以下为master上的配置,slave上的配置只需要修改对应的LOCALIP和REMOTEIP即可。

#!/bin/bash
REDISPATH=/usr/local/redis-2.8.3
REDISCLI=$REDISPATH/bin/redis-cli
LOGFILE=$REDISPATH/logs/redis-state.log
LOCALIP=192.168.1.218
REMOTEIP=192.168.1.219

REMOTEREDISROLE=$REDISCLI -h $REMOTEIP info | grep "<span>role</span>"
if grep "role:master" <<< $REMOTEREDISROLE ; then

start as slave

    $REDISPATH/bin/redis-server $REDISPATH/conf/redis_slave.conf<span>if</span> [ "<span>$?</span>" == "<span>0</span>" ];then
            echo "<span>[INFO]`date +%F/%H:%M:%S` :$LOCALIP start as slave successful.</span>" >> $LOGFILE<span>else</span>echo "<span>[ERROR]`date +%F/%H:%M:%S` :$LOCALIP start as slave error.</span>" >> $LOGFILE
    fi

else#start as master
$REDISPATH/bin/redis-server $REDISPATH/conf/redis_master.confif [ "$?" == "0" ];then
echo "[INFO]date +%F/%H:%M:%S :$LOCALIP start as master successful." >> $LOGFILEelseecho "[ERROR]date +%F/%H:%M:%S :$LOCALIP start as master error." >> $LOGFILE
fi
fi

#!/bin/bash
REDISPATH=/usr/local/redis-2.8.3
LOGFILE=$REDISPATH/logs/redis-state.log
kill -9 `ps -ef|grep '/bin/redis-server'|grep -v grep|awk  '{print $2}'`
if [ "$?" == "0" ];then
        echo "[INFO]`date +%F/%H:%M:%S` :redis shutdown completed!" >> $LOGFILE
elseecho "[ERROR]`date +%F/%H:%M:%S` :redis is not started." >> $LOGFILE
fi
#创建redis配置文件
####192.168.1.218主服务器redis_master.conf对应配置项######
#daemonize no
daemonize yes
#bind 127.0.0.1
bind 192.168.1.218
logfile "/usr/local/redis-2.8.3/logs/redis.log"
#其他配置依据实际生产环境修改
########################################################
####192.168.1.219从服务器redis_master.conf对应配置项######
#daemonize no
daemonize yes
#bind 127.0.0.1
bind 192.168.1.219
logfile "/usr/local/redis-2.8.3/logs/redis.log"
#其他配置依据实际生产环境修改
########################################################
#修改redis_slave.conf对应配置项:
####192.168.1.218主服务器redis_slave.conf对应配置项#######
#daemonize no
daemonize yes
#bind 127.0.0.1
bind 192.168.1.218
logfile "/usr/local/redis-2.8.3/logs/redis.log"
# slaveof  
slaveof 192.168.1.219 6379
#其他配置依据实际生产环境修改
########################################################
####192.168.1.219从服务器redis_slave.conf对应配置项#######
#daemonize no
daemonize yes
#bind 127.0.0.1
bind 192.168.1.219
logfile "/usr/local/redis-2.8.3/logs/redis.log"
# slaveof  
slaveof 192.168.1.218 6379
#其他配置依据实际生产环境修改
########################################################

#修改redis的属主和权限

在Master和Slave上创建监控Redis的脚本   mkdir /usr/local/keepalived/etc/keepalived/scripts   vi /usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh

####以下为master上的配置,slave上的配置只需要修改对应的LOCALIP和REMOTEIP即可。

#!/bin/bash
REDISPATH=/usr/local/redis-2.8.3
REDISCLI=$REDISPATH/bin/redis-cli
LOGFILE=$REDISPATH/logs/redis-state.log
LOCALIP=192.168.1.218
REMOTEIP=192.168.1.219
VIP=192.168.1.220

VIPALIVE=ip a | grep "<span>$VIP</span>"
if [ "$VIPALIVE" == "" ]; then
echo "[info]:"date" keepalived server is pengding or stop" >> $LOGFILE
else
echo "bbb" >> $LOGFILE

check local service is running

<span>if</span> [ "<span>`$REDISCLI –h $LOCALIP –p 6379 PING`</span>" == "<span>PONG</span>" ]; then
    # check local redis server role.
    REDISROLE=`$REDISCLI info | grep "<span>role</span>"`
    <span>if</span> grep "<span>role:slave</span>" <<< $REDISROLE ; then
        #change local redis server as master 
        echo "<span>[info1]:</span>"`date`"<span> Run SLAVEOF NO ONE cmd ...</span>" >> $LOGFILE
        $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&amp;1

        #change remoting redis server as slave
        REMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "<span>role</span>"`
        <span>if</span> grep "<span>role:master</span>" <<< $REMOTEREDISROLE ; then
            echo "<span>[info2]:</span>"`date`"<span> Run remote server SLAVEOF cmd ...</span>" >> $LOGFILE
            $REDISCLI -h $REMOTEIP SLAVEOF $LOCALIP 6379 >> $LOGFILE  2>&amp;1
        fi
    <span>else</span>
        REMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "<span>role</span>"`
        <span>if</span> grep "<span>role:master</span>" <<< $REMOTEREDISROLE ; then
            echo "<span>[info3]:</span>"`date`"<span> Run remote server SLAVEOF cmd ...</span>" >> $LOGFILE
            $REDISCLI -h $REMOTEIP SLAVEOF $LOCALIP 6379 >> $LOGFILE  2>&amp;1
        fi
    fi  
<span>else</span>
    echo "<span>[warn]:</span>"`date`"<span>  redis server($LOCALIP) is not health...</span>" >> $LOGFILE
    sleep 1
    <span>if</span> [ "<span>`$REDISCLI –h $LOCALIP –p 6379 PING`</span>" != "<span>PONG</span>" ]; then
        echo "<span>[error]:</span>"`date`"<span>  redis server($LOCALIP) will be stop...</span>" >> $LOGFILE
        service keepalived stop
    fi
fi

fi

重要:将相应的配置文件放到相应的地方.

#首先在2台服务器上设置keepalived的启动文件:

cp -a -R -p /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived

chmod 750 /etc/rc.d/init.d/keepalived

chown root /etc/rc.d/init.d/keepalived #然后在2台服务器上创建配置文件的链接:

mkdir /etc/keepalived/

ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

系统测试

注意:一定要先启动redis,再启动keealived,否则redis_check.sh会将keepalived自动关闭。

脚本创建完成以后,我们开始按照如下流程进行测试:   1.启动Master上的Redis   /usr/local/redis-2.8.3/redis-start.sh

#关闭时,直接杀死进程或执行以下脚本

/usr/local/redis-2.8.3/redis-stop.sh

2.启动Slave上的Redis   /usr/local/redis-2.8.3/redis-start.sh

#关闭时,直接杀死进程或执行以下脚本

#/usr/local/redis-2.8.3/redis-stop.sh

3.启动Master上的Keepalived   /etc/rc.d/init.d/keepalived start

#关闭方法

#/etc/rc.d/init.d/keepalived stop

4.启动Slave上的Keepalived   /etc/rc.d/init.d/keepalived start

#关闭方法

#/etc/rc.d/init.d/keepalived stop

继续优化中,未完结。

相关文章

文章浏览阅读1.3k次。在 Redis 中,键(Keys)是非常重要的概...
文章浏览阅读3.3k次,点赞44次,收藏88次。本篇是对单节点的...
文章浏览阅读8.4k次,点赞8次,收藏18次。Spring Boot 整合R...
文章浏览阅读978次,点赞25次,收藏21次。在Centos上安装Red...
文章浏览阅读1.2k次,点赞21次,收藏22次。Docker-Compose部...
文章浏览阅读2.2k次,点赞59次,收藏38次。合理的JedisPool资...