Redis+Keepalived高可用方案详细分析

上一篇简单的了解了一下Redis官方自带的HA方案sentinel(见  ),试用发现还是不错的,但是由于还没有合并进稳定分支中,所以在生产环境也不敢使用,还有一个就是需求还暂时不能完全满足,所以就尝试一下redis+keepalived方案,毕竟keepalived现在还是很稳定的,而且资料也充足。

实验环境

Ubuntu 12.04  10.20.112.26 默认的master

10.20.112.27 默认的slave

VIP          10.20.112.29

redis-server 2.6.16

keepalived默认只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但我们更关注的是机器上运行的业务,如果业务出问题了VIP没有变化,整体来说还是失败的。这时候就需要根据业务进程的运行状态决定是否需要进行主备切换。还好keepalived提供了这样一个自定义脚本监控功能,不过该参数设置在官方默认的文档中并没有出现。

其实文档中有两个我们常用的参数都没有提到:

1 vrrp_script && track_script

vrrp_script代码块是用来定义监控脚本,脚本执行时间间隔以及脚本的执行结果导致优先级变更幅度的。

vrrp_script chk_redis {
    script "/etc/keepalived/scripts/redis_check.sh"  #指定执行脚本的路径
    interval 1                                      #指定脚本的执行时间间隔
    weight 10                                        #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
}

定义好vrrp_script代码块之后,就可以在instance中使用了

track_script {
    chk_redis
}

注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别

2 notify_stop

keepalived停止运行前运行notify_stop指定的脚本。

配合官方文档提到的以下三个参数一起使用,功能更强大:

notify_master  keepalived切换到master时执行的脚本 

notify_backup  keepalived切换到backup时执行的脚本 

notify_fault  keepalived出现故障时执行的脚本

3 还有个问题需要注意

当master down了,backup接管了,master再次起来,不能再成为master。否则master恢复了再接管的话,会造成业务来回切换,这时候就需要nopreempt参数了。

nopreempt:设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须别另外的高。

先来看看方案的整体思路:

通过keepalived的自定义脚本功能监控本机的redis服务状态,当监控脚本检测到redis服务出现异常时,则改变本机keepalived的优先级,同时这会导致master/backup角色的变化,而keepalived在角色变化时也会触发一些机制执行相关脚本,这就为我们改变redis的master/slave状态提供了机会,这样做的目的是为了是redis的master/slave直接的数据保持一致。

在keepalived+redis的使用过程中有四种情况:

1 一种是keepalived挂了,同时redis也挂了,这样的话直接VIP飘走之后,是不需要进行redis数据同步的,因为redis挂了,你也无法去master上同步,不过会损失已经写在master上却还没同步到slave上面的这部分数据。

2 另一种是keepalived挂了,redis没挂,这时候VIP飘走后,redis的master/slave还是老的对应关系,如果不变化的话会把数据写入redis slave中,从而不会同步到master上去,这就要借助监控脚本反转redis的master/slave关系。这时候就要预留一点时间进行数据同步,然后反转master/slave。

3 还有一种是keepalived没挂,redis挂了,这时候根据监控脚本会检测到redis挂了,并且降低keepalived master的优先级,同样会导致VIP飘走,情况和第二种一样,也是需要进行数据同步,然后反转当前redis的master/slave关系的。

4 随后一种是keepalived没挂,redis也没挂,大吉大利啊,什么都不用操作。

本文的实验环境四种情况都适合,第一种是不需要同步数据的,脚本会默认去同步数据,但是其实是不会成功的。脚本主要是用来处理第二和第三种情况的。

Redis 的详细介绍请点这里
Redis 的下载地址请点这里

推荐阅读:

Redis集群明细文档

Ubuntu 12.10下安装Redis(图文详解)+ Jedis连接Redis

Redis系列-安装部署维护篇

CentOS 6.3安装Redis

Redis配置文件redis.conf 详解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/927f71cfe41b8c9231d6bf96610640a9.html