Redis Sentinel哨兵集群

作者:新手小白*日期:2025/10/30

一、Redis主从复制中的问题

Redis主从复制集群可以将主节点的数据改变同步给从节点,这样从节点就可以起到两个作用:第一:作为主节点的一个备份,一旦主节点出了故障不能继续对外提供服务时,从节点可以作为后备"顶"上来,并且保证数据尽量不丢失。第二,从节点可以扩展主节点的读能力,通过实现读写分离结构,可以大大减轻主节点在进行高并发读写操作时的访问压力。

但是主从同步也带了一些问题:

  • 一旦主节点故障,需要手动将一个从节点晋升为主节点,slaveof no one。
  • 需要修改客户端或者应用程序的主节点地址。
  • 如果是一主多从结构,还需将其他从节点调整,让其从新的主节点进行复制而以上整个过程都需要人工干预。

二、Redis高可用方案

Redis Sentinel是Redis的高可用实现方案,在实际的生产环境中,对提高整个系统的高可用性是非常有帮助的。哨兵是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点都会对数据节点和其他Sentinel节点进行监控,当他发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,他还会和其他Sentinel节点进行"协商",当半数以上Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis的应用方。整个过程是完全自动的,不需要人工来介入,所以这套方案很有效的解决了Redis的高可用问题。

整个故障转移的处理逻辑基本上可分为4步:

  1. 主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败
  2. 每个Sentinel节点通过定期监控发现主节点出现了故障
    多个Sentinel节点对主节点的故障达成一致,选举出其中一个Sentinel节点作为领导者(leader)负责本次故障转移工作。
  3. Sentinel领导者节点执行了故障转移,如下图所示

三、Sentinel实现原理

3.1、三个定时监控任务

Redis Sentinel通过三个定时监控任务完成对各个节点发现和监控:

  1. 每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构,这个定时任务的作用具体可以表现在三个方面:
  • 通过向主节点执行info命令,获取从节点的信息,这也是为什么Sentinel节点不需要显示配置监控从节点
  • 当有新的从节点加入时都可以立刻感知出来
  • 节点不可达或者故障转移后,可以通过info命令实时更新节点拓扑信息
  1. 每隔2秒,每个Sentinel节点会向Redis数据节点的sentinel:hello频道上发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他Sentinel节点以及它们对主节点的判断,所以这个定时任务可以完成以下两个工作:
  • 发现新的Sentinel节点:通过订阅主节点的sentinel:hello了解其他的Sentinel节点信息,如果是新加入的Sentinel节点,将该Sentinel节点信息保存起来,并与该Sentinel节点创建连接。
  • Sentinel节点之间交换主节点的状态,作为后面客观下线以及领导者选举的依据。
  1. 每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。

3.2、主观下线

每个Sentinel节点会每隔1秒对主节点、从节点、其他Sentinel节点发送ping命令做心跳检测,当这个节点超过down-after-milliseconds时间没有进行有效回复,Sentinel节点就会对该节点做失败判定,这个判定行为叫做主观下线。从字面意思也可以很容易看出主观下线是当前Sentinel节点的一家之言,存在误判断的可能。

3.3、客观下线

当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过Sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过半数的Sentinel节点都认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。

3.4、领导者选举

故障转移的工作只需要一个Sentinel节点来完成即可,所以Sentinel节点之间会做一个领导者选举的工作,选出一个Sentinel节点作为领导者进行故障转移的工作。Redis使用了Raft算法实现领导者选举,大致思路如下:

  1. 每个在线的Sentinel节点都有资格成为领导者,当他确认主节点主观下线时,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令,要求将自己设置为领导者。
  2. 收到命令的节点,如果没有同意过其他节点的请求,则会同意该请求,否则拒绝。
  3. 如果某一个节点的票数已经大于等于max(quorum,num(sentinels)/2+1),那么它将成为领导者。
  4. 如果此过程没有选举出领导者,将进入下一次选举。

3.5、故障转移

领导者选举出的Sentinel节点负责故障转移,具体步骤如下:

  1. 在从节点列表中选出一个节点作为新的主节点,方法如下:
  • 过滤:"不健康"(主观下线、断线)、5秒内没有回复过Sentinel节点ping响应,与主节点失联超过down-after-milliseconds*10秒。
  • 选择slave-priority(从优先级)最高的从节点列表,如果存在则返回,不存在则继续。
  • 选择复制偏移量最大的从节点
  • 选择runid最小的从节点
  1. 领导者节点会对第一步选出来的从节点执行slaveof no one命令,使其成为新主
  2. 领导者节点会向剩余的从节点发送命令,让他们成为新主的从节点
  3. Sentinel节点集合会将原来的主节点更新为从节点并保持对其关注,当其恢复后命令它去复制新的主节点。

四、Sentinel集群部署

4.1、案例环境


系统 IP地址 主机名 端口 Redis角色

CentOS 7.9 192.168.115.111 redis 6379 master

CentOS 7.9 192.168.115.111 redis 6380 slave1

CentOS 7.9 192.168.115.111 redis 6381 slave2

CentOS 7.9 192.168.115.111 redis 26379 Sentinel

CentOS 7.9 192.168.115.111 redis 26380 Sentinel

CentOS 7.9 192.168.115.111 redis 26381 Sentinel


Redis Sentinel哨兵集群》 是转载文章,点击查看原文


相关推荐


Python 的内置函数 enumerate
IMPYLH2025/10/27

Python 内建函数列表 > Python 的内置函数 enumerate Python 的内置函数 enumerate 是一个非常有用的工具函数,主要用于在遍历序列(如列表、元组或字符串)时,同时获取元素的索引和值。 基本语法如下: enumerate(iterable, start=0) 其中: iterable 表示任何可迭代对象start 是可选参数,指定索引的起始值,默认为 0 使用示例: fruits = ['apple', 'banana', 'orange'] f


系统与网络安全------弹性交换网络(5)
virelin_Y.lin2025/10/25

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 VLAN间通信 VLANIF VLANIF虚接口 三层交换机 具备路由功能的交换机,称之为三层交换机或多层交换机 VLAN间通信解决方案 VLANIF虚接口 VLANIF虚接口 每个VLAN都对应一个VLANIF接口 VLANIF接口是一种三层虚拟接口,可以实现VLAN间的三层互通 给每个VLAN需要配置一个VLAN虚接口,配置接口IP地址,作为VLAN内主机的网关地址 VLANIF接口不占用额外的物理端口资


仓颉语言核心技术全解析与实战教程
IT·陈寒2025/10/22

文章目录 语言特性深度解析标准库源码拆解实战项目复盘项目概览项目结构核心实现点 入门基础教程安装 SDK创建第一个项目基础语法 第三方库适配服务端应用开发鸿蒙应用开发性能优化总结与实践建议 博主介绍:全网粉丝10w+、CSDN合伙人、华为云特邀云享专家,阿里云专家博主、星级博主,51cto明日之星,热爱技术和分享、专注于Java技术领域 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 语言特性深度解析 仓颉语言是一种面向多端的


[人工智能-大模型-30]:大模型应用层技术栈 - 上下文增强层:谁掌握了更高效、更精准的上下文增强能力,谁就能构建出真正有价值的智能系统。
文火冰糖的硅基工坊2025/10/22

上下文增强层(Context Augmentation)”是一个在人工智能、特别是大语言模型(LLM)应用架构中非常关键的概念。它通常出现在构建智能对话系统、检索增强生成(RAG)系统或企业级AI代理(Agent)的分层设计中。 我们可以将其理解为:在原始用户输入(Query)和模型生成(Generation)之间,一个至关重要的“信息注入”环节。它的核心使命是——让模型在回答问题时,拥有更丰富、更准确、更相关的背景信息,从而提升回答的质量、准确性和实用性。 一、上下文增强层的定位(在系统


【SpringCloud(7)】SpringCloud Config分布式配置中心;服务端与客户端配置;SpringCloud Bus总线;bus刷新全局广播
凉凉心.2025/10/20

1. SpringCloud Config 分布式配置中心 1.1 目前分布式微服务架构的痛点 微服务意味着要将单体应用中的业务拆分成一个个自服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能允许,所以一套集中式的、动态的配置管理设备是必不可少的 SpringCloud提供了ConfigServer来解决这个问题。 1.1 SpringCloud Config是什么? SpringCloud Config为微服务架构中的微服务提供集中化的


Vue 内置组件全解析:提升开发效率的五大神器
90后晨仔2025/10/19

在 Vue 开发中,除了我们日常编写的业务组件外,框架还提供了一系列内置组件,它们为我们处理常见的开发场景提供了优雅的解决方案。今天,我们就来深入探讨 Vue 的五大内置组件:Transition、TransitionGroup、KeepAlive、Teleport 和 Suspense。 1. Transition - 丝滑的过渡动画 什么是 Transition? Transition 组件用于在元素或组件的插入、更新和移除时添加动画效果,让用户体验更加流畅。 基本使用 <template


Java Kubernetes本地部署RuoYi框架jar包
自由的疯2025/10/18

在本地 Kubernetes 集群中部署 RuoYi 框架的 JAR 包是一个很好的实践,可以帮助你更好地理解和掌握 Kubernetes 的应用部署流程。以下是详细的步骤,指导你在本地 Kubernetes 集群中部署 RuoYi 框架的 JAR 包。 1. 准备环境 1.1 安装 Minikube 或 kind 首先,确保你已经安装了 Minikube 或 kind 来本地运行 Kubernetes 集群。这里以 Minikube 为例进行说明。 安装 kubectl: curl -LO


从 Tomcat 与 Jetty 的对比,聊聊影响一个服务并发能力的关键因素
G探险者2025/10/16

大家好,我是G探险者! 在 Java 服务体系中,Tomcat 与 Jetty 是最常见的 Web 容器。很多人认为,只要加大连接数或线程数,就能提升并发能力。 但事实远比想象复杂:连接数只是冰山一角,背后还有线程模型、I/O 模型、内核资源限制等多重因素。 本文从 Tomcat 与 Jetty 的对比 入手,系统讲清楚——到底是什么在决定你的服务并发上限。 🧩 一、Tomcat 与 Jetty 的架构差异 1️⃣ Tomcat 的工作模型 Tomcat 默认采用 多线程 + 阻塞 I/O


面试真实经历某商银行大厂Java问题和答案总结(三)
360_go_php2025/10/15

​ 1. 深拷贝和浅拷贝 ​编辑 问:什么是深拷贝和浅拷贝?它们之间有什么区别? 浅拷贝(Shallow Copy): 浅拷贝指的是复制对象的引用,而不是复制对象本身。也就是说,对于对象中的引用类型字段,浅拷贝只是复制了这些字段的引用,而没有复制字段引用的对象本身。 如果原始对象和拷贝对象中有相同的引用类型字段,修改其中一个字段会影响到另一个对象。​编辑 深拷贝(Deep Copy): 深拷贝指的是复制对象本身,并且递归地复制对象中的所有引用类型字段,确保两个对象中的引用类型字段互不影响。


Swift 基础语法全景(一):从变量到类型安全
unravel20252025/10/14

常量与变量:let vs var 声明语法 // 常量:一次赋值,终身不变 let maximumLoginAttempts = 10 // 最大尝试次数,业务上不允许修改 // 变量:可反复写入 var currentAttempt = 0 // 当前尝试次数,失败+1 延迟赋值 只要「第一次读取前」完成初始化即可,不必一行写完。 var randomGenerator = SystemRandomNumberGenerator() let

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0