当然也也有网友给出Redis高可用性之Failover过渡方案 ,看了这篇文章里面的思路结合我们现有的情况尝试做一个简单的Failover方案。
1:两台Redis写服务器,是在Redis_Master(192.168.1.10)、Redis_Slave(192.168.1.11)上绑定HAproxy的vip 192.168.1.100,四台Redis读服务器,是在Slave1、Slave2、Slave3、Slave4上绑定HAproxy的vip 192.168.1.101;
2:Redis_Master和Redis_Slave是以Master-Slave的方式启动(配置在config文件里),然后给Redis_Master发送slaveof命令(必须的配置文件里设置主从的形式,然后再用命令),指定其为Redis_Slave的Slave,这样以来Redis_Master和Redis_Slave可以实现双向同步,这是避免写单点的核心。
3:启动监控脚本对两个Redis服务进行扫描,如果Redis_Master挂掉,监控脚本对在线的Redis_Slave发送slaveof NO ONE命令,设置其为临时的Master,同时由于Redis_Master服务器挂掉,vip 192.168.1.100自动转移至TempMaster,不影响应用程序对Redis的写操作。此时应用程序新产生的数据都保存到Redis_Slave上,当然原来的只读服务器会出现短暂的数据不一致。此时再通过命令启动Redis_Master,配置文件里是作为Redis_Slave的从的方式启动。
本地测试监控脚本如下,Redis_Master和Redis_Slave挂了都可以用下面的脚本,如果是Redis_Slave挂了不用这个判断failoverProcess进程:
#!/bin/sh
#监测Redis服务
masterProcess=`ps -ef|grep '/etc/redis.conf'|grep -v grep|wc -l` #以主的方式启动的配置文件
failoverProcess=`ps -ef|grep '/etc/redis_failover.conf'|grep -v grep|wc -l` #以从的方式启动的配置文件
if [ $masterProcess -eq 0 -a $failoverProcess -eq 0 ];then
datetime=`date '+%Y%m%d%H:%M:%S'`
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6380 slaveof NO ONE #将该Slave变为TempMaster
mv /data/redisdb/dump.rdb /data/redisdb/$datetime".dump.rdb" #原来的数据备份
/usr/local/bin/redis-server /etc/redis_failover.conf #使用另一个配置文件以从的方式启动,这样能自动同步最新数据
sleep 2
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 slaveof NO ONE #变回以前的主
sleep 2
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6380 slaveof 127.0.0.1 6379 #还原以前的主从
sleep 2
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 slaveof 127.0.0.1 6380 #实现双向同步
else
echo "process is ok!"
fi
4:Master和Slave下的4台从服务器如果任意一台挂掉了重启即可,数据将会自动从slaveof的机器同步;
以上只是一个思路,个人感觉要根据实际情况而定,无非是要解决单点和数据一致性的问题,用双写或多些的方式同样能做。