redis双机热备(伪Redis Cluster)

来源:互联网 发布:学解剖的软件 编辑:程序博客网 时间:2024/06/07 07:56

目前官方开发中的Redis Cluster提供的功能尚不完善(可参考官方网站或http://redis.io/topics/cluster-tutorial)

环境部署

环境介绍:
Master: 192.168.0.22 redis,keepalived
Slave: 192.168.0.23 redis,keepalived
Virtural IP Address (VIP): 192.168.0.88

设计思路:

两个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身份。然后依次循环。

实施步骤:

—-安装配置redis

1.下载redis源码
wget http://download.redis.io/releases/redis-3.0.2.tar.gz

2.安装redis
tar -zxvf redis-3.0.2.tar.gz
cd redis-3.0.2
redis的安装可以不用执行configure
make && make install

3.配置redis
特别注意:这里我们不使用redis官方提供的主从配置,只需要配置守护进程和日志就可以了,其他的默认!

#守护进程daemonize yes#日志文件路径logfile "/var/log/redis.log"

—-安装配置keepalived

1.下载keepalived源码Release 1.2.19
wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz

2.安装keepalived
tar –zxvf keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
./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

特别注意:在主从备份的集群中router_id需要保持一致!

! Configuration File for keepalivedglobal_defs {   router_id redis}vrrp_script chk_redis{     script /usr/local/keepalived/etc/keepalived/scripts/redis_check.sh     interval 2     timeout 2     fall 3}vrrp_instance redis {    state BACKUP #MASTER|BACKUP(这里主服务则是MASTER,备用服务则是BACKUP)    interface enp9s0f0    virtual_router_id 50    priority  100    advert_int 1        authentication {   #all node must same        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        192.168.0.88    }    track_script {         chk_redis    }    notify_master /usr/local/keepalived/etc/keepalived/scripts/redis_master.sh    notify_backup /usr/local/keepalived/etc/keepalived/scripts/redis_backup.sh    notify_fault /usr/local/keepalived/etc/keepalived/scripts/redis_fault.sh    notify_stop /usr/local/keepalived/etc/keepalived/scripts/redis_stop.sh}

编写需要的脚本:

mkdir /usr/local/keepalived/etc/keepalived/scripts/

vim /usr/local/keepalived/etc/keepalived/scripts/redis_check.sh
vim /usr/local/keepalived/etc/keepalived/scripts/redis_master.sh
vim /usr/local/keepalived/etc/keepalived/scripts/redis_backup.sh
vim /usr/local/keepalived/etc/keepalived/scripts/redis_fault.sh
vim /usr/local/keepalived/etc/keepalived/scripts/redis_stop.sh

完成之后一定要赋予他们的权限
chmod +x *.sh

具体的脚本内容如下:

redis_check.sh

#!/bin/bashREDISPATH=/usr/local/redis-3.0.2REDISCLI=$REDISPATH/bin/redis-cliIP=127.0.0.1PORT=6379ALIVE=`$REDISCLI -h $IP -p $PORT PING`LOGFILE="/var/log/keepalived-redis-check.log"echo "[CHECK]" >> $LOGFILEdate >> $LOGFILEif [ $ALIVE = "PONG" ]; then   echo "Success: redis-cli -h $IP -p $PORT PING $ALIVE" >> $LOGFILE 2>&1    exit 0else    echo "Failed: redis-cli -h $IP -p $PORT PING $ALIVE " >> $LOGFILE 2>&1    exit 1fi

redis_master.sh

#!/bin/bashREDISPATH=/usr/local/redis-3.0.2REDISCLI=$REDISPATH/bin/redis-cliLOCALIP=127.0.0.1#注意:如果是主服务的redis_master.sh,则这里的地址是从服务的ip地址;如果是从服务的redis_master.sh,则这里是主服务的ip地址REMOTEIP=192.168.0.23PORT=6379LOGFILE="/var/log/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE 2>&1echo "Run MASTER cmd ..." >> $LOGFILE 2>&1$REDISCLI -h $LOCALIP -p $PORT SLAVEOF $REMOTEIP $PORT >> $LOGFILEsleep 10 #delay 10 s wait data async cancel syncecho "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

redis_backup.sh

#!/bin/bashREDISPATH=/usr/local/redis-3.0.2REDISCLI=$REDISPATH/bin/redis-cli#注意:如果是主服务的redis_backup.sh,则这里的地址是从服务的ip地址;如果是从服务的redis_backup.sh,则这里是主服务的ip地址REMOTEIP=192.168.0.23PORT=6379LOGFILE="/var/log/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF $REMOTEIP $PORT >> $LOGFILE 2>&1# echo "Being slave...." >> $LOGFILE 2>&1sleep 15 #delay 15 s wait data sync exchange role

redis_fault.sh

#!/bin/bashLOGFILE=/var/log/keepalived-redis-state.logecho "[fault]" >> $LOGFILEdate >> $LOGFILE

redis_stop.sh

#!/bin/bashLOGFILE=/var/log/keepalived-redis-state.logecho "[stop]" >> $LOGFILEdate >> $LOGFILE

重要:将相应的配置文件放到相应的地方.
首先在2台服务器上设置keepalived的启动文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /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/Slave上的Redis   cd /home/redis/redis-3.0.2/src/./redis-server ../redis.conf2.关闭Master/Slave上的Redis这里我们直接使用kill命令来关闭3.启动Master上的Keepalived   /etc/rc.d/init.d/keepalived start#关闭方法#/etc/rc.d/init.d/keepalived stop4.启动Slave上的Keepalived   /etc/rc.d/init.d/keepalived start#关闭方法#/etc/rc.d/init.d/keepalived stop
0 0