redis客户端是如何连接哨兵集群的(sentinel客户端方式)

redis客户端是如何连接哨兵集群的

前言

在这篇文章中我们介绍了redis主从和哨兵集群的搭建,但是又引出一个问题,我们客户端该如何接入我们这个redis集群呢?有人会说这有什么难的,已经知道了主节点的ip地址和端口,用对应编程语言的客户端连接主节点不就可以了吗?但试想一下,如果这样使用客户端,客户端连接Redis Sentinel和主从复制的Redis又有什么区别呢,如果主节点挂掉了,虽然Redis Sentinel可以完成故障转移,但是客户端无法获取这个变化,那么使用Redis Sentinel的意义就不大了,所以各个语言的客户端需要对Redis Sentinel进行显式的支持

如何连接?

这里1和2只是假设的情况,为了方便大家理解.其实根本没这么用的.

1.只连接当前的master (不可取)

当master通过哨兵故障转移时master_ip会改变,这样代码无法连接新的master

2.连接一个哨兵 (不可取)

不考虑其他外在问题,只连接一个哨兵那么哨兵集群的意义就失效了.如果这个哨兵挂了,还是无法提供服务

3.连接哨兵集群(推荐)

通过在代码中定义sentinel集群集合以及master Name ,通过ping sentinel集群中的节点进行健康检查(ping),如果sentinel节点发生了故障转移,能够及时发现,连接活跃的sentinel节点继续对外提供服务

redis-sentinel客户端

Sentinel节点集合具备了监控、通知、自动故障转移、配置提供者若干功能,也就是说实际上最了解主节点信息的就是Sentinel节点集合,而各个主节点可以通过<master-name>进行标识的,所以,无论是哪种编程语言的客户端,如果需要正确地连接Redis Sentinel,必须有Sentinel节点集合和masterName两个参数

redis-sentinel客户端实现原理

1.配置redis-sentinel节点集合,并且遍历每个节点获取一个可用sentinel节点进行连接,如图9-22所示

2.通过sentinel get-master-addr-by-name master-name 这个api获取对应主节点相关信息,如如9-23所示

3.验证当前获取的主节点是否是真正的主节点,防止sentinnel故障转移导致主节点变化.如图9-24所示.

4.master节点发生变化,sentinel是感知的(所有的故障发现、转移是由sentinel做的);
sentinel怎么通知client的呢?
内部是一个发布订阅的模式,client订阅sentinel的某一个频道,该频道里由谁是master的信息,假如由变化sentinel就在频道里publish一条消息,client订阅就可以获取到信息,通过新的master信息进行连接 .如图9-25所示.

redis客户端整体原理图

参考链接https://blog.csdn.net/holdbelief/article/details/79791162

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...