当前位置: 首页 > article >正文

Redis- 哨兵

哨兵模式

  • 哨兵模式
    • 什么是哨兵模式
      • 本质与定位
      • 工作原理的深层理解
      • 个人感悟
    • 哨兵集群需要部署多少个节点比较合适
    • 请详细描述哨兵是如何检测主节点故障并完成故障转移的整个过程
    • 哨兵之间是如何通信的?它们如何发现和监控Redis实例
    • 什么是脑裂,为什么会有脑裂,如何解决
      • 脑裂产生的原因
      • 脑裂的危害
      • 脑裂的解决方案
        • 哨兵配置层面
        • Redis主节点配置层面
    • 哨兵模式优缺点有哪些?

哨兵模式

什么是哨兵模式

Redis哨兵(Sentinel)是我认为Redis生态系统中最优雅的设计之一,它通过一种分布式监控和决策机制解决了Redis高可用性的核心问题。
它主要提供四个核心功能:
首先,它负责监控整个Redis主从集群的运行状态,实时检测主从节点是否正常工作。
其次,当发现问题时,哨兵会通知系统管理员或其他应用程序,便于及时处理。
第三,也是最关键的功能,哨兵提供自动故障转移。当主节点不可用时,哨兵会自动选择一个从节点升级为新的主节点,确保服务持续可用。
最后,哨兵作为配置提供者,客户端可以通过连接哨兵来获取当前主节点的地址,无需硬编码,也提高了系统弹性。

本质与定位

从本质上看,哨兵是一个分布式的状态监控和自动故障处理系统。它不存储数据,而是专注于监控Redis实例的健康状态并在必要时采取行动。我理解哨兵的核心价值在于将人工运维转变为自动化运维,将故障恢复时间从分钟级缩短到秒级。
它在Redis架构的定位是高可用保障层,它与主从复制机制协同工作,前者负责故障检测和恢复,后者负责数据冗余和读写分离。

工作原理的深层理解

哨兵的工作原理体现了分布式系统设计的精髓:

  • 共识机制
    用类似Raft的共识算法,通过多数派投票机制确保在网络分区等复杂情况下做出正确决策。这种设计避免了"脑裂"问题,保证了系统的一致性。
    我认为这反映了分布式系统中的CAP理论权衡——在分区容忍性§和一致性©之间取得平衡。

  • 自组织能力
    哨兵集群能够自动发现彼此并维护集群拓扑视图,这种自组织能力大大降低了运维复杂度。
    我特别欣赏这种设计,它体现了"自治系统"的理念,系统能够自我管理、自我修复。

  • 状态机转换
    哨兵将节点状态和故障转移过程抽象为明确的状态转换,如主观下线→客观下线→故障转移。
    这种状态机设计使复杂流程变得清晰可控,也便于故障分析和问题定位。

个人感悟

学习这个哨兵的时候感觉到一句话就是"简单胜于复杂",它的设计理念和使用方式都相对简单并且直观,它通过精心设计的监控、决策和执行机制,一方面解决了Redis高可用的核心问题,同时保持了使用和维护的相对简单性,感觉Redis作者水平确实是很厉害.

哨兵集群需要部署多少个节点比较合适

"Redis哨兵集群建议至少部署3个节点,且总数保持奇数,如3、5、7个节点。这样设计主要基于以下考虑:
首先,哨兵采用多数派投票机制确认主节点故障,至少需要超过半数哨兵达成一致才能触发故障转移。3个节点时,需要2个哨兵同意;5个节点时,需要3个哨兵同意。
其次,奇数个节点可以避免平票情况,提高决策效率,同时在相同容错能力下节省资源。例如,3个节点和4个节点都只能容忍1个节点故障,但3个节点更经济。

请详细描述哨兵是如何检测主节点故障并完成故障转移的整个过程

Redis哨兵的故障检测和转移是一个多阶段过程,我可以从四个关键阶段详细说明:

  • 第一阶段是主观下线检测。每个哨兵独立地通过PING命令监控Redis节点,如果在配置的down-after-milliseconds时间内(通常是30秒)没有收到有效回复,该哨兵会将节点标记为主观下线(SDOWN)。这是单个哨兵的判断,不会触发故障转移。
  • 第二阶段是客观下线确认。当一个哨兵发现主节点主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨兵的意见。只有当达到配置的quorum数量的哨兵都认为主节点下线时,才会将状态升级为客观下线(ODOWN)。例如,在5个哨兵、quorum为3的配置中,需要至少3个哨兵同意才能确认客观下线。
  • 第三阶段是领导者选举。确认客观下线后,哨兵们需要选出一个领导者来执行故障转移。这个过程使用了类似Raft的算法:每个哨兵都有一个随机超时时间,超时后请求其他哨兵投票。第一个获得多数派(N/2+1)投票的哨兵成为领导者。这确保了同一时间只有一个哨兵执行故障转移。
  • 最后是故障转移执行阶段。领导者哨兵会从从节点中选择一个升级为新主节点,选择标准依次是:
    • 排除断线、主观下线、5秒内没有回复过哨兵INFO命令的从节点
    • 选择slave-priority(从节点优先级)最高的
    • 如果优先级相同,选择复制偏移量最大的(数据最完整)
    • 如果仍然相同,选择runid最小的从节点
      选定后,领导者通过SLAVEOF NO ONE命令将其升级为主节点,然后通过SLAVEOF命令重新配置其他从节点指向新主节点,最后更新哨兵的监控配置。

哨兵之间是如何通信的?它们如何发现和监控Redis实例

"Redis哨兵之间的通信主要通过Redis的发布/订阅机制实现,具体来说是通过__sentinel__:hello频道。每个哨兵都会定期(通常是2秒一次)在这个频道上发布自己的信息,同时也订阅这个频道来接收其他哨兵的信息。
发布的信息包括哨兵自身的IP、端口、运行ID(runid),以及它所监控的主节点信息,包括主节点的名称、地址、端口和配置版本号等。这种机制使得哨兵集群能够自动发现彼此,无需手动配置所有哨兵节点的连接信息。
关于Redis实例的发现和监控,哨兵采用了一种自动发现机制:
首先,我们只需在哨兵配置中指定主节点的信息。哨兵连接到主节点后,会通过INFO命令获取所有从节点的信息,从而自动发现整个主从架构。
其次,哨兵会定期(默认10秒一次)向每个被监控的Redis实例发送INFO命令,获取实例的角色(主/从)、复制状态、从节点列表等信息,从而持续监控整个集群的状态变化。
最后,哨兵还会通过PING命令检测实例的可达性,并通过发布/订阅机制与其他哨兵交换信息,形成对集群状态的共识。

什么是脑裂,为什么会有脑裂,如何解决

Redis脑裂是指在主从架构中,由于网络分区等原因导致哨兵集群分裂成多个独立部分,各自做出不同决策,最终造成同时存在多个主节点的现象。这种情况会导致数据写入冲突和不一致,是分布式系统中的一个典型挑战。

脑裂产生的原因

脑裂主要由三类因素导致:
首先是网络问题,如网络分区、交换机故障或防火墙配置变更;
其次是性能问题,如主节点负载过高导致响应超时;
最后是配置不当,如哨兵的down-after-milliseconds设置过短或quorum值不合理。

脑裂的危害

脑裂的危害非常严重。最直接的是数据不一致,不同客户端可能连接到不同的’主节点’进行写入,当网络恢复后,这些写入无法合并。
其次是可能导致数据丢失,因为最终只有一个节点会被认定为真正的主节点。
此外,还会造成资源浪费和业务混乱。

脑裂的解决方案

哨兵配置层面
  • quorum值是判断主节点是否故障所需的最少哨兵数量.
  • down-after-milliseconds是哨兵判断节点不可用的时间阈值.
Redis主节点配置层面
  • min-slaves-to-write指定主节点必须能够连接到的最小从节点数量,才能接受写入请求。
  • min-slaves-max-lag指定从节点的最大允许延迟秒数。

这两个参数组合使用,形成了一道防护墙:当网络分区发生时,与大多数从节点失去连接的主节点会自动停止接受写入,避免了脑裂后的数据冲突。

哨兵模式优缺点有哪些?

哨兵的好处在于可以保证系统的高可用,各个节点可以对故障自动转移.
缺点是使用的主从模式,主节点单点风险高,主从切换过程可能出现丢失风险.


http://www.kler.cn/a/580422.html

相关文章:

  • 荣耀手机如何编辑图片?编辑图片技巧、软件分享
  • 笔记:代码随想录算法训练营day39:LeetCode 198.打家劫舍,213.打家劫舍II,337.打家劫舍III
  • 动态ip和静态ip适用于哪个场景?有何区别
  • 算法精讲 | 树(二):BFS层序遍历の魔法——像水波纹一样扫描整棵树
  • 逐梦DBA:解决Linux下MySQL远程登录报错
  • 4.桥接模式
  • 机器学习 Day01人工智能概述
  • Tomcat下载安装及日志乱码问题解决
  • 上位机知识篇---Linux特殊功能文件
  • 极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图
  • 27. Harmonyos Next仿uv-ui 组件NumberBox 步进器组件禁用状态
  • Docker save命令怎么用
  • Flutter开发避坑指南:高频问题排查与性能调优实战
  • 如何在需求分析阶段考虑未来扩展性
  • ⭐LeetCode周赛 Q1. 找出最大的几近缺失整数——模拟⭐
  • [Python爬虫系列]bilibili
  • 斐波拉契数列
  • Microsof Visual Studio Code 安装教程(中文设置)
  • RabbitMQ使用延迟消息
  • 6-langchang多模态输入和自定义输出