手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Redis高可用方案之Sentinel原理解析

[日期:2017-08-20] 来源:Linux社区  作者:Linux [字体: ]

很多网站都使用Redis作为自己的缓存系统,网站要做到高可用,它使用的缓存系统自然也必须支持高可用,这里就介绍一下redis的高可用方案Sentinel。

Sentinel是Redis官方提供的一种高可用方案(除了Sentinel,Redis Cluster是另一种方案),它可以自动监控Redis master/slave的运行状态,如果发现master无法访问了,就会启动failover把其中一台可以访问的slave切换为master,并且通过pub/sub事件通知Redis客户端新的master的ip地址。

支持Sentinel的Redis客户端(例如Java得Jedis)会在连接Redis服务器的时候向Sentinel询问master的ip,并且会在收到master切换的pub/sub事件后自动重新连接到新的master。对调用Redis客户端的业务系统来说,这些都是完全透明的。

下图是redis sentinel的部署和运行机制
这里写图片描述
下图是master宕机后,failover的发起流程
这里写图片描述


现在我们来实战一下,我们的例子中有3台server,3个sentinel,1个master和2个slave。由于我们只有3台server,所以每个sentinel和一个master或者slave放在一个server上。采用的部署结构如下图所示
这里写图片描述

  • 配置master(redis.conf):

requirepass 123456 #设置master的密码

masterauth 123456 #设置slave连接master进行同步时使用的密码(虽然当前是master不需要密码,但是当master挂了以后再重启以后,这个时候可能failover已经完成了,master会自动被降级为slave)

  • 分别配置slave1和slave2(redis.conf):

slaveof 172.17.138.94 6379 #指定slave1和slave2的master

requirepass 123456 #设置slave的密码

masterauth 123456 #设置slave连接master进行同步时使用的密码

  • 分别配置sentinel1,sentinel2,sentinel3(sentinel.conf):

sentinel monitor mymaster 172.17.138.94 6379 2 #指定sentinel监控的master(组id为mymaster,当前master ip为172.17.138.94,端口6379,最后的2指定quorum的值,表明如果有2个sentinels无法连接master,才认为master挂了),slave不用指定,sentinel会通过pub/sub机制自动发现所有slave

sentinel auth-pass mymaster 123456 #设置sentinel连接的master和slave的密码(只能设置一个密码,所以master和slaves的密码必须相同)

  • 启动master和slave1,slave2:

分别ssh到master,slave1,slave2,运行redis-server redis.conf &

  • 查看master-slave分布情况,redis-cli info Replication

master应该看到类似下图信息
这里写图片描述
slave1和slave2应该看到类似下图信息
这里写图片描述

  • 启动sentinel1,sentinel2,sentinel3:

分别ssh到每个sentinel,运行redis-sentinel sentinel.conf &

  • 通过sentinel查看master,slave的情况

分别ssh到每个sentinel,运行redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

将能看到当前的master的ip地址,redis客户端(jedis)就是通过这个命令来获知应该连接到哪个redis服务器的,如下图
这里写图片描述

  • 现在我们来演示failover,我们先把master关了来模拟master宕机了

这里写图片描述

这时候查看sentinel的日志,当有2台(达到quorum)sentinel发现master无法访问后,sentinels进行投票,自动把master切换为slave2(172.17.138.92)

这里写图片描述

现在再询问sentinel当前master的地址,发现master已经变成了slave2(172.17.138.92)。

这里写图片描述

而且当挂掉的master重新启动后,它将被自动配置成新master的slave。

如果你这时查看redis.conf和sentinel.conf,你会发现它们的内容已经自动修改成172.17.138.92作为master相对应的配置了,也就是说sentinel的failover是永久性的,下次重启所有redis和sentinels的时候还是有效。

总结:sentinel是一种有效的高可用方案,不过如果你是通过切片(sharding/partition)的可扩展方式使用Redis的话,目前好像还没有成熟的sentinel和切片集成使用的方法。如果你需要同时拥有高可用和可扩展的Redis方案的话,不妨考虑一下Redis3新推出的Redis Cluster方案,或者第三方的Twemproxy,Codis。

下面关于Redis的文章您也可能喜欢,不妨参考下:

Ubuntu 14.04下Redis安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm

CentOS 7下Redis的安装与配置 http://www.linuxidc.com/Linux/2017-02/140363.htm

Ubuntu 14.04安装Redis与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm

Ubuntu 16.04环境中安装PHP7.0 Redis扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Redis 单机&集群离线安装部署 http://www.linuxidc.com/Linux/2017-03/141403.htm

CentOS 7.0 安装Redis 3.2.1详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm

Ubuntu 16.04环境中安装PHP7.0 Redis扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Ubuntu 15.10下Redis集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm

Redis实战 中文PDF http://www.linuxidc.com/Linux/2016-04/129932.htm

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-08/146381.htm

linux
相关资讯       Redis Sentinel  Redis高可用 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款