Redis 哨兵模式
Redis高可用之哨兵
在Redis主从集群部署时,从库宕机,客户端仍然可以向主库或者其他从库发起请求;但当主库宕机时,Redis便无法提供写服务了。这个时候就需要一套机制来保障在主库宕机后,主从集群仍然可以正常提供服务,Redis的解决方案为哨兵模式。
哨兵是一个特殊的Redis进程,只是以哨兵模式启动,负责的任务为:
- 监控主库是否真的下线
- 如果主库下线,执行主从库切换,选择一个从库作为新的主库
- 通知从库、哨兵、客户端主从库切换信息
主库是否下线
哨兵进程每秒会使用Ping命令检测与主从库之间的网络连接,用来判断实例的状态。当发现响应超时时(可配置)会将其标记为下线状态,如果为从库,没有影响;当如果为主库的话,必须对其进行进一步检查确认。因为可能是哨兵自身网络问题而导致的响应延迟,单个哨兵是无法确认的。
哨兵集群就是为解决这个问题而生的,当一个哨兵标记主库为下线后,会与其他哨兵交换信息,如果过半的哨兵都觉得主库下线,那么立刻启动主从库切换。
主从切换
在确定要切换后,如果有多个从库的话,需要对从库进行筛选打分,将得分最高的作为新的主库。筛选条件为,从库未下线且网络状况良好。通过配置项down-after-millseconds * 10,如果之前主从库之间断连超过十次,我们可以认为从库网络状态不好。打分依据有两个方面:
- 通过slave-priority 给从库设定优先级,分最高者为新主库,若存在相同分,进入第二轮打分。
- 和旧主库同步程度最接近的从库得分高,通过从库slave_repl_offset可知,若存在相同分,进入第三轮。
- 选择RunId最小的从库作为主库。
通知
在进行主从切换后,还需要将主库信息发送给从库,从库执行replicaof 命令与新主库建立同步连接。除此之外,还需要将主从切换信息发送给客户端程序,让它们完成相应的读写切换。在整个过程中,从库和哨兵的redis.conf会被更新为最新的主从配置。
哨兵集群
在配置哨兵的信息时,我们只需要用到下面的这个配置项,设置主库的 IP 和端口,并没有配置其他哨兵的连接信息。
sentinel monitor <master-name> <ip> <redis-port> <quorum>
并没有配置其余哨兵的IP信息等,但却能组成哨兵集群。其中机制为每个哨兵都会与主库创建连接,然后在主库发布自己的哨兵信息并订阅其余哨兵发布的信息,这样子哨兵之间便能知道彼此的IP和端口信息。这个机制借助于Redis** pub/sub发布订阅**机制,主库上的 _sentinel_:hello
便是哨兵之间交流的频道。
从库发现
在配置哨兵时,只配置了主库信息,没有从库配置,哨兵是如何知道从库地址的呢?其中为 哨兵会向主库发送Info命令,主库收到后返回从库列表,然后哨兵再与从库建立连接。
客户端事件通知
每个哨兵实例都能提供pub/sub机制,客户端可以从哨兵处订阅消息,从而得知主从切换过程和结果。常见事件为
注意点
每个哨兵的配置应保持一致,避免配置不一,导致哨兵之间无法形成共识而无法进行主从切换。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)