首页 Redis教程Redis哨兵(Sentinel)

Redis高可用与集群

Redis Cluster集群架构原理

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

redis 哨兵(Sentinel)

redis 集群介绍

主从架构无法实现master和slave角色的自动切换,即当master出现redis服务异常、主机断电、磁盘损坏等问题导致master无法使用,而redis高可用无法实现自故障转移(将slave提升为master),需要手动改环境配置才能切换到slave redis服务器,另外也无法横向扩展Redis服务的并行写入性能,当单台Redis服务器性能无法满足业务写入需求的时候就必须需要一种方式解决以上的两个核心问题,即:1.master和slave角色的无缝切换,让业务无感知从而不影响业务使用 2.可以横向动态扩展Redis服务器,从而实现多台服务器并行写入以实现更高并发的目的。

Redis 集群实现方式:

  • 客户端分片
  • 代理分片
  • Redis Cluster
哨兵(Sentinel) 工作原理

Sentinel 进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现
Master和Slave服务器的切换,保证系统的高可用,其已经被集成在redis2.6+的版本中,Redis的哨兵模式到了2.8
版本之后就稳定了下来。一般在生产环境也建议使用Redis的2.8版本的以后版本。哨兵(Sentinel) 是一个分布式系
统,可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossip protocols)来接收关于Master
主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个
Slave作为新的Master。

每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已离线,也就是所谓的”主观认为宕机” ,主观是每个成员都具有的独自的而且可能相同也可能不同的意识,英文名称:Subjective Down,简称SDOWN。

有主观宕机,对应的就有客观宕机。当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN 的判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,客观是不依赖于某种意识而已经实际存在的一切事物,英文名称是:Objectively Down, 简称 ODOWN。

通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改相关配置,并开启故障转移(failover)。Sentinel 机制可以解决master和slave角色的自动切换问题,但单个Master 的性能瓶颈问题无法解决

实现哨兵
哨兵的准备

哨兵的前提是已经实现了一个redis master-slave的运行环境,从而实现一个一主两从基于哨兵的高可用redis架构

master服务器状态

配置slave1

配置slave2

编辑配置文件sentinel.conf

sentinel.conf的配置
哨兵可不和Redis服务器部署在一起,但一般部署在一起,所有redis节点使用相同的以下示例的配置文件

三个哨后服务器的配置都如下

启动哨兵

三台哨兵服务器都要启动

如果是编译安装执行下面类似操作

验证哨兵端口

查看哨兵日志

master的哨兵日志

slave的哨兵日志

当前sentinel状态

在sentinel状态中尤其是最后一行,涉及到masterIP是多少,有几个slave,有几个sentinels,必须是符合全部服
务器数量的。

停止Redis Master测试故障转移

查看各节点上哨兵信息:

故障转移时sentinel的信息:

故障转移后的redis配置文件会被自动修改

故障转移后redis.conf中的replicaof行的master IP会被修改,。

sentinel.conf中的sentinel monitor IP会被修改

当前reids状态

新的master 状态

另一个slave指向新的master

恢复故障的原master重新加入redis集群

在原master上观察状态

观察新master上状态和日志

应用程序如何连接redis

Redis 官方客户端:https://redis.io/clients

java 客户端连接Redis:https://github.com/xetorthio/jedis/blob/master/pom.xml

java客户端连接redis是通过Jedis来实现的,java代码用的时候只要创建Jedis对象就可以建多个Jedis连接池来连接
redis,应用程序再直接调用连接池即可连接Redis。
而Redis为了保障高可用,服务一般都是Sentinel部署方式,当Redis服务中的主服务挂掉之后,会仲裁出另外一台
Slaves服务充当Master。这个时候,我们的应用即使使用了Jedis 连接池,Master服务挂了,我们的应用将还是无法连
接新的Master服务,为了解决这个问题, Jedis也提供了相应的Sentinel实现,能够在Redis Sentinel主从切换时候,通
知我们的应用,把我们的应用连接到新的Master服务。
Redis Sentinel的使用也是十分简单的,只是在JedisPool中添加了Sentinel和MasterName参数,JRedis Sentinel底
层基于Redis订阅实现Redis主从服务的切换通知,当Reids发生主从切换时,Sentinel会发送通知主动通知Jedis进
行连接的切换,JedisSentinelPool在每次从连接池中获取链接对象的时候,都要对连接对象进行检测,如果此链接和
Sentinel的Master服务连接参数不一致,则会关闭此连接,重新获取新的Jedis连接对象。

本文链接:http://www.yunweipai.com/35526.html

Redis高可用与集群

Redis Cluster集群架构原理

网友评论comments

发表评论

电子邮件地址不会被公开。

暂无评论

Copyright © 2012-2020 YUNWEIPAI.COM - 运维派
扫二维码
扫二维码
返回顶部