Redis双机热备方案

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

背景  

目前,Redis集群的官方方案还处在开发测试中,未集成到稳定版中。且目前官方开发中的Redis Cluster提供的功能尚不完善(可参考官方网站或    http://www.redisdoc.com/en/latest/topic/cluster-spec.html    ),在生产环境中不推荐使用。通过调研发现市面上要实现采用单一的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    http://download.redis.io/releases/redis-2.8.3.tar.gz  

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/bashREDISPATH=/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 "role"`if grep "role:master" <<< $REMOTEREDISROLE ; then
        #start as slave
        $REDISPATH/bin/redis-server $REDISPATH/conf/redis_slave.conf        if [ "$?" == "0" ];then
                echo "[INFO]`date +%F/%H:%M:%S` :$LOCALIP start as slave successful." >> $LOGFILE
        else
                echo "[ERROR]`date +%F/%H:%M:%S` :$LOCALIP start as slave error." >> $LOGFILE
        fielse
        #start as master
        $REDISPATH/bin/redis-server $REDISPATH/conf/redis_master.conf        if [ "$?" == "0" ];then
                echo "[INFO]`date +%F/%H:%M:%S` :$LOCALIP start as master successful." >> $LOGFILE
        else
                echo "[ERROR]`date +%F/%H:%M:%S` :$LOCALIP start as master error." >> $LOGFILE
        fifi

     

#创建redis关闭脚本

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

####以下为master上的配置,slave上的配置相同。

#!/bin/bashREDISPATH=/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!" >> $LOGFILEelse
        echo "[ERROR]`date +%F/%H:%M:%S` :redis is not started." >> $LOGFILEfi

   

#创建redis配置文件

 

cp -a -R -p redis.conf /usr/local/redis-2.8.3/conf/redis_master.conf

cp -a -R -p redis.conf /usr/local/redis-2.8.3/conf/redis_slave.conf

#修改redis_master.conf对应配置项:

####192.168.1.218主服务器redis_master.conf对应配置项#######daemonize nodaemonize yes#bind 127.0.0.1bind 192.168.1.218logfile "/usr/local/redis-2.8.3/logs/redis.log"#其他配置依据实际生产环境修改############################################################192.168.1.219从服务器redis_master.conf对应配置项#######daemonize nodaemonize yes#bind 127.0.0.1bind 192.168.1.219logfile "/usr/local/redis-2.8.3/logs/redis.log"#其他配置依据实际生产环境修改########################################################

       

#修改redis_slave.conf对应配置项:    

####192.168.1.218主服务器redis_slave.conf对应配置项########daemonize nodaemonize yes#bind 127.0.0.1bind 192.168.1.218logfile "/usr/local/redis-2.8.3/logs/redis.log"# slaveof <masterip> <masterport>slaveof 192.168.1.219 6379#其他配置依据实际生产环境修改############################################################192.168.1.219从服务器redis_slave.conf对应配置项########daemonize nodaemonize yes#bind 127.0.0.1bind 192.168.1.219logfile "/usr/local/redis-2.8.3/logs/redis.log"# slaveof <masterip> <masterport>slaveof 192.168.1.218 6379#其他配置依据实际生产环境修改########################################################

     

#修改redis的属主和权限

chmod –R 750 /usr/local/redis-2.8.3/

chown –R redisadmin:develop /usr/local/redis-2.8.3/

----安装配置keepalived      
 

注意:最新版为1.2.10测试过程中出错.      
   wget    http://www.keepalived.org/software/keepalived-1.2.9.tar.gz    
   2.安装keepalived

需要安装以下依赖包: make gcc libpopt-dev libnl-dev libcurl4-openssl-dev popt openssl      
   cd

tar –zxvf keepalived-1.2.9.tar.gz

cd keepalived-1.2.9

./configure --prefix=/usr/local/keepalived

make && make install

3.配置keepalived

#在Master和Slave上创建如下配置文件(可根据实际情况调整):

mv  /usr/local/keepalived/etc/keepalived/keepalived.conf /usr/local/keepalived/etc/keepalived/keepalived.conf-bak    
   vim /usr/local/keepalived/etc/keepalived/keepalived.conf

vrrp_script chk_redis {
        script "/usr/local/keepalived/etc/keepalived/scripts/chk_redis.sh"   ###监控脚本
        interval 2                                        ###监控时间}
vrrp_instance VI_1 {
        state MASTER                            ###设置为MASTER
        interface eth3                          ###监控网卡,依据实际情况来定  
        virtual_router_id 51
        priority 101                            ###权重值
        advert_int 1 
        authentication {
                     auth_type PASS             ###加密
                     auth_pass redis            ###密码
        }
        track_script {
                chk_redis                       ###执行上面定义的chk_redis
        }
        virtual_ipaddress {             192.168.1.220                         ###VIP
        }
}

         

在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/bashREDISPATH=/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 "$VIP"`if [ "$VIPALIVE" == "" ]; then  echo "[info]:"`date`" keepalived server is pengding or stop" >> $LOGFILEelse  echo "bbb" >> $LOGFILE  #check local service is running  if [ "`$REDISCLI –h $LOCALIP –p 6379 PING`" == "PONG" ]; then    # check local redis server role.    REDISROLE=`$REDISCLI info | grep "role"`    if grep "role:slave" <<< $REDISROLE ; then      #change local redis server as master       echo "[info1]:"`date`" Run SLAVEOF NO ONE cmd ..." >> $LOGFILE      $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1      #change remoting redis server as slave      REMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "role"`      if grep "role:master" <<< $REMOTEREDISROLE ; then        echo "[info2]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE        $REDISCLI -h $REMOTEIP SLAVEOF $LOCALIP 6379 >> $LOGFILE  2>&1      fi    else      REMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "role"`      if grep "role:master" <<< $REMOTEREDISROLE ; then        echo "[info3]:"`date`" Run remote server SLAVEOF cmd ..." >> $LOGFILE        $REDISCLI -h $REMOTEIP SLAVEOF $LOCALIP 6379 >> $LOGFILE  2>&1      fi    fi	  else    echo "[warn]:"`date`"  redis server($LOCALIP) is not health..." >> $LOGFILE    sleep 1    if [ "`$REDISCLI –h $LOCALIP –p 6379 PING`" != "PONG" ]; then      echo "[error]:"`date`"  redis server($LOCALIP) will be stop..." >> $LOGFILE      service keepalived stop    fi  fifi

   

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

#首先在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




本文转自 msj0905 51CTO博客,原文链接:http://blog.51cto.com/sky66/1691732
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
14天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
15 2
|
3月前
|
监控 NoSQL Linux
【分布式】Redis的持久化方案解析
【1月更文挑战第25天】【分布式】Redis的持久化方案解析
|
17天前
|
缓存 运维 NoSQL
【Redis故障排查】「连接失败问题排查和解决」带你总体分析和整理Redis的问题故障实战开发指南及方案
【Redis故障排查】「连接失败问题排查和解决」带你总体分析和整理Redis的问题故障实战开发指南及方案
37 0
|
3月前
|
NoSQL Java 关系型数据库
处理Redis与MySQL数据不一致的Java定期巡检方案
处理Redis与MySQL数据不一致的Java定期巡检方案
27 0
|
3月前
|
缓存 NoSQL 算法
Redis 企业级数据备份方案
Redis 企业级数据备份方案
35 1
|
4月前
|
NoSQL 算法 Java
Redis实现分布式锁的几种方案
Redis实现分布式锁的几种方案
33 0
|
5月前
|
监控 NoSQL Redis
Redis监控方案
Redis监控方案
104 0
|
5月前
|
存储 移动开发 NoSQL
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案(下)
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案(下)
50 0
|
5月前
|
NoSQL Redis 数据安全/隐私保护
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案(上)
微服务轮子项目(29) -Redis 单机、主从复制、哨兵、cluster集群、持久化方案
47 0
|
5月前
|
NoSQL Java fastjson
Redis集群方案及实战(六)
Redis集群方案及实战