滚雪球学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)故障时,自动执行主从角色切换,确保系统能够持续提供服务。它具备以下四个核心功能:
-
监控(Monitoring):Sentinel会不断地通过
PING命令检查主节点和从节点的状态,确保它们在健康运行中。当Sentinel发现某个节点无法响应时,它会将该节点标记为下线。 -
通知(Notification):Sentinel会将节点状态的变化(如主节点下线或故障转移)通过通知机制告知系统管理员或自动化系统,帮助迅速响应问题。
-
故障转移(Failover):如果主节点确实失效,Sentinel会从从节点中选出一个提升为新主节点,并将其他从节点指向新的主节点,以保证服务的正常运作。
-
配置提供(Configuration Provider):Sentinel还可以动态地向客户端提供最新的主节点地址,使得客户端能够自动切换到新的主节点,减少人工干预。
Sentinel的选举机制
在多个Sentinel共同监控一个Redis集群时,Sentinel通过分布式选举机制来决定由哪一个Sentinel执行故障转移。选举的过程涉及以下几个步骤:
-
判断主节点故障:每个Sentinel通过发送
PING命令检测主节点的健康状况。当某个Sentinel发现主节点未响应时,它会将该主节点标记为主观下线(Subjectively Down,简称SDOWN)。 -
主节点故障确认:如果有多个Sentinel都检测到主节点的失效,并且超过了配置的
quorum值(即监控主节点的Sentinel实例中大多数确认了主节点失效),该主节点会被标记为客观下线(Objectively Down,简称ODOWN)。 -
选举领导者(Leader):一旦确认主节点下线,各个Sentinel将通过选举机制决定由哪一个Sentinel负责执行故障转移。通常是最早发起选举的Sentinel实例当选为领导者。
-
执行故障转移:领导者Sentinel会将某个最新同步的从节点提升为新的主节点,并通知其他从节点进行同步。
📝 小提示:Sentinel选举的目的是为了避免多重故障转移,即在网络分区的情况下,不会同时有多个从节点被提升为主节点,这就是分布式一致性的重要性所在。
⚙️Sentinel的配置与使用
为了更好地理解Redis Sentinel的使用方式,我们可以通过具体的案例来展示它的工作过程。以下将演示如何配置一个典型的Redis Sentinel系统,并通过故障模拟展示其自动化的故障转移机制。
示例:配置Redis Sentinel
假设我们有一个包含一个主节点和两个从节点的Redis架构。主节点的IP地址为192.168.0.1,从节点分别为192.168.0.2和192.168.0.3。我们希望使用Redis Sentinel来监控该主从架构,并在主节点发生故障时自动进行故障转移。
- 配置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
- 启动Sentinel:在每个Redis实例所在的服务器上,我们需要分别启动Sentinel进程,执行以下命令来启动:
redis-sentinel /path/to/sentinel.conf
通过上述配置,Sentinel会实时监控主节点的健康状况,当主节点192.168.0.1失效时,Sentinel将自动选举从节点并进行故障转移。
Sentinel自动故障转移过程示例
现在,我们假设主节点192.168.0.1突然宕机,Sentinel会通过以下步骤进行故障转移:
-
检测主节点失效:Sentinel不断发送
PING命令检测主节点的状态。当超过5000毫秒未收到回复时,Sentinel会标记主节点为下线。 -
确认主节点故障:多个Sentinel通过交互确认主节点失效,超过多数派(
quorum)的Sentinel确认后,主节点被标记为客观下线。 -
选举新的主节点:领导者Sentinel会选举最新同步的从节点(如
192.168.0.2)作为新的主节点。 -
通知其他从节点:领导者Sentinel通知其他从节点(如
192.168.0.3)重新同步新的主节点,并更新配置。 -
客户端自动更新:Sentinel还会通知客户端,使得它们能够自动连接到新的主节点
192.168.0.2,从而无需人工干预。
整个过程是完全自动化的,Redis系统的高可用性在这种自动故障转移中得以实现。
🧩高可用架构下的故障转移
Redis Sentinel提供了可靠的故障转移机制,使Redis集群能够应对主节点的故障而无需手动干预。但在实际的高可用架构中,故障转移的过程往往伴随一些挑战和潜在问题。
常见问题与优化
-
脑裂(Split-Brain):如果网络分区导致某些Sentinel实例无法与主节点通信,它们可能错误地认为主节点下线,导致多个从节点被提升为主节点。这种情况会造成数据的不一致,甚至引发严重的故障。
解决方案:为了避免脑裂,通常需要配置更高的
quorum值,确保只有在大多数Sentinel都确认主节点失效时,才进行故障转移。 -
数据丢失风险:当主节点宕机时,如果从节点还未同步主节点的最新数据,提升为新主节点后可能会丢失部分数据。
解决方案:可以通过调整
repl-backlog-size等参数,确保主从节点之间的同步延迟最小化,减少数据丢失的可能性。同时,启用AOF(Append-Only File)模式也可以帮助持久化数据。 -
从节点选择策略:在故障转移中,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、问题背景 问题ÿ…...
python开发环境配置
下载python安装包安装python配置环境变量调整类库下载位置 安装python 安装python是指安装python的基础编译环境及python运行所需的必须资源,类似于安装java的JDK python2与python3差异 进行python安装前,需要先了解python2和python3的差异࿰…...
QT开发--QT SQL模块
第十五章 QT SQL模块 15.1 QT SQL模块概览 Qt SQL模块是Qt框架中操作数据库的组件,提供易用API,支持SQLite、MySQL等多种数据库。它包含数据库驱动与连接功能。 15.1.1 QSqlDatabase 类 在Qt SQL模块中,数据库驱动基于QSqlDriver类…...
如何保证接口幂等性?
一、什么是接口幂等性? 幂等性是指:同一请求,执行很多次,最终结果都一样。 二、为什么会产生接口幂等性问题? 那么,什么情况下,会产生接口幂等性的问题呢? 网络波动, 可能会引起重…...
【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地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时(单点故障…...
个人健康系统|个人健康数据管理系统|基于小程序+java的个人健康数据管理系统设计与实现(源码+数据库+文档)
个人健康数据管理系统 目录 基于小程序java的个人健康数据管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
