设为首页 收藏本站
查看: 872|回复: 0

[经验分享] Redis双机热备方案--转

[复制链接]

尚未签到

发表于 2015-7-20 10:29:18 | 显示全部楼层 |阅读模式
  http://luyx30.blog.iyunv.com/1029851/1350832
  参考资料:
  
  http://patrick-tang.blogspot.com/2012/06/redis-keepalived-failover-system.html
  http://deidara.blog.iyunv.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"  $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  
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的属主和权限


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"  $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"  $LOGFILE
$REDISCLI -h $REMOTEIP SLAVEOF $LOCALIP 6379 >> $LOGFILE  2>&1
fi
else
REMOTEREDISROLE=`$REDISCLI -h $REMOTEIP info | grep "role"`
if grep "role:master"  $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
  
  继续优化中,未完结。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88617-1-1.html 上篇帖子: 三 redis学习笔记之排序 下篇帖子: Redis常用命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表