暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis哨兵集群中哨兵挂了,主从库还能切换吗?

码农架构 2020-12-02
592

实际上,一旦多个实例组成了哨兵集群,即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。


1
基于 pub/sub 机制的哨兵集群组成

哨兵之间的相互发现

哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布 订阅机制。

  • 哨兵将自己的连接信息 (ip, port) 发布到主库上, 其它哨兵订阅

  • 自己编写的应用程序也可以通过 Redis 进行消息的发布和订阅

  • Redis 会以频道的形式,对这些消息进行分门别类的管理

所谓的频道,实际上就是消息的类别。当消息类别相同时,它们就属于同一个频道。反之,就属于不同的频道。只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。


在主从集群中,主库上有一个名为“__sentinel__:hello”的频道,不同哨兵就是通过它来相互发现,实现互相通信的。

哨兵除了彼此之间建立起连接形成集群外,还需要和从库建立连接。这是因为,在哨兵的监控任务中,它需要对主从库都进行心跳判断,而且在主从库切换完成后,它还需要通知从库,让它们和新主库进行同步。

哨兵如何发现从库 ip, port

这是由哨兵向主库发送 INFO 命令来完成的。

哨兵也和客户端连接:

  • 主从库切换后,客户端也需要知道新主库的连接信息,才能向新主库发送请求操作。所以,哨兵还需要完成把新主库的信息告诉客户端这个任务。

  • 实际使用哨兵时要求,客户端能够获取到哨兵集群在监控、选主、切换这个过程中发生的各种事件。


2
基于pub/sub机制的客户端事件通知

从本质上说,哨兵就是一个运行在特定模式下的 Redis 实例,只不过它并不服务请求操作,只是完成监控、选主和通知的任务。所以,每个哨兵实例也提供 pub/sub 机制,客户端可以从哨兵订阅消息。哨兵提供的消息订阅频道有很多,不同频道包含了主从库切换过程中的不同关键事件。

让客户端从哨兵这里订阅消息:

  • 客户端读取哨兵的配置文件后,可以获得哨兵的地址和端口,和哨兵建立网络连

  • 在客户端执行订阅命令,来获取不同的事件消息

// 订阅“所有实例进入客观下线状态的事件”:
SUBSCRIBE
+odown

// 订阅所有的事件
PSUBSCRIBE
*
文章转载自码农架构,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论