http://luyx30.blog.51cto.com/1029851/1350832

参考资料:

http://patrick-tang.blogspot.com/2012/06/redis-keepalived-failover-system.html

http://deidara.blog.51cto.com/400447/302402

http://my.oschina.net/guol/blog/182491

http://shiguanghui.iteye.com/blog/2001499

背景

目前,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/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 "role"`
if grep "role:master" <<< $REMOTEREDISROLE ; then
#start as slave
$REDISPATH/bin/redis-server $REDISPATH/conf/redis_slave.confif [ "$?" == "0" ];then
echo "[INFO]`date +%F/%H:%M:%S` :$LOCALIP start as slave successful." >> $LOGFILEelseecho "[ERROR]`date +%F/%H:%M:%S` :$LOCALIP start as slave error." >> $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
#创建redis关闭脚本
vi /usr/local/redis-2.8.3/redis-stop.sh
####以下为master上的配置,slave上的配置相同。
#!/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配置文件
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 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 <masterip> <masterport>
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 <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.下载keepalived源码Release 1.2.9

注意:最新版为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/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 "$VIP"`
if [ "$VIPALIVE" == "" ]; then
echo "[info]:"`date`" keepalived server is pengding or stop" >> $LOGFILE
else
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
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

继续优化中,未完结。

Redis双机热备方案--转的更多相关文章

  1. 采用pacemaker+corosync实现postgresql双机热备、高可用方案

    环境说明 参照上章已完成postgresql流复制配置,并关闭postgres服务. su - postgres pg_ctl -D /data/postgresql/data/ stop -m fa ...

  2. 物联网架构成长之路(9)-双机热备Keepalived了解

    1. 前言 负载均衡LB,高可用HA,这一小结主要讲双机热备方案保证高可用.这里选择Keepalived作为双机热备方案,下面就对具体的配置进行了解.2. 下载Keepalived wget http ...

  3. Mysql双机热备--预备知识

    1.双机热备 对于双机热备这一概念,我搜索了很多资料,最后,还是按照大多数资料所讲分成广义与狭义两种意义来说. 从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务.当一台服务器 ...

  4. Docker:docker部署PXC-5.7.21(mysql5.7.21)集群搭建负载均衡实现双机热部署方案

    单节点数据库弊端 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 推荐Mysql集群部署方案 PXC (Percon ...

  5. 云数据库Redis版256M双机热备款

    云数据库Redis版是兼容Redis协议标准的.提供持久化的缓存式数据库服务,基于高可靠双机热备架构:全新推出的256M小规格款,适用于高QPS.小数据量业务,并支持免费全量迁移,完美服务于个人开发者 ...

  6. postgresql双机热备、高可用方案(采用pacemaker+corosync实现)

    http://blog.csdn.net/qguanri/article/details/51151974 需求描述 我们有两台centos7的数据库主机A.B.要对A.B实现双机热备,A作为数据库m ...

  7. mysql双机热备实现方案

    一.概念 1.热备份和备份的区别 热备份指的是:High Available(HA)即高可用,而备份指的是Backup,数据备份的一种.这是两种不同的概念,应对的产品也是两种功能上完全不同的产品.热备 ...

  8. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...

  9. 双机热备的Quartz集群

    sqlserver搭建高可用双机热备的Quartz集群部署[附源码]   一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz ...

随机推荐

  1. [Mac] 获取cpu信息

    [Mac] 获取cpu信息 命令行获取cpu信息 sysctl machdep.cpu output like machdep.cpu.tsc_ccc.denominator: 0 machdep.c ...

  2. Transaction And Lock--死锁错误号1205

    在TSQL中,如果需要判断当前错误是否是因为死锁引起,可以使用ERROR_NUMBER()=1205来判断在C#中,使用SQLException来捕获 SQLException.Number=1205 ...

  3. 用Docker自动构建纸壳CMS

    纸壳CMS可以运行在Docker上,接下来看看如何自动构建纸壳CMS的Docker Image.我们希望的是在代码提交到GitHub以后,容器镜像服务可以自动构建Docker Image,构建好以后, ...

  4. 纸壳CMS 2.3,正式加入商城功能

    纸壳CMS发布了2.3版本,主要是添加了商城功能,强化产品功能.让您的网站轻松实现电子商务. 有关2.3版本的更多信息,请查看以下链接: https://github.com/SeriaWei/ZKE ...

  5. sun.misc.Unsafe.park(Native Method)

    关闭tomcat时或者重启tomcat时 log4j2 报错: sun.misc.Unsafe.park(Native Method) 异常信息: 30-Aug-2018 15:59:34.900 S ...

  6. MongoDB高级知识

    MongoDB高级知识 一.mongodb适合场景: 1.读写分离:MongoDB服务采用三节点副本集的高可用架构,三个数据节点位于不同的物理服务器上,自动同步数据.Primary和Secondary ...

  7. hdu3089 Josephus again|快速约瑟夫环

    题目链接:戳我 貌似是高一昨天的考试题T2?????感觉挺好玩的就搞了搞qwqwq 其实是HDU上面的题啦.... 对于普通的约瑟夫问题,大概是n个人围成一个环,从1开始报数,数到k,那个人出队,最后 ...

  8. iOS通过dSYM文件分析crash

    重点是dwarfdump --uuid命令 我们在iOS开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应 ...

  9. navicat 导入txt到数据库

    一直都是建库 一条条添加数据 昨天碰上要导入一堆数据突然不知所措 查资料才弄好,先记录一下,以免忘记 这个是导入的数据名可以改 对导入数据表进行增删改 以上!

  10. 洛谷P4931 情侣?给我烧了!(加强版)(组合数学)

    题面 传送门 题解 首先我们算出刚好有\(k\)对情侣的方案数 从\(n\)对情侣中选出\(k\)对,方案数为\({n\choose k}\) 从\(n\)排座位中选出\(k\)排,方案数为\({n\ ...