【Redis】Sentinel哨兵

🛡️ 深入理解 Redis Sentinel:高可用架构的守护者

在实际开发中,我们常用 Redis 构建缓存系统或数据中间件。然而,主从复制虽然能实现数据同步,但无法自动故障转移(failover),这就意味着如果主节点宕机,必须手动介入切换,非常影响系统可用性。

为了解决这个问题,Redis 提供了专门的高可用组件 —— Redis Sentinel(哨兵)

本文将带你系统了解:

  • 为什么需要 Sentinel?
  • Sentinel 的工作机制与核心原理
  • 自动故障转移的流程
  • 如何配置 Sentinel 模式
  • Sentinel 的优缺点与实践建议

☁️ 一、为什么需要 Redis Sentinel?

我们知道,Redis 主从复制模式如下图:

       Master/   \Slave1  Slave2

在主从结构中:

  • 主节点(Master)负责写操作
  • 从节点(Slave)同步数据,负责读操作

但存在一个致命缺陷:

❗ 如果 Master 宕机,整个写服务就会瘫痪!主从无法自行切换主节点,只能人工干预。

因此,我们需要一种机制能够自动识别 Master 的故障,并切换角色 —— 这就是 Sentinel 的职责


🔧 二、什么是 Redis Sentinel?

Redis Sentinel(哨兵) 是 Redis 官方提供的分布式系统监控与故障转移组件,具备以下核心能力:

  1. 监控(Monitoring):持续监控主从节点是否在线;
  2. 通知(Notification):当某个节点出现问题时,通过 API 通知系统管理员或其他服务;
  3. 自动故障转移(Automatic Failover):当主节点宕机,自动从从节点中选举新的主节点;
  4. 服务发现(Configuration Provider):客户端可以通过 Sentinel 获取当前主节点地址。

⚙️ 三、Sentinel 的核心原理

Sentinel 是一组独立的进程,它们互相通信共同协作完成主节点的监控与切换

Sentinel 监控机制

每个 Sentinel 定期向主从节点发送 PING 命令:

  • 超过 down-after-milliseconds 时间未响应,会被标记为 主观下线(sdown)
  • 多个 Sentinel 一致认为某节点下线,称为 客观下线(odown)

🧱 四、Sentinel 的部署与配置

1️⃣ 启动 Redis 主从节点

# 启动主节点
redis-server ./redis.conf# 启动从节点(配置 replicaof)
redis-server --port 6380
redis-cli -p 6380 replicaof 127.0.0.1 6379

2️⃣ 创建 Sentinel 配置文件(sentinel.conf)

port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

解释:

  • mymaster:主节点名称(自定义)
  • 127.0.0.1 6379:主节点地址
  • 2:quorum,判定客观下线至少需要 2 个哨兵同意
  • down-after-milliseconds:节点无响应时间(ms)
  • failover-timeout:最大故障转移超时时间
  • parallel-syncs:故障转移时同时同步从节点的数量

3️⃣ 启动 Sentinel

redis-sentinel ./sentinel.conf

多个 sentinel 节点建议分布式部署(推荐奇数个,如 3 个或 5 个)


🔁 五、故障转移后客户端怎么处理?

故障转移后,客户端需要获取新主节点地址,否则继续访问旧主节点会失败。

✅ 方法一:使用 Sentinel 模式客户端

很多 Redis 客户端支持连接 Sentinel 节点,自动发现新的 Master,例如:

  • Jedis(Java)
  • Lettuce(Spring Data Redis)
  • StackExchange.Redis(.NET)

✅ 方法二:通过 Sentinel 命令查询主节点

redis-cli -p 26379
SENTINEL get-master-addr-by-name mymaster

返回新的主节点 IP 和端口,客户端可动态切换连接。


🧠 六、优缺点分析

优点缺点
自动监控、自动故障转移配置复杂,依赖哨兵自身稳定性
架构简单,不依赖第三方服务延迟仍然存在,不能强一致
客户端支持服务发现无法横向扩展,仍受限单主写

✅ 七、适用场景与实践建议

适用场景:

  • 中小型系统,高可用 Redis 方案
  • 需要主从自动切换,但不需要分片
  • 高性价比替代 Redis Cluster

建议:

  • Sentinel 节点部署在不同主机,避免单点失败;
  • quorum + 哨兵节点数应满足多数派;
  • 搭配 DNS + 代理等方式实现客户端透明切换;
  • 注意客户端的连接模式配置,避免连接旧主节点。

📚 总结

能力是否支持
主从自动同步✅ 主从复制实现
主节点宕机自动转移✅ Sentinel 实现
客户端服务发现✅ 通过哨兵查询
高可用读写分离✅ 从节点读,主节点写
分布式分片❌(需 Redis Cluster)

Redis Sentinel 是 Redis 官方推荐的高可用方案之一。对比 Redis Cluster 更加轻量,适合对数据量、分片要求不高但高可用需求强烈的中小型系统。


当然可以,下面是一篇围绕 Redis Sentinel(哨兵)实现原理 的技术博客,重点突出其核心工作机制:定时监控 → 主观下线 → 客观下线 → 领导者选举 → 故障转移,适合用于面试准备、团队分享、CSDN/掘金博客发布。


🛡️ Redis Sentinel 实现原理全解析:监控、判定、选举与故障转移

在 Redis 的高可用架构中,主从复制解决了读写分离和数据冗余问题,但却无法完成自动故障转移。这意味着,一旦主节点(Master)宕机,我们需要人工介入,将某个从节点(Slave)提升为主节点。

为了弥补这一缺陷,Redis 提供了一个独立的、强大的高可用组件 —— Redis Sentinel(哨兵),实现主从架构下的 自动监控、故障检测与主从切换

本篇博客将聚焦 Sentinel 的 实现原理,逐步剖析其核心机制:

定时监控 → 主观下线 → 客观下线 → 领导者选举 → 故障转移


☁️ 1. 为什么需要 Sentinel?

主从复制虽好,但当 Master 出现故障:

  • Slave 不会自动“上位”
  • 客户端依然连接旧 Master,访问失败
  • 需要人为手动切换主从、修改配置、通知客户端

🔧 这对系统可用性、容错性要求较高的场景,是不可接受的。

因此,我们需要一个机制来完成这些事情的自动化 —— Sentinel 哨兵系统应运而生。


⚙️ 2. Sentinel 实现原理总览

下面我们围绕 Sentinel 的核心四步展开详细讲解:

Sentinel 原理核心流程:定时监控↓
主观下线(sdown)↓
客观下线(odown)↓
选举领导者↓
执行故障转移

🔍 3. 定时监控:PING 检测健康状态

每个 Sentinel 节点都会以固定频率(默认 1 秒)向所有监控的 Redis 实例(包括主从和其他 Sentinel)发送 PING 命令。

  • 若某个节点在 down-after-milliseconds 时间内没有回复(默认 5 秒),
  • Sentinel 会将其标记为 主观下线(Subjectively Down, sdown)
sentinel down-after-milliseconds mymaster 5000

✅ 这一步是单哨兵的主观判断,并不代表真正的故障。


🚨 4. 主观下线 → 客观下线

如果一个节点被多个 Sentinel 同时标记为 sdown,并且达到配置的投票数量(quorum),则会升级为:

客观下线(Objectively Down, odown)

sentinel monitor mymaster 127.0.0.1 6379 2

以上配置中,表示至少两个 Sentinel 一致认为 mymaster 宕机,才认定为 odown

✅ 多哨兵一致达成共识,保证判断的可靠性,防止网络波动带来的误判。


🗳️ 5. 领导者选举(Leader Election)

一旦发生 odown,需要一个 Sentinel 作为Leader(领导者),负责协调主从切换。

采用的是 Redis 自带的Raft 类似的投票机制

  • 所有 Sentinel 参与选举,每个 Sentinel 只能投一票;
  • 第一个获得多数票的 Sentinel 成为 Leader;
  • 其他 Sentinel 退让,监听转移过程。
SENTINEL is-master-down-by-addr <ip> <port> <runid> <config-epoch>

该命令是 Sentinel 之间互相交换“票据”的基础。


🔁 6. 故障转移(Failover)

当 Leader Sentinel 被选出后,它开始执行核心任务 —— 自动故障转移

转移步骤如下:

  1. 从原主节点的从节点列表中挑选一个健康的从节点作为新主节点;
  2. 向选中的从节点发送 SLAVEOF NO ONE 指令,将其提升为主节点
  3. 通知其他从节点:执行 SLAVEOF <new-master-ip> <port>跟随新的主节点
  4. 更新自身和其他 Sentinel 的配置,如 epoch(配置版本号)、角色切换信息等。

🔔 Redis 的从节点可以快速接管主节点工作,且不会丢失大量数据(只会丢失少量未同步的写操作)。


📦 7. 一张图总结 Sentinel 原理

定时 PING 主节点
是否超时
标记为 sdown
询问其他 Sentinel
超过 quorum?
判定为 odown
发起领导者选举
Leader Sentinel 选出新主节点
下发 SLAVEOF 指令切换主从
更新配置并通知客户端

⚠️ 8. Sentinel 的局限与注意事项

问题描述应对方式
网络抖动误判下线误触发 failover合理设置 down-after 时间
配置不一致多个 Sentinel 配置不同步使用同一个 sentinel.conf 模板启动
客户端未自动切换老连接依然访问旧主使用支持 Sentinel 的客户端库
只支持单主架构无法分片可考虑 Redis Cluster 替代

✅ 9. 实践建议

  • 部署至少 3 个 Sentinel 实例,确保选举机制有效;
  • 将 Sentinel 与 Redis 节点部署在不同主机或容器中
  • 配置合理的 down-after-millisecondsquorum 值;
  • 使用 Redis 客户端支持 Sentinel 服务发现,如:Lettuce、Jedis、Redisson;
  • 可结合 Nginx、DNS、注册中心等实现透明故障切换

📚 总结

阶段说明
监控哨兵定时发送 PING,判断节点存活
主观下线单个 Sentinel 判断某节点不可用
客观下线多个 Sentinel 一致判断,形成共识
领导者选举多个 Sentinel 选出 Leader 协调切换
故障转移将从节点提升为新主节点,并通知其他节点

Redis Sentinel 是 Redis 高可用方案中的核心技术之一,它通过轻量级的组件设计和自动化的监控机制,让 Redis 从“单点架构”演化为“具备自我修复能力”的健壮系统。


🚦Redis Sentinel 中的主观下线与客观下线机制详解

在 Redis Sentinel 高可用机制中,“主观下线(sdown)”与“客观下线(odown)”是两个非常关键的概念,它们直接决定了 Sentinel 是否会对某个节点执行故障转移操作。

很多初学者容易混淆这两个术语,本文将结合实际机制、源码命令、以及时序过程,为你彻底讲清楚这两者的区别与配合原理


☁️ 什么是 Redis Sentinel?

Redis Sentinel 是 Redis 提供的一种高可用解决方案,具备:

  • 节点健康监控
  • 故障发现与自动转移
  • 客户端服务发现

其中,Sentinel 通过不断的健康检测,发现故障节点并自动完成主从切换。

而主观下线和客观下线就是故障判定的两个阶段。
在这里插入图片描述


🔍 1. 主观下线(Subjectively Down)

✅ 定义:

主观下线指的是某个 Sentinel 节点认为目标 Redis 节点已经不可达,但这种判断是该 Sentinel 自己独立作出的并不代表共识或最终结论

✅ 判定机制:

每个 Sentinel 会:

  • 每隔 1 秒 向所有被监控的 Redis 实例(主节点、从节点、其他 Sentinel)发送一次 PING 命令;
  • 如果某个 Redis 节点在指定时间段(down-after-milliseconds,比如 5 秒)内没有做出有效回复
  • 那么该 Sentinel 会将这个节点标记为 主观下线(sdown)

✅ 示例配置:

sentinel down-after-milliseconds mymaster 5000

即:如果主节点在 5 秒内没回应,则该 Sentinel 节点主观判定其“挂了”。

✅ 特点总结:

特性描述
判定者单个 Sentinel
时间依据down-after-milliseconds
目标节点Master/Slave/Sentinel
是否触发故障转移❌ 不会单独触发
是否可被误判✅ 可能因为网络抖动误判

🧠 2. 客观下线(Objectively Down)

✅ 定义:

当一个 Redis 主节点被多个 Sentinel 节点同时标记为主观下线,且满足 quorum 票数要求,就会被认为是客观下线(odown),也就是集体判定其“真的挂了”。

✅ 判定机制:

  • 当某个 Sentinel 检测到 Master 节点 sdown 后,会发送:
SENTINEL is-master-down-by-addr

向其他 Sentinel 询问是否也判定该主节点 sdown。

  • 如果超过配置的 quorum 个数(如 2 个)也认为 sdown,则标记为 客观下线(odown)
  • 此时,Sentinel 会进入下一阶段:领导者选举和 failover 故障转移

✅ 示例配置:

sentinel monitor mymaster 127.0.0.1 6379 2

表示:若至少有 2 个 Sentinel 一致认定主节点不可用,即进入 odown 状态。

✅ 特点总结:

特性描述
判定者多个 Sentinel
依据quorum 投票一致
目标节点只针对主节点(Master)
是否触发故障转移✅ 是故障转移的前提条件
是否可信✅ 更可靠(多数派共识)

🖼️ 3. 时序图对比示意

Sentinel1 Sentinel2 Sentinel3 Master Master 宕机 PING PING PING 未响应超时,sdown 未响应超时,sdown is-master-down-by-addr? 是(sdown) is-master-down-by-addr? 是(sdown) quorum 达成 → 标记 odown Sentinel1 Sentinel2 Sentinel3 Master

📌 4. 实际生活中的类比

  • 主观下线就像某个员工说“老王今天好像没来上班”
  • 客观下线是多个员工都说“是的,老王真的请假了”,老板才会安排别的人顶替他的工作

✅ 5. 总结对比表

对比项主观下线(sdown)客观下线(odown)
判定来源单个 Sentinel 节点多个 Sentinel 达成共识
适用对象所有 Redis 节点仅主节点
是否可靠否(可能误判)是(基于投票)
是否触发故障转移❌ 否✅ 是
实现命令自动 ping 判定is-master-down-by-addr

🎯 总结

Redis Sentinel 的下线机制是其高可用设计的关键之一:

  • 主观下线(sdown)是单哨兵的临时判断
  • 客观下线(odown)是多哨兵一致的最终裁决

只有当达到 客观下线,Sentinel 系统才会启动领导者选举和主从切换流程,从而实现 Redis 的自动故障恢复。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87549.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell脚本应用及实战演练

文章目录 一、Shell脚本语言的基本结构1、Shell脚本的用途&#xff1a;2、 Shell脚本基本结构&#xff1a;3、 创建Shell脚本过程4、 脚本注释规范 二、Shell脚本语言的变量用法详解位置与预定义变量 三、 Shell字符串详解1、Shell字符串拼接2、Shell字符串截取3、 Shell的格式…

软件工程瀑布模型学习指南

软件工程瀑布模型学习指南 一、瀑布模型核心概念 1.1 定义与特点 瀑布模型是一种经典的软件开发流程,将项目划分为顺序性的阶段,每个阶段有明确的输入和输出,如同瀑布流水般单向推进。其特点包括: 阶段间具有明确的顺序性和依赖性强调文档驱动和阶段评审适合需求明确、稳…

获取gitlab上项目分支版本(二)

获取gitlab上项目分支版本_gitlab代码分支版本在哪-CSDN博客 原先写过一版&#xff0c;但是这次想更新一下项目的分支信息时&#xff0c;提示我 git服务器上的Python版本是2.7.3&#xff0c;这个错误表明当前Python环境中没有安装requests库&#xff0c;服务器也没有连接外网&…

主流防火墙策略绕过漏洞的修复方案与加固实践

主流防火墙策略绕过漏洞的修复方案与加固实践 流量关键点分析&#xff08;攻击手法&#xff09; 攻击者通过精心构造的TCP序列号攻击和恶意标志组合绕过防火墙DPI检测&#xff0c;核心手法如下&#xff1a; TCP连接建立&#xff08;正常握手&#xff09; 1049&#xff1a;客户…

泛微OAe9-后端二开常见数据库操作

泛微OAe9-后端二开常见数据库操作 文章目录 泛微OAe9-后端二开常见数据库操作一、RecordSet1 RecordSet 操作OA本身的表2 RecordSet 操作OA 本身的存储过程 二、RecordSetTrans三、RecordSetDataSource四、原生 jdbc 一、RecordSet RecordSet 适用于操作 OA 自己的库。OA 数据库…

【数据分析八:hypothesis testing】假设检验

本节我们讲述假设检验和抽样方法 有关假设检验的详细内容&#xff0c;可以参考我以往的博客 概率论与数理统计总复习_概率论与数理统计复习-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞33次&#xff0c;收藏23次。中科大使用的教辅《概率论和数理统计》&#xff0c;带大家复…

AI免费工具:promptpilot、今天学点啥、中英文翻译

promptpilot 激发模型潜能&#xff0c;轻松优化 Prompt https://promptpilot.volcengine.com/startup 今天学点啥 https://metaso.cn/study 能生成网页和语音播报 中英文翻译 沉浸式翻译&#xff0c;浏览器插件&#xff0c;ai翻译

计算机网络学习笔记:TCP三报文握手、四报文挥手

文章目录 前言一、TCP三报文握手二、TCP四报文挥手三、TCP保活计时器 前言 TCP通信&#xff0c;通常需要经历三个阶段&#xff1a;三报文握手->发送&#xff0c;接收数据->四报文挥手。 一、TCP三报文握手 三报文握手处于TCP的连接建立阶段&#xff0c;主要解决了以下的…

kafka部署和基本操作

一、部署kafka 解压 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5学习教程,从入门到精通,Bootstrap 5 导航语法知识点及案例代码(17)

Bootstrap 5 导航语法知识点及案例代码 Bootstrap 5 提供了强大的导航组件&#xff0c;帮助开发者快速构建响应式且美观的导航栏。 一、Bootstrap 5 导航组件概述 Bootstrap 5 提供了多种导航组件&#xff0c;主要包括&#xff1a; 导航栏&#xff08;Navbar&#xff09;&am…

清除 docker 无用的 镜像/容器

清除 docker 无用的 镜像/容器 删除 <none> 的 docker 镜像 使用以下命令删除所有 的 Docker 镜像&#xff08;即悬空镜像 / dangling images&#xff09;&#xff1a; docker image prune -f这会自动删除所有没有 tag 的镜像&#xff08;&#xff09;&#xff0c;不会…

使用Charles抓包工具提升API调试与性能优化效率

在软件开发过程中&#xff0c;网络请求调试和性能优化往往成为开发者遇到的挑战&#xff0c;尤其是在进行API接口调试时。开发者需要确保网络请求的正确性、响应时间以及系统的整体性能。然而&#xff0c;传统的调试方法常常无法提供足够的细节来深入分析问题&#xff0c;进而影…

如何协调各项目关键节点的冲突与依赖

在多项目并行的环境下&#xff0c;关键节点间的冲突与依赖是导致项目延期、资源浪费和沟通误解的主要根源。要高效协调此类问题&#xff0c;企业应重点从建立透明的进度依赖图、使用项目管理工具对齐节点、推动跨部门协同机制入手。其中&#xff0c;通过Gantt图或关键路径法实现…

mongodb单节点改副本集模式

前一阵将三节点的副本集改成了单节点&#xff0c;但后面业务代码出现问题&#xff1a;无法使用事务&#xff0c;因为事务只有在副本集上能用&#xff0c;单节点无法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前仅有一台服务器&#xff0c;所以考虑在一台服务器上…

Android 修改了页面的xml布局,使用了databinding,这时候编译时需要用到apt吗

deepseek回答&#xff1a; 在 Android 开发中使用 DataBinding 时&#xff0c;不需要显式使用 apt&#xff08;Annotation Processing Tool&#xff09;。以下是详细说明&#xff1a; 1. DataBinding 的编译机制 DataBinding 是 Android Gradle 插件原生支持的功能&#xff…

服务器如何从http升级到https(nginx)

1.证书申请 可以到阿里云或者华为云去申请证书&#xff0c;申请完下载证书是个压缩包&#xff0c;然后解压 可以到到几个文件夹&#xff0c;找到 .Nginx 文件夹打开 会有两个文件&#xff0c;将这两个文件上传至nginx/conf/cert文件夹下&#xff08;cert需要手…

6.19_JAVA_微服务

1、跑后端的时候要把数据库跑起来&#xff0c;否则会报错。 2、predicate断言&#xff1a; 预言&#xff1a;predict 3、gateway&#xff1a;出路口 4、API&#xff1a;List.of("a", "b", "c");把abc编程一个集合。 5、 6、shortcutFieldOrd…

Linux 基础命令:`ls`、`cd`、`du` 快速入门

在 Linux 系统中&#xff0c;ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls&#xff1a;查看目录内容 用途&#xff1a;列出当前或指定目录下的文件和子目录。 常用命令&#xff1a; ls -l # 详细列表&#xff08;权限、大…

408第一季 - 数据结构 - 散列表

散列表 概念 散列表本身就是为了查找 原始人思想 散列表思想 6%5 是 1 1%5 也是1 冲突 冲突怎么办&#xff1f; 线性探测法 就往后找&#xff0c;1跑到索引为2 然后查找&#xff0c;可以发现&#xff0c;只要没冲突就只用查找1次 然后你想找10的话&#xff0c;发现索引为0…

Spring Boot 集成 Elasticsearch(含 ElasticsearchRestTemplate 示例)

Elasticsearch 是一个基于 Lucene 的分布式搜索服务器&#xff0c;具有高效的全文检索能力。在现代应用中&#xff0c;尤其是需要强大搜索功能的系统中&#xff0c;Elasticsearch 被广泛使用。 Spring Boot 提供了对 Elasticsearch 的集成支持&#xff0c;使得开发者可以轻松地…