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

滚雪球学Redis[4.2讲]:Redis Sentinel 深度解析:工作原理、配置与高可用架构下的故障转移

全文目录:

    • 🎉前言
    • 🚦4.2 Redis Sentinel
      • 🔄Sentinel的工作原理
        • Sentinel的选举机制
      • ⚙️Sentinel的配置与使用
        • 示例:配置Redis Sentinel
        • Sentinel自动故障转移过程示例
      • 🧩高可用架构下的故障转移
        • 常见问题与优化
        • 实际部署中的经验
    • 🚀展望下一节内容:Redis Cluster
    • 🔧结论

🎉前言

在上一篇【4.1 Redis主从复制】中,我们详细讨论了Redis主从复制机制,它的主要目标是通过将读请求分摊到多个从节点上,从而提高系统的读性能和容错能力。然而,主从复制有一个致命的弱点:主节点故障时,所有的写操作都会中断,从节点也无法自动接管写操作,导致系统处于无法写入的状态。

为了解决这一痛点,Redis引入了一个至关重要的机制——Redis Sentinel。Redis Sentinel是一个高可用性解决方案,它通过监控、通知、故障转移和配置提供等功能,实现了Redis集群的自动故障转移。即使主节点出现问题,Sentinel也能在没有人工干预的情况下,将从节点提升为新的主节点,确保系统的高可用性

在本节【4.2 Redis Sentinel】中,我们将深入解析Redis Sentinel的工作原理,并通过具体的配置与示例,展示如何使用Sentinel来确保Redis系统的高可用性。而下一节【4.3 Redis Cluster】将继续讨论如何通过集群模式来进一步提升Redis的扩展性与性能,为处理海量数据提供更为强大的架构。

🚦4.2 Redis Sentinel

🔄Sentinel的工作原理

Redis Sentinel 是一个独立运行的进程,它负责监控Redis的各个节点,并在检测到主节点(Master)故障时,自动执行主从角色切换,确保系统能够持续提供服务。它具备以下四个核心功能:

  1. 监控(Monitoring):Sentinel会不断地通过PING命令检查主节点和从节点的状态,确保它们在健康运行中。当Sentinel发现某个节点无法响应时,它会将该节点标记为下线

  2. 通知(Notification):Sentinel会将节点状态的变化(如主节点下线或故障转移)通过通知机制告知系统管理员或自动化系统,帮助迅速响应问题。

  3. 故障转移(Failover):如果主节点确实失效,Sentinel会从从节点中选出一个提升为新主节点,并将其他从节点指向新的主节点,以保证服务的正常运作。

  4. 配置提供(Configuration Provider):Sentinel还可以动态地向客户端提供最新的主节点地址,使得客户端能够自动切换到新的主节点,减少人工干预。

Sentinel的选举机制

在多个Sentinel共同监控一个Redis集群时,Sentinel通过分布式选举机制来决定由哪一个Sentinel执行故障转移。选举的过程涉及以下几个步骤:

  1. 判断主节点故障:每个Sentinel通过发送PING命令检测主节点的健康状况。当某个Sentinel发现主节点未响应时,它会将该主节点标记为主观下线(Subjectively Down,简称SDOWN)

  2. 主节点故障确认:如果有多个Sentinel都检测到主节点的失效,并且超过了配置的quorum值(即监控主节点的Sentinel实例中大多数确认了主节点失效),该主节点会被标记为客观下线(Objectively Down,简称ODOWN)

  3. 选举领导者(Leader):一旦确认主节点下线,各个Sentinel将通过选举机制决定由哪一个Sentinel负责执行故障转移。通常是最早发起选举的Sentinel实例当选为领导者。

  4. 执行故障转移:领导者Sentinel会将某个最新同步的从节点提升为新的主节点,并通知其他从节点进行同步。

📝 小提示:Sentinel选举的目的是为了避免多重故障转移,即在网络分区的情况下,不会同时有多个从节点被提升为主节点,这就是分布式一致性的重要性所在。

⚙️Sentinel的配置与使用

为了更好地理解Redis Sentinel的使用方式,我们可以通过具体的案例来展示它的工作过程。以下将演示如何配置一个典型的Redis Sentinel系统,并通过故障模拟展示其自动化的故障转移机制。

示例:配置Redis Sentinel

假设我们有一个包含一个主节点和两个从节点的Redis架构。主节点的IP地址为192.168.0.1,从节点分别为192.168.0.2192.168.0.3。我们希望使用Redis Sentinel来监控该主从架构,并在主节点发生故障时自动进行故障转移。

  1. 配置Sentinel:每个Sentinel都有一个独立的配置文件sentinel.conf,以下是一个典型的配置示例:
# 配置要监控的主节点
sentinel monitor mymaster 192.168.0.1 6379 2# Sentinel判定主节点失效的时间阈值(单位:毫秒)
sentinel down-after-milliseconds mymaster 5000# 配置在故障转移期间允许有多少个从节点同时与新的主节点进行同步
sentinel parallel-syncs mymaster 1# 故障转移超时时间,单位为毫秒
sentinel failover-timeout mymaster 60000
  1. 启动Sentinel:在每个Redis实例所在的服务器上,我们需要分别启动Sentinel进程,执行以下命令来启动:
redis-sentinel /path/to/sentinel.conf

通过上述配置,Sentinel会实时监控主节点的健康状况,当主节点192.168.0.1失效时,Sentinel将自动选举从节点并进行故障转移。

Sentinel自动故障转移过程示例

现在,我们假设主节点192.168.0.1突然宕机,Sentinel会通过以下步骤进行故障转移:

  1. 检测主节点失效:Sentinel不断发送PING命令检测主节点的状态。当超过5000毫秒未收到回复时,Sentinel会标记主节点为下线。

  2. 确认主节点故障:多个Sentinel通过交互确认主节点失效,超过多数派(quorum)的Sentinel确认后,主节点被标记为客观下线。

  3. 选举新的主节点:领导者Sentinel会选举最新同步的从节点(如192.168.0.2)作为新的主节点。

  4. 通知其他从节点:领导者Sentinel通知其他从节点(如192.168.0.3)重新同步新的主节点,并更新配置。

  5. 客户端自动更新:Sentinel还会通知客户端,使得它们能够自动连接到新的主节点192.168.0.2,从而无需人工干预。

整个过程是完全自动化的,Redis系统的高可用性在这种自动故障转移中得以实现。

🧩高可用架构下的故障转移

Redis Sentinel提供了可靠的故障转移机制,使Redis集群能够应对主节点的故障而无需手动干预。但在实际的高可用架构中,故障转移的过程往往伴随一些挑战和潜在问题。

常见问题与优化
  1. 脑裂(Split-Brain):如果网络分区导致某些Sentinel实例无法与主节点通信,它们可能错误地认为主节点下线,导致多个从节点被提升为主节点。这种情况会造成数据的不一致,甚至引发严重的故障。

    解决方案:为了避免脑裂,通常需要配置更高的quorum值,确保只有在大多数Sentinel都确认主节点失效时,才进行故障转移。

  2. 数据丢失风险:当主节点宕机时,如果从节点还未同步主节点的最新数据,提升为新主节点后可能会丢失部分数据。

    解决方案:可以通过调整repl-backlog-size等参数,确保主从节点之间的同步延迟最小化,减少数据丢失的可能性。同时,启用AOF(Append-Only File)模式也可以帮助持久化数据。

  3. 从节点选择策略:在故障转移中,Sentinel会根据从节点的数据同步情况选择新的主节点。如果从节点数据同步不及时,选择错误的从节点作为新主节点可能会导致数据不一致。

    解决方案:可以通过监控和调整从节点的同步延迟,确保选择的数据是最新的,保证故障转移过程的可靠性。

实际部署中的经验

在生产环境中,通常会部署多个Sentinel实例来监控一个Redis集群。一般建议部署三个或五个Sentinel实例,这样可以保证即使有一个Sentinel实例出现

问题,其他实例依然可以正常运行并执行故障转移。

为了进一步增强系统的高可用性,还可以通过Redis的持久化机制(如RDB快照和AOF日志)来保证即使在节点崩溃的情况下,数据也不会完全丢失。

进阶提示:Redis Sentinel适用于中小规模的高可用性场景,而对于需要更大规模扩展的场景,Redis Cluster则是更为理想的方案。通过数据分片和全局一致性机制,Redis Cluster能够支持数百甚至上千个节点,并实现更好的性能和容错能力。

🚀展望下一节内容:Redis Cluster

在下一节【4.3 Redis Cluster】中,我们将深入探讨Redis的集群模式。Redis Cluster通过数据分片的方式,将数据分布到多个节点上,从而实现了Redis的水平扩展(horizontal scaling)。这种架构在应对大规模数据存储和高并发请求时表现尤为出色。

Redis Cluster不仅能够通过分布式算法来实现高可用性,还引入了哈希槽(hash slots)机制来管理和路由数据存储的位置。此外,Redis Cluster还能够自动进行故障转移和主从切换,为大型分布式系统提供了更为完善的解决方案。

通过学习Redis Cluster,我们将能够掌握Redis在分布式环境下的最佳实践,并了解如何构建大规模、低延迟和高可用的Redis集群系统。

🔧结论

Redis Sentinel是Redis系统中保障高可用性的关键组件。它能够通过监控、通知、故障转移等机制,实现Redis系统的自动化维护和运维管理。在实际生产环境中,Sentinel可以帮助我们构建一个更具弹性和可靠性的Redis集群,确保在主节点故障时能够迅速进行故障切换,保持服务的稳定性。

通过本章的学习,相信大家已经对Redis Sentinel的工作原理、配置方法以及高可用架构有了深入理解。在面对Redis主从复制架构中的缺陷时,Sentinel为我们提供了一个便捷的解决方案,让系统具备更强的容错能力和自动化运维能力。

在接下来的【4.3 Redis Cluster】章节中,我们将继续探讨Redis在分布式系统中的表现,以及如何通过集群模式应对大规模数据和高并发的挑战。Redis Cluster是Redis高可用性和扩展性的完美结合,相信你一定会对它的强大功能感到惊叹!

相关文章:

滚雪球学Redis[4.2讲]:Redis Sentinel 深度解析:工作原理、配置与高可用架构下的故障转移

全文目录: 🎉前言🚦4.2 Redis Sentinel🔄Sentinel的工作原理Sentinel的选举机制 ⚙️Sentinel的配置与使用示例:配置Redis SentinelSentinel自动故障转移过程示例 🧩高可用架构下的故障转移常见问题与优化实…...

Vue3 -- 设置分页,切换分页之后选项仍能保留 控制多个表格的选中不会互相影响

在 Vue 3 中实现分页功能,并确保在切换分页时选中的选项能够保留,同时控制多个表格之间的选中状态不互相影响,可以按照以下步骤进行: 1. 数据结构设计 为每个表格维护独立的选中项和分页状态。可以使用一个对象来存储每个表格的…...

如何在 JSON 中编写“anyOf”语句?

在 JSON 中,anyOf 语句通常用于 JSON Schema(JSON 模式)中,来定义多个可能的模式,表示数据可以匹配多个子模式中的任意一个。这种功能常用于验证 JSON 数据是否符合某一组可能的条件之一。 1、问题背景 问题&#xff…...

python开发环境配置

下载python安装包安装python配置环境变量调整类库下载位置 安装python 安装python是指安装python的基础编译环境及python运行所需的必须资源,类似于安装java的JDK python2与python3差异 进行python安装前,需要先了解python2和python3的差异&#xff0…...

QT开发--QT SQL模块

第十五章 QT SQL模块 15.1 QT SQL模块概览 Qt SQL模块是Qt框架中操作数据库的组件,提供易用API,支持SQLite、MySQL等多种数据库。它包含数据库驱动与连接功能。 15.1.1 QSqlDatabase 类 在Qt SQL模块中,数据库驱动基于QSqlDriver类&#xf…...

如何保证接口幂等性?

一、什么是接口幂等性? 幂等性是指:同一请求,执行很多次,最终结果都一样。 二、为什么会产生接口幂等性问题? 那么,什么情况下,会产生接口幂等性的问题呢? 网络波动, 可能会引起重…...

【9718】基于springboot+vue的生鲜交易系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 生鲜交易管理方面的任务繁琐,以至于交易市场每年都在生…...

Spring循环依赖解决方案

解决方案 使用提前暴露机制三级缓存进行解决 singletonObjects一级缓存,存放完整的 Bean。earlySingletonObjects二级缓存,存放提前暴露的Bean,Bean 是不完整的,未完成属性注入和执行 init 方法。singletonFactories三级缓存(用…...

解决 IntelliJ IDEA 运行时 “Command line is too long“ 问题

文章目录 文章标题:解决 IntelliJ IDEA 运行时 "Command line is too long" 问题简介问题描述解决方案代码示例代码示例1:使用JAR Manifest代码示例2:使用Classpath File代码示例3:优化项目依赖 结论进一步的资源 文章标…...

鸿蒙网络编程系列5-TCP连接超时分析

1. TCP连接超时简介 TCP是面向连接的协议,通过三次握手建立连接,但是,在建立连接的过程中对方有可能没有响应,这时候发起连接的一方会重试,如果重试多次仍然没有响应,就会触发超时,从而导致连接…...

金蝶云星空移动字段后关闭页面后重新打开无效

有同事反馈,单据的明细字段里面移动了字段,然后退出,其他字段都能按最后排版的位置显示,有个别字段始终无法按照排版的位置显示。 只需要打开BOS平台,找到对应字段,然后更改可见性。...

幂律分布笔记

一、幂律分布的数据拟合 数据分箱: 所谓分箱就是对原始数据进行分组,然后对每一组内的数据进行平滑处理。常见的分箱方式主要有等深分箱、等宽分箱、用户自定义等 对数分箱: 对原数据进行分箱,第i个箱的宽度为bi,b…...

一些NLP代表性模型

(一)BERT 由Bidirectional Encoder Representations from Transformers的首字母组成,是encoder-only结构类型的代表。 模型分预训练和微调两步,预训练任务有两类:masked language model(MLM)、next sentence predict…...

低代码移动端开发:未来的趋势与挑战

什么是低代码移动端开发? 低代码移动端开发平台允许开发者通过可视化界面和少量编码来构建应用程序。相较于传统的代码开发,低代码平台大大降低了技术和学习门槛,使非专业开发人员也能参与到移动应用的开发过程中。 低代码移动端开发的优势 …...

【Linux】嵌入式Linux系统的组成、u-boot编译

Linux—嵌入式Linux系统的组成、u-boot编译 前言一、嵌入式Linux系统的组成1.1 嵌入式Linux系统和PC完整的操作系统的对比如下:1.2 PC机—Windows系统启动流程(PC机—Linux系统、嵌入式ARM—linux系统的启动流程类似) 二、编译u-boot2.1 u-bo…...

Qt打开excel文件,并读取指定单元格数据

1. 下载并安装QXlsx库,详见之前的博文Qt子线程创建excel文件报错QObject: Cannot create children for a parent that is in a different thread.-CSDN博客 2. // 创建一个XlsxDocument对象QString filename "D:\\mydocuments\\data_acquisition\\data\\tes…...

适合下班回家做的小副业,用AI做视频,几天时间3000+

大家好,今天要给大家分享的项目是定制儿歌,精准定位宝妈群体,每天轻松赚500! ***01* 项目原理 父母都非常疼爱自己的孩子,愿意为孩子提供独特的东西。而我们正是利用这一点,通过免费AI工具生成专属的儿童…...

git的基本操作 + 分支管理

一、基本操作 1. 修改文件 Git比其他的版本管理器设计得更加优秀,因为Git追踪并管理的是修改,而非文件。 修改一个文件,不管你是添加一行,或者删除一行,还是添加了又删除了,甚至你创建了一个新文件&…...

VRRP

1、VRRP简介 虚拟路由冗余协议 VRRP(Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时(单点故障&#xf…...

个人健康系统|个人健康数据管理系统|基于小程序+java的个人健康数据管理系统设计与实现(源码+数据库+文档)

个人健康数据管理系统 目录 基于小程序java的个人健康数据管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...