redis Sentinel(哨兵模式)的原理你能讲一下吗?
mhr18 2025-03-23 21:09 34 浏览 0 评论
我们来深入讲解一下 Redis Sentinel(哨兵模式)的原理。为了让你更好地理解,我会尽量用通俗易懂的语言,并结合一些比喻来解释。
首先,我们先要明白为什么需要 Sentinel?
在 Redis 中,最基础的部署方式是单机模式,但单机模式存在一个致命的弱点:单点故障。如果 Redis 服务器宕机,整个系统就无法正常工作。为了解决这个问题,Redis 引入了主从复制模式。
主从复制模式中,有一个 Master 节点负责写操作,多个 Slave 节点负责读操作,并且从 Master 节点同步数据。这样,即使 Master 节点宕机,Slave 节点仍然可以提供读服务,提高了系统的可用性。
但是,主从复制模式仍然存在一些问题:
- Master 节点宕机后的自动切换问题: 当 Master 节点宕机后,需要人工介入,手动将一个 Slave 节点提升为新的 Master 节点,并通知客户端连接新的 Master。这个过程是手动的,耗时且容易出错,无法实现自动故障转移。
- 监控问题: 需要有机制来监控 Master 和 Slave 节点的状态,及时发现故障。
Redis Sentinel 就是为了解决这些问题而诞生的。它的核心目标是实现 Redis 的高可用性,主要负责以下几个方面:
- 监控 (Monitoring): Sentinel 会不断地检查 Master 和 Slave 节点是否正常运行。
- 通知 (Notification): 当被监控的 Redis 实例出现问题时,Sentinel 会向管理员或其他应用程序发送通知。
- 自动故障转移 (Automatic Failover): 当 Master 节点不可用时,Sentinel 会自动将一个 Slave 节点提升为新的 Master 节点,并更新其他 Slave 节点的配置,以及通知客户端连接新的 Master。
- 配置提供者 (Configuration Provider): 客户端连接 Redis 集群时,不需要直接连接 Master 或 Slave 节点,而是连接 Sentinel 集群。Sentinel 会告诉客户端当前可用的 Master 节点的地址,以及 Slave 节点的地址信息。
现在,我们来详细拆解 Sentinel 的原理:
1. 监控 (Monitoring)
- 心跳检测 (Heartbeat): Sentinel 会定期向它监控的 Master、Slave 以及其他 Sentinel 实例发送 PING 命令。如果实例在配置的时间内没有回复 PONG,Sentinel 就认为该实例进入了主观下线 (Subjectively Down, SDOWN) 状态。你可以把 PING 命令想象成 Sentinel 定期给 Redis 实例发消息问候:“你还在吗?”
- INFO 命令检测: 除了 PING 命令,Sentinel 还会定期向 Master 和 Slave 节点发送 INFO 命令,获取 Redis 实例的各种信息,例如角色 (role)、运行状态、复制状态等。通过分析 INFO 命令的返回结果,Sentinel 可以更全面地了解 Redis 实例的健康状况。
2. 主观下线 (SDOWN) 和 客观下线 (ODOWN)
- 主观下线 (SDOWN): 当一个 Sentinel 实例认为某个 Redis 实例不可达时,它会将该实例标记为 SDOWN。这只是单个 Sentinel 实例的判断,可能只是网络抖动等暂时性问题导致的误判。
- 客观下线 (ODOWN): 为了避免误判,Sentinel 引入了 ODOWN 机制。当一个 Sentinel 实例将某个 Master 标记为 SDOWN 后,它会向其他 Sentinel 实例询问对该 Master 的看法。当足够数量 (quorum) 的 Sentinel 实例都认为该 Master 处于 SDOWN 状态时,这个 Master 才会被标记为 客观下线 (Objectively Down, ODOWN)。你可以把 ODOWN 理解为“集体投票”,只有当足够多的 Sentinel 都认为 Master 挂了,才最终确认 Master 真的挂了。这个“足够数量”就是 quorum,可以在 Sentinel 的配置文件中设置。
3. 领导者选举 (Leader Election) 和 故障转移 (Failover)
- 领导者选举 (Leader Election): 当 Master 被标记为 ODOWN 后,Sentinel 集群需要选举出一个 领导者 Sentinel (Leader Sentinel) 来负责执行故障转移操作。选举过程基于 Raft 算法的简化版,大致流程如下:每个 Sentinel 实例都尝试成为 Leader。Sentinel 向其他 Sentinel 实例发送命令,请求成为 Leader。如果 Sentinel 收到超过半数 Sentinel 实例的同意票,它就成为 Leader。如果选举失败,则等待一段时间后重新发起选举。领导者选举的目的是为了保证在故障转移过程中,只有一个 Sentinel 实例在执行操作,避免脑裂等问题。
- 故障转移 (Failover): 当选出 Leader Sentinel 后,它会执行以下故障转移步骤:选择新的 Master: Leader Sentinel 会从 ODOWN 的 Master 下面的 Slave 节点中选择一个合适的 Slave 节点作为新的 Master。选择标准通常是:优先级 (priority): 在 Slave 节点的配置文件中可以设置优先级,优先级高的 Slave 节点优先被选择。复制偏移量 (replication offset): 选择复制偏移量最大的 Slave 节点,即数据同步最完整的 Slave 节点。运行 ID (runid): 如果优先级和复制偏移量都相同,则选择运行 ID 较小的 Slave 节点。将选中的 Slave 提升为 Master: Leader Sentinel 会向选中的 Slave 节点发送 SLAVEOF NO ONE 命令,将其提升为新的 Master 节点。更新其他 Slave 节点的配置: Leader Sentinel 会向其他 Slave 节点发送 SLAVEOF
命令,让它们成为新 Master 的 Slave 节点,开始从新的 Master 节点同步数据。
4. 配置提供者 (Configuration Provider)
- 客户端发现: 客户端在连接 Redis 集群时,不是直接连接 Master 或 Slave 节点,而是连接 Sentinel 集群。客户端可以向 Sentinel 查询当前可用的 Master 节点的地址。
- 配置更新: 当发生故障转移后,Master 节点的地址会发生变化。Sentinel 会自动通知客户端新的 Master 节点的地址,客户端可以动态更新连接信息,无需手动修改配置。
总结一下 Redis Sentinel 的工作原理:
- 监控: Sentinel 集群通过心跳检测和 INFO 命令监控 Master、Slave 和其他 Sentinel 实例的状态。
- 判断下线: 单个 Sentinel 判断实例 SDOWN,多个 Sentinel 达成共识后判断 Master ODOWN。
- 领导者选举: Sentinel 集群选举出一个 Leader Sentinel 负责故障转移。
- 故障转移: Leader Sentinel 选择新的 Master,提升 Slave 为 Master,更新其他 Slave 配置,通知客户端。
- 配置提供: Sentinel 作为配置中心,向客户端提供 Master 和 Slave 的地址信息,并动态更新配置。
Sentinel 的优点:
- 高可用性: 自动故障转移,保证 Redis 集群的持续可用性。
- 自动化运维: 减少人工干预,降低运维成本。
- 配置简单: 相对 Redis Cluster 来说,Sentinel 的配置和部署更加简单。
Sentinel 的缺点:
- 仍然存在数据丢失的风险: 在故障转移过程中,如果旧 Master 上有部分数据尚未同步到 Slave 节点,可能会丢失这部分数据。
- 哨兵本身的高可用性: 虽然 Sentinel 集群提高了可用性,但 Sentinel 集群本身也需要保证高可用性,通常需要部署多个 Sentinel 实例。
- 写操作瓶颈: Sentinel 模式仍然是单 Master 节点负责写操作,写操作的性能瓶颈仍然存在于 Master 节点。
比喻:
你可以把 Redis Sentinel 想象成一个 Redis 集群的“守护者” 或者 “监控中心”。
- Sentinel 就像一群“哨兵”,时刻监视着 Redis 集群中的 Master 和 Slave 节点,以及其他的哨兵。
- 当 Master 节点“生病”(宕机)时,哨兵们会“投票”确认 Master 是否真的“病倒了”。
- 如果 Master 真的“病倒了”,哨兵们会“选举”出一个“指挥官”(Leader Sentinel)。
- “指挥官”会负责“救治”,从健康的“副手”(Slave)中挑选一个“接班人”(新的 Master),并通知所有“成员”(Slave 和客户端)新的“领导者”(新的 Master)。
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)