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

Redis Sentinel 详解

Redis Sentinel 详解

1. 什么是 Redis Sentinel?有什么用?

Redis Sentinel(哨兵) 是 Redis 官方提供的高可用性解决方案,主要用于监控、通知和自动故障转移。当 Redis 主节点(master)发生故障时,Sentinel 能够自动选举新的 master,并通知客户端以保证 Redis 集群的高可用性。

Redis Sentinel 主要提供以下功能:

  1. 监控(Monitoring): 定期检查 Redis 主从(master-slave)实例的可用性。
  2. 通知(Notification): 当某个实例出现故障时,Sentinel 会向系统管理员或其他应用程序发送通知。
  3. 自动故障转移(Automatic Failover): 发现主节点不可用后,自动从从节点(slave)中选举新的 master,并让其他 slave 重新复制新的 master。
  4. 配置管理(Configuration Provider): 客户端可以连接 Sentinel,获取当前可用的 Redis master 地址,减少手动维护的复杂度。

2. Sentinel 如何检测节点是否下线?

Sentinel 通过定期发送 PING 命令检测 Redis 节点的状态:

  • 如果某个 Redis 节点长时间没有响应 PING(超时),Sentinel 认为它可能下线,并标记为主观下线(Subjectively Down,简称 SDOWN)
  • 如果多个 Sentinel 对该节点都判断为主观下线,并且达成一致意见,Sentinel 便标记其为客观下线(Objectively Down,简称 ODOWN),然后进行故障转移。
检测机制

Sentinel 通过 sentinel.conf 配置文件中的 down-after-milliseconds 参数设置超时时间。例如:

sentinel down-after-milliseconds mymaster 5000

表示 Sentinel 如果 5 秒内未收到 PONG 响应,就认为该节点主观下线(SDOWN)


3. 主观下线(SDOWN)与客观下线(ODOWN)的区别

  • 主观下线(SDOWN,Subjectively Down)
    • 单个 Sentinel 认为某个 Redis 节点不可用,仅基于自己 PING 的响应情况得出结论。
    • 由于网络问题,可能是 Sentinel 误判,因此不会立即触发故障转移。
  • 客观下线(ODOWN,Objectively Down)
    • 需要多个 Sentinel 经过投票一致认为某个 Redis 节点确实不可用,才会标记其为 ODOWN。
    • 只有当 Sentinel 认定 master 为 ODOWN 后,才会触发故障转移。

4. Sentinel 是如何实现故障转移的?

当 Sentinel 发现 Redis 主节点 ODOWN 后,故障转移(failover)流程如下:

  1. 选举新的 master
    • Sentinel 选出一个可用的 slave 作为新的 master。
    • 其他 slave 重新配置,开始同步新的 master。
  2. 更新 Sentinel 配置
    • Sentinel 更新集群配置,并通知其他 Sentinel、客户端新的 master 地址。
  3. 通知客户端
    • 客户端可以从 Sentinel 处获取新的 master 地址,继续正常工作。

5. 为什么建议部署多个 Sentinel 节点(哨兵集群)?

部署多个 Sentinel 主要是为了提高可靠性,避免单点故障,并增强故障转移的准确性:

  1. 避免单点故障:单个 Sentinel 可能宕机,导致无法监测 Redis 状态,因此需要多个 Sentinel 互相监控。
  2. 提高判断准确性:多个 Sentinel 通过投票机制决定 master 是否真的 ODOWN,避免误判(如网络抖动)。
  3. 支持故障转移:Sentinel 需要多个节点达成共识后才能执行 failover,以保证一致性。

一般建议至少部署 3 个 Sentinel,以保证投票机制能够生效。


6. Sentinel 如何选择出新的 master(选举机制)?

当 Redis master 被判定 ODOWN 后,Sentinel 需要从 slave 里选出新的 master,遵循以下原则:

  1. 优先级(Priority):优先选择 slave-priority 值最低的从节点(值越小,优先级越高)。
  2. 复制进度(Replication Offset):如果多个 slave 的优先级相同,则选择数据同步最完整(复制偏移量最大的)slave。
  3. 运行时长(Run ID):如果前两个条件仍然无法区分,Sentinel 选择 runid 字典序最小的 slave。
  4. 可用性:确保 slave 可用,并且能够成功被转换为 master。

一旦选出新的 master,Sentinel 会执行 SLAVEOF NO ONE 命令,将其转换为 master,并让其他 slave 重新同步该 master。


7. 如何从 Sentinel 集群中选择出 Leader?

当多个 Sentinel 发现 master ODOWN 后,需要选举一个 Sentinel 作为Leader,负责执行故障转移。Leader 选举流程如下:

  1. Sentinel 通过 Raft 算法类似的 Leader 选举机制 进行投票:
    • 每个 Sentinel 都可以提议自己为 Leader
    • 其他 Sentinel 如果尚未投票,可能会投票给它。
    • 如果某个 Sentinel 获得超过一半的投票,它就被选为 Leader。
  2. Leader 负责执行故障转移
    • 选举出新的 master,并通知其他 Sentinel 进行更新。

如果 Leader 在 failover 过程中宕机,其他 Sentinel 会重新选举新的 Leader,继续执行 failover。


8. Sentinel 可以防止脑裂(Split-Brain)吗?

部分情况下,Sentinel 机制可以缓解脑裂问题,但无法完全避免。例如:

  1. 避免单机多主(Multiple Masters)
    • Sentinel 通过投票机制,确保只有一个 master 存在,防止多个 Sentinel 误判后产生多个 master。
  2. 可能的脑裂场景
    • 如果 master 因网络分区短暂失联,Sentinel 可能会选出新的 master,但原 master 仍在运行,导致出现两个 master(脑裂)。
    • 解决方案:
      • 采用 min-slaves-to-writemin-slaves-max-lag 配置,确保 master 只有在足够多 slave 连接时才允许写入。
      • 使用 Redis Cluster,避免 Sentinel 方案中的潜在脑裂问题。

总结

问题关键点
Sentinel 作用监控 Redis 状态,通知变更,执行故障转移
主观下线 vs 客观下线SDOWN 由单个 Sentinel 认定,ODOWN 需要多个 Sentinel 认定
故障转移流程发现 ODOWN → 选出新的 master → 更新配置并通知客户端
Sentinel 集群优势避免单点故障,提高可靠性,确保故障转移准确性
新 master 选举机制slave-priority、复制进度、运行时间长短等进行筛选
Sentinel Leader 选举采用 Raft 类似算法,得票最多的 Sentinel 负责 failover
是否防止脑裂只能缓解,不能完全避免,推荐 Redis Cluster 方案

如果你的 Redis 需要高可用性,Sentinel 是一个不错的选择,但要谨慎处理脑裂问题网络分区情况。

拓展阅读

1. 什么是网络分区(Network Partition)?

网络分区(Network Partition) 指的是 由于网络故障,导致集群中部分节点之间无法通信。网络分区不会直接让节点宕机,而是让它们变成孤立的“孤岛”,互相无法感知对方的状态。

在 Redis Sentinel 方案中,网络分区可能导致:

  • Sentinel 误判 master 失联,触发故障转移(但原 master 仍然运行)。
  • 多个 Sentinel 彼此之间无法沟通,导致 split-brain(脑裂)问题。

2. 什么是脑裂(Split-Brain)?

脑裂(Split-Brain) 指的是由于网络分区,导致多个 master 节点并存,这会引发数据不一致、数据丢失等严重问题。

场景示例:

  1. 网络分区发生
    • Redis 主节点(master)与大部分 Sentinel 失去联系(但仍然存活)。
    • 这时,Sentinel 误认为 master 已宕机,触发故障转移,选举新的 master。
  2. 原 master 继续提供服务
    • 由于原 master 仍然存活,客户端可能仍然在写入它的数据,而新的 master 也在接受写入。
    • 这样,就会产生两个 master,各自接受不同的数据。
  3. 网络恢复后
    • 原 master 重新连接 Sentinel,但 Sentinel 发现新的 master 已经存在。
    • 由于两个 master 的数据不同,Redis 无法自动合并数据,可能导致部分数据丢失。

3. 脑裂发生后如何解决?

脑裂发生后,通常需要手动干预来恢复一致性。常见的解决方案包括:

方法 1:配置 slave 强制下线(min-slaves-to-write & min-slaves-max-lag)

在 Redis 主从架构中,可以通过 min-slaves-to-writemin-slaves-max-lag 参数确保 master 只在有足够 slave 存活时才允许写入:

min-slaves-to-write 1
min-slaves-max-lag 10
  • 作用:如果 master 发现自己没有足够的 slave,或者 slave 的同步滞后超过 10 秒,它就会拒绝写入。
  • 效果:如果 master 因网络分区变成孤立节点,它将自动进入只读模式,避免脑裂。

方法 2:手动干预

如果脑裂已经发生,可以执行以下步骤:

  1. 检测当前集群状态

    • 运行 INFO replication 查看 master 和 slave 角色。
    • 运行 SENTINEL master <master-name> 检查 Sentinel 认为的 master 是谁。
  2. 强制废弃旧 master

    • 如果原 master 变成了孤立的 master(split-brain 发生),可以执行:

      redis-cli -h old-master -p 6379 SLAVEOF new-master-host new-master-port
      
    • 这样,原 master 重新作为 slave,从新 master 同步数据。


方法 3:使用 Redis Cluster

Redis Sentinel 主要解决的是“高可用性”问题,但无法彻底解决脑裂问题
Redis Cluster 采用了Gossip 协议数据分片机制,能够更好地防止脑裂:

  • 多数派写入(Quorum Writes):只有当大多数节点存活时,Redis Cluster 才允许写入。
  • 自动数据迁移:当某个 master 失联后,集群会选举新的 master,并重新分配数据。

因此,对于分布式环境(多数据中心),Redis Cluster 比 Sentinel 更能避免脑裂问题


4. 总结

问题解决方案
网络分区导致的误判通过 down-after-milliseconds 设置合理的 Sentinel 宕机超时时间
防止脑裂通过 min-slaves-to-write & min-slaves-max-lag 限制 master 行为
脑裂已发生重新配置旧 master 为新 master 的 slave,并让它重新同步数据
最佳方案采用 Redis Cluster,利用多数派选举防止 split-brain

Redis Sentinel 适用于小型架构,但如果要保证高可用性和一致性,Redis Cluster 更可靠。

Redis Sentinel 使用场景?

Redis Sentinel 仅适用于主从(Master-Slave)模式,不能用于 Redis Cluster。它的主要目的是监控主从架构中的 master 和 slave,自动进行故障转移(failover),保证高可用性。


Sentinel 适用的 Redis 部署模式

主从(Master-Slave)模式

  • 主节点(master)负责读写,多个从节点(slave)负责读取并复制主节点数据。
  • Sentinel 负责监控 master 是否存活,并在故障时将某个 slave 选举为新的 master

哨兵模式(Sentinel Cluster)

  • 多个 Sentinel 组成哨兵集群,监控 Redis 主从实例,通过投票决定故障转移。

Sentinel 不能用于哪些场景?

Redis Cluster(分片集群模式)

  • Redis Cluster 本身已经支持高可用,采用数据分片和 Gossip 协议,不需要 Sentinel。
  • 在 Redis Cluster 中,节点间通过投票机制进行主节点选举,而 Sentinel 不能管理 Cluster。

单机 Redis

  • 没有 slave 的情况下,Sentinel 无法执行故障转移,它的主要作用是监控主从结构。
  • 如果只有一个 Redis 实例(单点),可以考虑使用 Keepalived + VIP 来做高可用

如何选择 Sentinel 还是 Redis Cluster?
特性Redis Sentinel(主从模式)Redis Cluster(分片模式)
数据分片❌ 不支持✅ 支持
自动故障转移✅ 由 Sentinel 负责✅ 由 Cluster 本身负责
客户端连接方式需通过 Sentinel 获取 master直接连接 Redis Cluster
适用于场景读多写少,单机难以承受压力高并发、大数据量、分片存储
数据一致性只保证主从一致性,不防止脑裂采用多数派选举,防止脑裂

结论
  • 如果你使用 Redis 主从模式 并希望实现高可用性,那么 Sentinel 是一个不错的选择
  • 如果你希望数据分片、扩展性更强,并且 不想依赖外部高可用组件,应该选择 Redis Cluster

简单理解
小型业务,主从读多写少 → 用 Sentinel
高并发、大规模数据 → 用 Redis Cluster

相关文章:

Redis Sentinel 详解

Redis Sentinel 详解 1. 什么是 Redis Sentinel&#xff1f;有什么用&#xff1f; Redis Sentinel&#xff08;哨兵&#xff09; 是 Redis 官方提供的高可用性解决方案&#xff0c;主要用于监控、通知和自动故障转移。当 Redis 主节点&#xff08;master&#xff09;发生故障…...

器件功耗模型原理

器件功耗模型原理 谷歌提供了一套通用的器件耗电模型和配置方案&#xff0c;先对器件进行耗电因子拆解&#xff0c;建立器件功耗模型&#xff0c;得到一个器件耗电的计算公式。通过运行时统计器件的使用数据&#xff0c;代入功耗模型&#xff0c;就可以计算出器件的功耗。例如…...

拥抱成长型思维:解锁持续进步的人生密码

我强烈推荐4本可以改变命运的经典著作&#xff1a; 《寿康宝鉴》在线阅读白话文《欲海回狂》在线阅读白话文《阴律无情》在线阅读白话文《了凡四训》在线阅读白话文 一、什么是成长型思维&#xff1f; 成长型思维&#xff08;Growth Mindset&#xff09;由斯坦福大学心理学家卡…...

Ubuntu上查看GPU使用情况并释放内存

先用nvidia-smi查看GPU当前使用情况 再用fuser 命令查找对应显卡上占用 GPU 的进程 最后查到了用kill -9强制杀掉进程&#xff08;PID&#xff09;即可...

解决思科交换机无法访问局域网外设备

问题背景 有时&#xff0c;我们需要远程连接来管理一台思科交换机&#xff0c;例如使用SSH协议。然而交换机运作在链路层&#xff0c;这就需要交换机有一个网络层地址&#xff0c;来接纳基于IP协议的远程访问请求。于是&#xff0c;我们依靠设置一个带有IP地址的交换机虚拟接口…...

Unity Shader编程】之透明物体渲染

以下是针对您提出的关于 Unity Shader 渲染 Pass 的查看方法、多个 Pass 的影响、Pass 的含义&#xff0c;以及 Unity 渲染物体的流程和处理多个透明/半透明/不透明物体的详细解答。 1. Unity Shader 渲染 Pass 的查看方法 查看 Pass 的方法 通过 Shader 代码&#xff1a; 打开…...

fopen和open 等区别是什么?文件描述符与文件描述指针区别

FILE *fp fopen(path, "w"); int fd open(path,) 1.区别 函数定义所属库返回类型fopen高级文件操作函数&#xff0c;提供缓冲机制标准 C 库 (stdio.h)FILE*&#xff08;文件指针&#xff09;open低级文件操作函数&#xff0c;直接调用系统接口Unix/Linux 系统调用…...

什么是张量计算

以下是对张量计算的详细介绍&#xff0c;结合数学、物理学及计算机科学等多领域视角&#xff1a; 一、张量的基本定义与性质 1. 张量的数学定义 张量是向量空间及其对偶空间的笛卡尔积上的多重线性映射&#xff0c;可视为多维数组或几何对象。其核心特征在于&#xff1a; 坐…...

【1】Java 零基础入门学习(小白专用)

【1】Java 零基础入门学习 &#x1f4da;博客主页&#xff1a;代码探秘者 ✨专栏&#xff1a;《JavaSe从入门到精通》 其他更新ing… ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;作者水…...

[c语言日寄]枚举类型

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

替代-UX设计师

初创公司如何在没有设计师的情况下 打造实用的用户体验 一个常见的捷径是使用预构建的组件库&#xff0c;如谷歌的 Material UI它们为你提供了构建块&#xff0c;但它们并没有为你考虑整个用户流程你仍然需要弄清楚所有这些是如何组合在一起的但是&#xff0c;很多时候&#x…...

【氧化镓】​​​​掺杂在β-Ga2O3材料中引入的深能级缺陷

1. 引言 1.1 β-Ga2O3材料的特性与应用前景 β-Ga2O3作为一种新型的宽禁带半导体材料,具有约4.6-4.8 eV的宽带隙、高击穿场强(约8 MV/cm)和优异的热稳定性,适用于高功率和射频电子器件。其独特的物理特性使其在高电压、高频率以及高功率应用场景中具有巨大的潜力。例如,…...

:ref 和 this.$refs 的区别及 $ 的作用

:ref 在 Vue 模板中&#xff0c;:ref 这种写法是使用了 Vue 的动态绑定语法&#xff08;: 是 v-bind: 的缩写&#xff09;。ref 是一个特殊的属性&#xff0c;用于给元素或组件注册引用信息。当你使用 :ref 时&#xff0c;通常是在动态地为元素或组件设置引用名称&#xff0c;…...

分库分表后,跨库查询和分布式事务解决方案

分库分表主要是为了解决单库单表的性能瓶颈,但拆分后数据分散在不同库和表中,这就导致了跨库查询和分布式事务的问题。 以下是实际项目中应对这些问题的核心策略与技术实现: 一、跨库查询解决方案 1. 全局表(广播表) 适用场景:基础数据表(如地区表、配置表)数据量小且…...

仅靠prompt,Agent难以自救

Alexander的观点很明确&#xff1a;未来 AI 智能体的发展方向还得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。还拿目前很火的 Manus 作为案例&#xff1a;他认为像 Manus 这样基于「预先编排好的提示词与工具路径」构成的工作流智能体&#xff0c;…...

android初学

Intent直译意图 显式意图&#xff1a;构造函数&#xff08;实参为两个&#xff09; (当前类对象 this&#xff0c;要跳转的.javaclass文件)&#xff0c; 隐式意图&#xff1a;构造方法实参(填写一个)(需要在清单文件配置)系统自动匹配 点击事件: 注册设置点击监听器的常用三…...

IDEA修改默认作者名称

User: IDEA提示注释缺少author信息&#xff0c;但自动设置后&#xff0c;名称不是我想要的默认名称&#xff0c;应该如何修改IDEA里默认的作者名称&#xff1f; Kimi: 以下是几种修改IntelliJ IDEA中默认作者名称的方法&#xff1a; ### 方法一&#xff1a;修改File and Code …...

Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!

一、引言&#xff1a;自动化测试的“瓶颈”与MCP的革新 传统自动化测试依赖开发者手动编写脚本&#xff0c;不仅耗时且容易因页面动态变化失效。例如&#xff0c;一个简单的登录流程可能需要开发者手动定位元素、处理等待逻辑&#xff0c;甚至反复调试超时问题。而MCP&#xf…...

lodash 学习笔记/使用心得

lodash 学习笔记/使用心得 简单记一下 lodash 的一点学习笔记使用心得&#xff0c;最近也是打算清理一下所有的 dead code&#xff0c;然后发现我们用了好多的 lodash 方法。对比了之前的写法&#xff0c;重新看了一下官方文档&#xff0c;再自己重新动手写了点 util 之后发现…...

计算机操作系统(五) 前趋图和程序执行与进程的描述(附带图谱表格更好对比理解))

计算机操作系统&#xff08;五&#xff09; 前趋图和程序执行与进程的描述 前言一、前趋图和程序执行1.1前趋图1.2程序的顺序执行1.3程序的并发执行 二、进程的描述2.1进程的定义与特征2.2进程的基本状态与转换2.3挂起的操作系统和进程的转换2.4进程管理中的数据结构 总结&…...

“统计视角看世界”专栏阅读引导

根据文章主题和逻辑关系&#xff0c;我为您设计以下阅读引导方案&#xff1a; #mermaid-svg-xOnE2zTW20jz5myv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xOnE2zTW20jz5myv .error-icon{fill:#552222;}#mermaid…...

C/C++静态库的理解和制作

1.什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是⼀种可执行代码的二进制形式&#xff0c;可以被操作系统…...

【redis】主从复制:单点问题、配置详解、特点详解

文章目录 单点问题什么是主从复制主从模式能解决的问题并发量有限可用性问题 配置建立复制通过配置文件来指定端口配置主从查看集群结构 断开复制 特点安全性只读传输延迟 单点问题 分布式系统中&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 某个服务器程序&…...

OpenCV HighGUI 模块使用指南(Python 版)

用户让我编写一个 HighGUI 模块的使用指南&#xff0c;包括函数的使用和应用场景的实现。首先&#xff0c;我需要回顾 HighGUI 模块的主要功能&#xff1a;图像显示、视频捕获、鼠标和键盘事件。然后&#xff0c;按照用户提供的结构&#xff0c;整理每个部分的函数详解、代码示…...

PyTorch 面试题及参考答案(精选100道)

PyTorch 的动态计算图与 TensorFlow 的静态计算图有何区别&#xff1f;动态图的优势是什么&#xff1f; PyTorch 的动态计算图和 TensorFlow 的静态计算图在构建方式、灵活性和调试难度等方面存在显著区别。 在构建方式上&#xff0c;TensorFlow 的静态计算图需要先定义好整个…...

android......

事件源&#xff0c;就是视图对象&#xff0c;先注册一个监听器&#xff0c;等待用户触发了屏幕&#xff0c;一旦触发会立即产生一个事件源&#xff0c;事件源会生成一个用户点击的触发事件&#xff0c;此刻监听器会立马监听到 &#xff0c;然后监听器调用回调方法 UI理解 全称用…...

常见中间件漏洞(tomcat)

CVE-2017-12615 当在Tomcat的conf&#xff08;配置目录下&#xff09;/web.xml配置文件中添加readonly设置为false时&#xff0c;将导致该漏洞产生&#xff0c;&#xff08;需要允许put请求&#xff09; , 攻击者可以利用PUT方法通过精心构造的数据包向存在漏洞的服务器里面上传…...

计算机网络高频(二)TCP/IP基础

计算机网络高频(二)TCP/IP基础 1.什么是TCP/IP⭐⭐ TCP/IP是一种网络通信协议,它是互联网中最常用的协议之一。TCP/IP有两个基本的协议:TCP(传输控制协议)和IP(互联网协议)。 TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议。它负…...

国际护士节知识竞赛主持稿串词

在这充满火热激情的季节&#xff0c;我们又迎来了5.12国际护士节。让我们首先向辛勤奋战在护理工作一线的全县广大护士姐妹们道一声: (男)让我们再一次以热烈的掌声欢迎他们:预祝各参赛代表队在护理知识竞赛中赛出风格&#xff0c;赛出水平&#xff0c;取得满意的成绩。 (女)…...

Elasticsearch:可配置的推理 API 端点分块设置

作者&#xff1a;来自 Elastic Daniel Rubinstein Elasticsearch 开放推理 API 现已支持可配置的分块&#xff0c;以便在文档摄取时处理语义文本字段。 Elasticsearch 推理 API 允许用户利用各种提供商的机器学习模型执行推理操作。其中一个常见用例是在索引中支持用于语义搜索…...