Redis设计与实现——分布式Redis
Redis Sentinel(哨兵)
Sentinel 的工作机制
-
故障检测(Failure Detection)
-
主观下线(Subjective Down):单个 Sentinel 实例检测到主节点在30 秒内无响应,标记其为
SDOWN
。 -
客观下线(Objective Down):当超过
quorum
的 Sentinel 实例确认主节点不可达,标记为ODOWN
,触发故障转移。
-
-
领导者选举(Leader Election)
-
Raft 算法:Sentinel 使用类似 Raft 的算法选举领头 Sentinel(Leader),由 Leader 执行故障转移。
-
选举条件:获得多数 Sentinel 实例的投票(
> N/2 + 1
,N 为 Sentinel 总数);避免多个 Sentinel 同时发起故障转移。
-
-
故障转移(Failover)流程
-
选择新主节点:Leader Sentinel 根据规则从从节点中选出新主节点:
优先级(
slave-priority
配置);复制偏移量最大(数据最新);运行 ID 字典序最小(最终裁决条件)。 -
提升新主节点:向目标从节点发送
SLAVEOF NO ONE
,使其成为主节点;等待新主节点确认角色切换。 -
切换从节点复制关系:向其他从节点发送
SLAVEOF
命令,使其复制新主节点。 -
更新配置:Sentinel 更新监控的主节点地址,并通知客户端。
-
-
客户端服务发现
-
连接流程:客户端向 Sentinel 查询当前主节点地址;客户端直接连接主节点,失败时重试查询。
-
SDK 支持:主流 Redis 客户端库(如 Jedis、Lettuce)内置 Sentinel 集成。
-
Sentinel 的架构与部署
-
Sentinel 部署模式
-
推荐配置:至少部署 3 个 Sentinel 实例(奇数个,避免脑裂),分布在独立物理节点。
-
网络拓扑:Sentinel 实例与 Redis 节点部署在同一网络,避免分区误判;Sentinel 之间通过 Gossip 协议通信,共享节点状态。
-
-
Sentinel 与 Redis 节点的关系
-
监控对象:每个 Sentinel 监控 一个主节点及其所有从节点。
-
自动发现:Sentinel 通过主节点获取从节点列表,并持续监控其状态。
-
Sentinel 的优缺点
-
优点
-
自动化容灾:无需人工干预即可完成故障转移。
-
高可用:Sentinel 自身多实例部署,避免单点故障。
-
客户端透明:客户端通过 Sentinel 自动发现主节点,业务代码无需硬编码地址。
-
-
缺点
-
数据一致性:异步复制可能导致故障转移后数据丢失(已提交但未同步到从节点的数据)。
-
复杂度:需部署多个 Sentinel 实例,配置和维护成本较高。
-
脑裂风险:网络分区可能导致多个主节点并存(需合理配置
quorum
和节点分布)。
-
生产环境建议
-
部署最佳实践
-
Sentinel 数量:至少 3 个实例,部署在独立物理节点或可用区。
-
网络优化:确保 Sentinel 与 Redis 节点间低延迟通信,避免跨地域部署。
-
监控告警:监控 Sentinel 日志和
INFO Sentinel
输出,关注odown
事件和故障转移次数。
-
-
避免脑裂的配置
-
合理设置quorum:通常设为
N/2 + 1
(N 为 Sentinel 总数)。 -
调整min-slaves-to-write:主节点需至少同步到指定数量的从节点才接受写操作。
-
-
客户端容错
-
重试策略:客户端应实现重试逻辑,处理故障转移期间的短暂不可用。
-
多语言 SDK:选择支持 Sentinel 的客户端库(如 Java 的 Jedis、Python 的 redis-py)。
-
常用命令
- SENTINEL masters:查看主节点信息。
- SENTINEL slaves {master}:查看从节点信息。
- SENTINEL failover {master}:强制触发故障转移(无需ODOWN)。
- SENTINEL sentinels {master}:查看 Sentinel 节点列表。
Redis集群
集群的架构与数据分片
-
哈希槽(Hash Slot)分配
-
分片规则:对键的
CRC16
值取模(CRC16(key) % 16384
)确定所属槽位。 -
哈希标签(Hash Tag):使用
{}
指定部分键名计算哈希值,强制相关键分配到同一槽。 -
槽分配管理:集群启动时,槽均匀分配到主节点,可通过
CLUSTER ADDSLOTS
手动分配或自动平衡。
-
-
节点角色
-
主节点(Master):负责处理槽的读写请求,参与故障选举。
-
从节点(Replica):复制主节点数据,主节点故障时接替其槽。
-
集群模式节点:所有节点默认开启集群模式(
cluster-enabled yes
)。
-
-
集群拓扑
-
最小部署:至少 3 个主节点(每个主节点至少 1 个从节点),共 6 个节点。
-
节点发现:节点通过 Gossip 协议交换状态信息(如
MEET
命令将节点加入集群)。
-
集群的工作机制
-
客户端请求路由
-
Smart Client:客户端缓存槽与节点的映射关系,直接向目标节点发送请求,若节点返回
MOVED
重定向错误,更新缓存并重试。 -
Dumb Client:依赖代理(如 Redis Proxy)转发请求,客户端无需感知集群拓扑。
-
-
数据读写流程
-
键存在目标槽:直接由负责该槽的节点处理。
-
键不在目标槽:返回
MOVED
错误,客户端重定向到正确节点。 -
槽迁移中:返回
ASK
错误,客户端临时重定向到迁移目标节点。
-
-
故障转移(Failover)
-
主观下线(PFAIL):节点 A 在
cluster-node-timeout
(默认 15 秒)内未收到节点 B 的响应,标记 B 为PFAIL
。 -
客观下线(FAIL):超过半数主节点确认节点 B 不可达,标记为
FAIL
,触发故障转移。 -
从节点选举:从节点发起选举,获得多数主节点投票后成为新主节点;接管原主节点的槽,并广播更新集群配置。
-
-
数据迁移与平衡
-
手动迁移:使用
CLUSTER SETSLOT <slot> IMPORTING/MIGRATING
命令迁移槽。 -
自动平衡:通过
redis-cli --cluster rebalance
自动调整槽分布,均衡负载。
-
集群的优缺点
-
优点
-
水平扩展:支持 TB 级数据和高并发访问。
-
高可用:自动故障转移,数据多副本存储。
-
去中心化:无单点故障,节点自治。
-
-
缺点
-
功能限制:不支持跨槽事务、部分命令受限(如
KEYS *
)。 -
运维复杂度:需管理分片、迁移、节点扩缩容。
-
客户端兼容性:需使用集群感知的客户端或代理。
-
生产环境建议
-
部署与配置
-
节点规划:主节点至少 3 个,跨物理机或可用区部署,从节点数 ≥ 主节点数。
-
网络优化:确保节点间低延迟通信,避免跨地域部署。
-
内存管理:监控节点内存使用,避免数据倾斜导致单个节点过载。
-
-
数据均衡
-
预分片:设计键时使用哈希标签,确保相关数据集中。
-
定期平衡:使用
redis-cli --cluster rebalance
调整槽分布。
-
-
监控与故障排查
-
关键指标:
CLUSTER INFO # 查看集群健康状态 CLUSTER NODES # 查看节点角色、槽分配、状态 INFO memory # 监控内存使用
-
日志分析:关注
CLUSTERDOWN
告警和节点超时事件。
-
常用集群命令
- CLUSTER NODES:查看集群节点信息。
- CLUSTER INFO:检查集群状态。
- CLUSTER FAILOVER:手动故障转移(从节点执行)。
Sentinel 与 Cluster 的对比
特性 | Sentinel | Cluster |
---|---|---|
数据分片 | 不支持,需客户端或代理分片。 | 内置分片(16384 槽)。 |
高可用 | 主从复制 + 故障转移。 | 每个分片主从复制,自动故障转移。 |
扩展性 | 垂直扩展(主节点性能瓶颈)。 | 水平扩展(支持大规模数据集和高吞吐)。 |
适用场景 | 中小规模,非分片架构。 | 大规模数据,高并发场景。 |
Redis复制
主从复制的建立流程
-
Redis 复制的建立分为 全量同步(Full Sync) 和 部分同步(Partial Sync) 两种模式,优先尝试部分同步以减少资源消耗。
-
从节点初始化连接
-
命令触发:从节点执行
SLAVEOF <master-ip> <master-port>
,开启复制流程。 -
连接主节点:从节点向主节点发起连接,发送
PING
确认网络可达性。
-
-
身份验证(可选):若主节点配置了
requirepass
,从节点需发送AUTH <password>
完成认证。 -
同步数据集
-
全量同步(SYNC):
主节点生成当前数据的 RDB 快照,通过子进程写入磁盘。
将 RDB 文件发送给从节点,同时缓存期间的写命令至 复制缓冲区(Replication Buffer)。
从节点接收 RDB 并加载到内存,再执行缓冲区中的写命令,追上主节点状态。
-
部分同步(PSYNC):
从节点发送
PSYNC <replid> <offset>
,携带自身记录的复制 ID 和偏移量。主节点检查复制 ID 和偏移量是否匹配历史记录:
匹配:发送
+CONTINUE
,传输从偏移量之后的写命令(利用 复制积压缓冲区)。不匹配:触发全量同步(
+FULLRESYNC
)。
-
-
命令传播(Command Propagation):同步完成后,主节点持续将写命令发送给从节点,保持数据一致。
复制的核心机制
-
复制ID与偏移量
-
复制ID(Replication ID):主节点的唯一标识,每次主节点重启或角色变更时生成新 ID。
-
偏移量(Offset):主从节点各自维护一个偏移量,记录已复制的数据量。
-
-
复制积压缓冲区(Replication Backlog)
-
作用:主节点维护一个固定大小的环形缓冲区(默认 1MB),缓存最近的写命令。
-
触发部分同步:若从节点的偏移量在缓冲区范围内,直接发送增量数据。
-
配置参数
repl-backlog-size 1mb # 缓冲区大小 repl-backlog-ttl 3600 # 主节点无连接时缓冲区保留时间(秒)
-
-
心跳检测与断线重连
-
心跳机制:主从节点定期确认存活状态和复制进度;主节点超时未收到心跳(默认 60 秒)则认为从节点下线。
-
断线处理:从节点重连后尝试部分同步,失败则触发全量同步。
复制拓扑与高级特性
-
级联复制(主-从-从)
-
场景:主节点连接过多从节点时,可通过级联复制分摊压力。
-
配置:将从节点(Slave A)作为另一从节点(Slave B)的主节点。
-
-
延迟副本(Lagging Replica)
-
作用:人为设置从节点延迟同步,用于误操作恢复(需第三方工具支持)。
-
实现:通过
slave-repl-delay
配置延迟时间(Redis 自身不原生支持,需外部控制)。
-
复制的问题与优化
-
全量同步的资源消耗
-
问题:大数据集时生成和传输 RDB 文件会阻塞主节点并占用带宽。
-
优化:增大
repl-backlog-size
减少全量同步概率;使用无盘同步(repl-diskless-sync yes
),但需主节点内存充足。
-
-
复制延迟
-
原因:网络延迟、从节点负载过高或主节点写入压力大。
-
监控:通过
INFO replication
的slave_repl_offset
与master_repl_offset
差值判断延迟。 -
优化:提升网络带宽,减少主从节点跨地域部署;限制主节点写入速率(如使用管道批量写入)。
-
-
数据不一致
-
原因:主从网络中断导致部分数据未同步。
-
检测:使用
redis-cli --slave
模拟从节点检查数据差异。 -
修复:手动触发全量同步(
SLAVEOF NO ONE
+ 重新配置复制)。
-
相关文章:
Redis设计与实现——分布式Redis
Redis Sentinel(哨兵) Sentinel 的工作机制 故障检测(Failure Detection) 主观下线(Subjective Down):单个 Sentinel 实例检测到主节点在30 秒内无响应,标记其为 SDOWN。 客观下线…...
多指标组合策略
该策略(MultiConditionStrategy)是一种基于多种技术指标和市场条件的交易策略。它通过综合考虑多个条件来生成交易信号,从而决定买入或卖出的时机。 以下是对该策略的详细分析: 交易逻辑思路 1. 条件1:星期几和价格变化判断 - 该条件根据当前日期是星期几以及价格的变化…...

c#车检车构客户管理系统软件车辆年审短信提醒软件
# CMS_VehicleInspection 车检车构客户管理系统软件车辆年审短信提醒软件 # 开发背景 软件是给泸州某公司开发的车检车构客户管理系统软件。用于在车检年审到期前一个月给客户发送车检短信提醒 # 功能描述 主要功能:车辆年审前一个月给客户发年审短信提醒…...
Java爬虫能处理京东商品数据吗?
Java爬虫完全可以处理京东商品数据。通过Java爬虫技术,可以高效地获取京东商品的详细信息,包括商品名称、价格、图片、描述等。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。以下是一个完整的Java爬虫示例,展…...

通俗版解释CPU、核心、进程、线程、协程的定义及关系
通俗版解释(比喻法) 1. CPU 和核心 CPU 一个工厂(负责干活的总部)。核心 工厂里的车间(比如工厂有4个车间,就能同时处理4个任务)。 2. 进程 进程 一家独立运营的公司(比如一家…...

大语言模型 11 - 从0开始训练GPT 0.25B参数量 MiniMind2 准备数据与训练模型 DPO直接偏好优化
写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…...

USRP 射频信号 采集 回放 系统
USRP 射频信号采集回放系统 也可以叫做: 利用宽带RF录制和回放系统实现6G技术研究超宽带射频信号采集回放系统使用NI USRP平台实现射频信号录制和回放操作演示USRP也能实现多通道宽带信号流盘回放了! 对于最简单的实现方法就是使用LabVIEW进行实现 采…...

【skywalking】index“:“skywalking_metrics-all“},“status“:404}
skywalking 启动报错 java.lang.RuntimeException: {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [skywalking_metrics-all]","resource.t ype":"inde…...
handsome主题美化及优化:10.1.0最新版 - 1
文章目录 前言右侧导航栏主题标题居中页面两侧框架留白间距handsome 原生入站提示评论一键赞、踩、打卡时光机头像圆形logo 扫光赞赏按钮跳动鼠标点击特效复制版权提示彩色标签云及右栏数字自定义右键响应时间和访客总数全站字数统计版权提示时间流逝添加心知天气总结 前言 ha…...
(9)python开发经验
文章目录 1 os.path.join()拼接路径2 条件变量3 添加临时环境变量 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 os.path.join()拼接路径 os.path.join() 是 Python 中处理文件路径拼接的核心函…...

【C++详解】string各种接口如何使用保姆级攻略
文章目录 一、string介绍二、string使用构造函数析构函数赋值运算符重载string的遍历修改方法1、下标[]2、迭代器3、范围for 迭代器使用详解const迭代器反向迭代器(reverse) Capacity(容量相关)size/lengthmax_sizecapacityclear/emptyshrink_to_fit(缩容)reserve(扩…...

2025深圳杯D题法医物证多人身份鉴定问题四万字思路
Word版论文思路和千行Python代码下载:https://www.jdmm.cc/file/2712074/ 引言 法医遗传学中的混合生物样本分析,特别是短串联重复序列(Short Tandem Repeat, STR)分型结果的解读,是现代刑事侦查和身份鉴定领域的核心…...

【时时三省】(C语言基础)字符数组应用举例2
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 例题: 有3个字符串,要求找出其中“最大”者。 解题思路: 可以设一个二维的字符数组str,大小为320,即有3行20列(每一…...

Mysql触发器(附案例)
文章目录 触发器简介1、insert类型2、update类型3、delete类型总结 触发器简介 触发器是与表有关的数据库对象,指定在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性…...

使用DDR4控制器实现多通道数据读写(十二)
一、章节概括 这一节使用interconnect RTL ip核将DDR4与四个读写通道级联,在测试工程中,将四个通道同时写入/读出地址与数据,并使用modelsim仿真器仿真,四个通道同时发送写请求或读请求后,经过interconnect后ÿ…...

Kafka 生产者工作流程详解
以下是 Kafka 生产者工作流程的清晰分步解释,结合关键机制与用户数据: 1. 生产者初始化与数据发送 主线程创建生产者对象,调用 send(ProducerRecord) 发送消息。 拦截器(可选):可添加自定义逻辑(…...

完整卸载 Fabric Manager 的方法
目录 ✅ 完整卸载 Fabric Manager 的方法 1️⃣ 停止并禁用服务 2️⃣ 卸载 Fabric Manager 软件包 3️⃣ 自动清理无用依赖(可选) 4️⃣ 检查是否卸载成功 ✅ 补充(仅清除服务,不删包) ✅ 完整卸载 Fabric Mana…...

地下停车场调频广播无线覆盖系统:融合精准选频光纤传输均匀覆盖于一体的创新型地下车库广播无线覆盖平台
地下停车场调频广播无线覆盖系统:融合精准选频光纤传输均匀覆盖于一体的创新型地下车库广播无线覆盖平台 北京海特伟业科技有限公司任洪卓发布于2025年5月16日 在现代城市建设中,地下停车场已成为商业综合体、写字楼、住宅区及交通枢纽的标配设施。然而…...

【Linux】进程间通信(一):认识管道
📝前言: 这篇文章我们来讲讲进程间通信——认识管道 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入门基础&a…...

中大型水闸安全监测系统解决方案
一、方案概述 中大型水闸作为水利工程的重要组成部分,承担着调节水位、控制水流、防洪排涝等多重功能,在防洪减灾、水资源配置、生态环境改善等方面发挥着巨大作用。然而,由于历史原因,许多水闸存在建设标准偏低、质量较差、配套设…...

蓝桥杯12届国B 123
题目描述 小蓝发现了一个有趣的数列,这个数列的前几项如下: 1,1,2,1,2,3,1,2,3,4,⋯ 小蓝发现,这个数列前 1 项是整数 1,接下来 2 项是整数 1 至 2,接下来 3 项是整数 1 至 3,接下来 4 项是整数 1 至 4&…...

Harmony开发 List、Grid拖动自定义排序实现
1. Harmony开发 List、Grid拖动自定义排序实现 1.1. List拖动功能 本示例基于显式动画、List组件实现了ListItem的上下拖动、ListItem切换以及ListItem插入的效果。 实现思路:List手势拖动 @Entry @Component struct ListDragPage {@State private arr: string[] = [0, …...

迅龙3号基于兆讯MH22D3适配CST328多点触摸驱动开发笔记
MH22D3芯片是兆讯公司新推出的基于cortex-M3内核的新一代芯片,专注于显示应用,其主频高达216Mhz,64KB SRAM,512KB Flash,开发UI应用游刃有余。详细介绍请看:MH22D3新一代显控应用性价比之王 新龙微基于MH22…...
【001】.so文件分析之 ELF格式符号
.so 文件的结构标识主要依据 ELF 格式(Executable and Linkable Format) 一个 .so 文件其实是一个 ELF(可执行与可链接格式) 文件,里面包含多个结构标识符和段(Sections)用于支持动态加载、符号…...

QT之LayOut布局
文章目录 QFormLayoutQGridLayoutQFormLayout、QGridLayout、QHBoxLayout、QVBoxLayout综合案例用QFormLayout 代替 界面左边部分的QGridLayout QFormLayout #include "widget.h"#include <QFormLayout> #include <QLineEdit>Widget::Widget(QWidget *p…...

无需配置光猫,使用网管交换机配合路由器的IPTV功能实现单线复用
一、背景 弱电箱和电视柜只预留了一根网线,路由器放在电视柜,想实现既可以上网又可以正常观看iptv,本文提供了一种方法。 二、准备工作 1、带iptv功能的路由器;2、水星sg105pro网管交换机;3、网线若干; …...
C++类与对象--1 特性一:封装
C面向对象三大特性: (1)封装;(2)继承;(3)多态; C认为万物皆是对象,对象上有对应的属性(数据)和行为(方法&…...

Linux:计算机的层状结构
1.冯诺依曼体系结构 我们常见的计算机,如笔记本、台式机。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系结构。 CPU:运算器和控制器组成。运算器主要工作是做算术运算和逻辑运算。控制器主要工作是协调设备之间信息流动的…...

【SpringBoot】关于MP使用中配置了数据库表前缀的问题
problem 使用MP时,在application.yml配置文件中配置了MP匹配数据库表中的表名时的前缀作了规定,如下: 那么当我运行时报错了错误,报错信息如下: 因为我数据库表的书类表名是book,MP在匹配时使用了表名前…...

AI 赋能防艾宣传:从创意到实践,我的 IP 形象设计之旅
在数字技术飞速发展的今天,如何让严肃的健康传播变得更有温度、更具吸引力?作为一名参与防艾宣传实践的学生,我尝试通过 AI 工具构建专属 IP 形象,让防艾知识从 "被动接受" 转化为 "主动探索"。这篇文章将分享…...