Redis--哨兵机制详解

1. 哨兵机制简介

Redis Sentinel(哨兵)是Redis的高可用性解决方案,它提供了监控、通知、自动故障转移和配置提供者等功能。Sentinel系统可以监控多个Redis主服务器及其从服务器,并在主服务器失效时自动进行故障转移,确保Redis服务的可用性。

Redis Sentinel最初在Redis 2.8版本中引入,并在后续版本中不断优化和完善。它是Redis官方推荐的高可用性解决方案,适用于生产环境中对Redis服务可靠性要求较高的场景。

2. 哨兵机制解决的问题

Redis Sentinel主要解决以下问题:

  1. 单点故障:传统的Redis主从结构中,主节点故障后需要手动切换,导致服务中断
  2. 故障检测:自动检测Redis实例是否正常运行
  3. 故障转移:当主节点故障时,自动选举新的主节点并调整从节点配置
  4. 配置中心:为客户端提供服务发现功能,获取可用的Redis服务器地址

3. 哨兵架构

Redis Sentinel的架构包含以下组件:

  1. Sentinel节点:监控Redis主从实例的特殊Redis服务器,运行在特殊模式下
  2. 主节点(Master):处理写操作的Redis服务器
  3. 从节点(Slave/Replica):复制主节点数据的Redis服务器

Sentinel系统通常由多个Sentinel节点组成,这些节点互相通信并对Redis实例进行监控。为了防止误判和脑裂问题,Sentinel采用分布式协商机制,要求大多数Sentinel节点达成共识才能执行故障转移。

4. 哨兵工作原理

4.1 监控机制

Sentinel通过定期发送PING命令来检测Redis实例是否存活。当一个实例在指定时间内(默认为30秒)没有响应,或者返回错误,Sentinel会将该实例标记为"主观下线"(Subjectively Down,简称SDOWN)。

4.2 故障判定

当一个Sentinel将主节点标记为"主观下线"后,会询问其他Sentinel节点是否同意该判断。如果达到配置的法定数量(quorum)的Sentinel也认为主节点故障,则该主节点被标记为"客观下线"(Objectively Down,简称ODOWN),触发故障转移流程。

4.3 故障转移过程

故障转移包括以下步骤:

  1. 选举领导者Sentinel:使用Raft算法选举一个Sentinel作为领导者,负责执行故障转移
  2. 选择新的主节点:领导者Sentinel根据从节点的优先级、复制偏移量、运行ID等因素,选择一个从节点升级为新的主节点
  3. 配置其他从节点:让其他从节点复制新的主节点
  4. 更新配置:将故障的旧主节点标记为从节点,在其恢复后会自动成为新主节点的从节点

5. Sentinel配置

5.1 基本配置

一个典型的Sentinel配置文件(sentinel.conf)如下:

# 监控的主节点,名称为mymaster,IP为127.0.0.1,端口为6379,法定人数为2
sentinel monitor mymaster 127.0.0.1 6379 2# 判定主节点主观下线的超时时间(毫秒)
sentinel down-after-milliseconds mymaster 30000# 故障转移超时时间(毫秒)
sentinel failover-timeout mymaster 180000# 同时进行故障转移的从节点数量
sentinel parallel-syncs mymaster 1

5.2 重要配置参数

  1. quorum:判定主节点客观下线所需的Sentinel数量
  2. down-after-milliseconds:Sentinel判定实例为主观下线的超时时间
  3. failover-timeout:故障转移的超时时间
  4. parallel-syncs:故障转移时,可以同时从新主节点同步数据的从节点数量
  5. notification-script:故障发生时执行的通知脚本
  6. client-reconfig-script:故障转移后执行的客户端重配置脚本

6. Sentinel通信与发现机制

6.1 Sentinel之间的通信

Sentinel节点通过Redis的发布订阅功能进行通信,每个Sentinel会订阅__sentinel__:hello频道,并定期向该频道发送自身信息。通过这种方式,Sentinel节点可以发现其他Sentinel节点。

6.2 Sentinel与Redis的通信

Sentinel通过以下方式与Redis实例通信:

  1. 定期PING:检测Redis实例是否存活
  2. INFO命令:获取主从关系、复制状态等信息
  3. 发布订阅:通过__sentinel__:hello频道与其他Sentinel通信
  4. 配置修改命令:在故障转移时重新配置Redis实例

7. 实际应用案例

7.1 部署三个Sentinel节点

推荐至少部署3个Sentinel节点,并分布在不同的物理机器上,以防止单点故障。

# 启动三个Sentinel实例
redis-sentinel sentinel1.conf
redis-sentinel sentinel2.conf
redis-sentinel sentinel3.conf

7.2 客户端连接示例(Java)

使用Jedis客户端连接Sentinel系统:

JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster",                                      // 主节点名称Set.of("127.0.0.1:26379", "127.0.0.1:26380", "127.0.0.1:26381"),  // Sentinel地址new JedisPoolConfig()                            // 连接池配置
);try (Jedis jedis = sentinelPool.getResource()) {// 使用jedis执行Redis命令jedis.set("key", "value");String value = jedis.get("key");System.out.println(value);
}

使用Lettuce客户端连接Sentinel系统:

RedisClient redisClient = RedisClient.create();
RedisSentinelAsyncCommands<String, String> connection = redisClient.connectSentinelAsync();// 获取主节点信息
RedisMasterAsync masterAsync = connection.getMasterAddrByName("mymaster");
masterAsync.thenAccept(master -> {System.out.println("Master: " + master);
});// 连接到Redis主节点
RedisURI sentinelUri = RedisURI.Builder.sentinel("127.0.0.1", 26379, "mymaster").build();
StatefulRedisConnection<String, String> connection = redisClient.connect(sentinelUri);
RedisCommands<String, String> commands = connection.sync();// 执行Redis命令
commands.set("key", "value");
String value = commands.get("key");
System.out.println(value);

8. 最佳实践与注意事项

8.1 部署建议

  1. 至少三个Sentinel节点:确保高可用和避免脑裂
  2. 分布式部署:Sentinel节点应部署在不同的物理机器上
  3. 合理设置quorum:通常为Sentinel总数的一半加一
  4. 调整超时参数:根据网络状况调整down-after-milliseconds等参数

8.2 常见问题与解决方案

  1. 网络分区导致脑裂:合理设置quorum和部署位置可减少脑裂风险
  2. 误判下线:调整down-after-milliseconds参数,避免网络抖动导致的误判
  3. 客户端配置:确保客户端支持Sentinel,并正确配置连接池

8.3 监控与维护

  1. 监控Sentinel日志:及时发现异常情况
  2. 监控故障转移事件:关注故障转移的频率和原因
  3. 定期检查配置:确保配置参数符合当前系统需求

9. Sentinel与Redis Cluster对比

特性SentinelRedis Cluster
主要目的高可用性高可用性 + 数据分片
数据分布每个节点存储全量数据数据分片到多个节点
扩展性受单机容量限制可水平扩展
部署复杂度相对简单较复杂
适用场景数据量不大但需要高可用大数据量且需要扩展

10. 总结

Redis Sentinel是Redis官方提供的高可用性解决方案,通过监控、故障检测和自动故障转移机制,确保Redis服务的可靠性。在实际应用中,合理配置Sentinel系统,可以有效防止单点故障,提高系统的可用性。

对于数据量不大但对可用性要求高的场景,Redis Sentinel是一个理想的选择。而对于需要处理大量数据并要求可扩展性的场景,可以考虑使用Redis Cluster。

无论选择哪种方案,都需要根据实际业务需求进行合理的配置和调优,确保Redis服务的稳定运行。

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

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

相关文章

无人机机体结构设计要点难点分析

一、 设计要点1.轻量化&#xff1a;核心目标&#xff1a; 最大程度减轻结构重量&#xff0c;提升有效载荷能力、续航时间、飞行速度和机动性。实现手段&#xff1a; 选用高比强度/比刚度材料&#xff08;碳纤维复合材料、航空铝合金、钛合金、工程塑料&#xff09;、拓扑优化、…

AI时代的数据库革命:电科金仓的“融合+AI“战略解析

在人工智能时代的大变局下&#xff0c;数据库要走向何方&#xff1f; 7月15日&#xff0c;中国电科旗下金仓数据库以一场名为“融合进化 智领未来”的发布会&#xff0c;提出了自己的核心主张&#xff1a;真正的未来数据库&#xff0c;是“融合”为体&#xff0c;“AI”为用。电…

与deepseek的问答:dot net与Borland VCL的关系

Borland VCL与.NET/C#关系分析borland delphi如神一般地存在&#xff01;试分析.net、c#与Borland VCL的关系。Borland Delphi及其VCL&#xff08;Visual Component Library&#xff09;框架在软件开发史上确实具有传奇地位&#xff0c;尤其在Windows桌面应用开发领域。而随着.…

SAP在未启用负库存的情况下,库存却出现了负数-补充S4 1709 BUG

SAP在未启用负库存的情况下&#xff0c;库存却出现了负数-补充S4 1709 BUG共用物料合并发料&#xff1a;单行发料数量没有超过库存数量&#xff0c;但合计发料数量超过库存数量了&#xff0c;系统还是可以过账&#xff0c;没有任何提示&#xff0c;如下图所示&#xff1a;库存数…

SpringBoot项目中常见注解

RequiredArgsConstructor 注解 类上添加该注解&#xff0c;Lombok 会自动生成一个构造函数&#xff0c;用于注入 final 或 NonNull 修饰的字段 ConfigurationProperties注解 用于将配置文件中的属性注入到某个类的字段上 sky:jwt:admin-secret-key: itcastadmin-ttl: 7200000ad…

一键修复ipynb,Jupyter Notebook损坏文件

背景最近在写一个数据分析项目时&#xff0c;不幸遇到了 断电导致电脑重启 的突发情况。当我再次打开 Jupyter Notebook 文件&#xff08;.ipynb&#xff09;时&#xff0c;发现文件已经损坏&#xff0c;Jupyter 无法正常读取它&#xff0c;甚至有时直接报错&#xff1a;Unread…

React入门学习——指北指南(第三节)

React 组件 在前面的内容中,我们了解了 React 的基础知识和入门案例。本节将深入探讨 React 中最核心的概念之一 —— 组件。组件是构建 React 应用的基础,理解组件的工作原理和使用方法,对于掌握 React 开发至关重要。 什么是组件? 在 React 中,组件是具有独立功能和 …

容器化环境下的服务器性能瓶颈与优化策略

更多云服务器知识&#xff0c;尽在hostol.com在容器化环境中&#xff0c;性能优化并不是一个简单的“加硬件”或“增加资源”就能解决的问题。随着技术的进步&#xff0c;越来越多的公司选择使用容器技术&#xff08;如Docker、Kubernetes&#xff09;来提高应用的灵活性、可移…

GaussDB 数据库架构师修炼(八) 等待事件(2)-ASP报告分析

1 ASP报告简介ASP-Active Sesion Profile &#xff08;活跃会话档案信息&#xff09;&#xff0c;ASP每秒获取活跃会话事件&#xff0c;放到内存中&#xff0c;内存中的数据达阈值&#xff0c;会落盘gs_asp表中。ASP Report根据输入的时间段与slot个数&#xff0c;从内存和磁盘…

CentOS7 安装 Redis

在 CentOS 7 上配置 Redis 服务器需要完成安装、配置和服务管理。以下是详细步骤&#xff1a;安装 Redis安装依赖&#xff1a;yum install -y gcc tcl下载并解压 Redis&#xff1a;cd /usr/local/wget https://download.redis.io/releases/redis-6.2.6.tar.gztar -zxvf redis-6…

《C++ list 完全指南:从基础到高效使用》

《C list 完全指南&#xff1a;从基础到高效使用》 文章目录《C list 完全指南&#xff1a;从基础到高效使用》一、forward_list和list比较二、list的接口介绍1.list的构造2.list iterator的使用3.list的容量操作4.list的访问操作5.list的其他操作接口三、list的迭代器失效四、…

CIU32L051 DMA+Lwrb环形队列实现串口无阻塞性数据的收发 + 数据百分百不丢失的实现

1.Lwrb的介绍&#xff08;博主功能的实现是基于RT-thread系统实现&#xff09; Lwrb是由Tilen Majerle编写的一个线程安全的环形队列&#xff0c;通常与DMA配合实现数据的无阻塞性收发&#xff0c;同时&#xff0c;配合DMA的传输过半中断&#xff0c;传输完成中断&#xff0c;以…

【C++】C++ 的入门知识2

本篇文章主要讲解 C 的入门语法知识引用、inline 关键字与 nullptr 关键字。 目录 1 引用 1&#xff09; 引用的概念与定义 &#xff08;1&#xff09; 引用的概念 &#xff08;2&#xff09; 引用的定义 2&#xff09; 引用的特性 3&#xff09; 引用的使用场…

基于Kafka实现动态监听topic功能

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之间&…

机械学习初识--什么是机械学习--机械学习有什么重要算法

一、什么是机械学习机器学习&#xff08;Machine Learning&#xff09;是人工智能&#xff08;AI&#xff09;的一个重要分支&#xff0c;它使计算机能够通过数据自动学习规律、改进性能&#xff0c;并在没有明确编程的情况下完成特定任务。其核心思想是让机器从数据中 “学习”…

普通大学生大三这一年的想法

目录 大三期间的经历与反思 公益活动&#xff1a;社会责任感的体现 比赛&#xff1a;个人成长的助推器 培训与思想提升 大学教育的本质与人才培养 构建自我的道与未来规划 大学教育的未来与个人定位 结语 大三期间的经历与反思 大三&#xff0c;大学生活的分水岭&#…

Python——入门

目录 变量 变量类型 动态类型 注释 输出输入 运算符 算术运算符 关系运算符 逻辑运算符 赋值运算符 条件语句 循环语句 函数 函数作用域 函数嵌套调用 函数默认参数 关键字参数 列表 切片 列表遍历 新增元素 查找元素 删除元素 列表拼接 元组…

华为荣耀部分机型从鸿蒙降回EMUI的一种方法

一、准备说明 1、这里介绍使用华为手机助手、海外代理软件结合固件将部分华为荣耀手机鸿蒙系统降级回EMUI系 统的一种方式&#xff1b; 2、需要降级的手机需要再出厂时内置系统为EMUI&#xff0c;出厂时为鸿蒙系统的无法进行降级操作&#xff1b; 3、降级有风险&#xff0…

maven <dependencyManagement>标签的作用

作用 dependencyManagement标签的作用&#xff1a;在父工程pom文件中声明依赖&#xff0c;但不引入&#xff1b;在子工程中用到声明的依赖时&#xff0c;可以不加依赖的版本号&#xff0c;这样可以统一管理工程中用到的依赖版本。 示例 先创建一个项目 dependencyManagement-de…

JSON格式化与结构对比

说明 功能格式化json字符串为最简格式&#xff0c;并标识值类型&#xff1b;比对json字符串结构。第三方依赖fastjson: 用于解析json、判断json值类型&#xff1b;springframework自带的字符串判断&#xff0c;可以不依赖该方法&#xff0c;改为自行实现&#xff1b;slf4j: 用于…