Redis集群部署详解:主从复制、Sentinel哨兵模式与Cluster集群的工作原理与配置
集群部署形式
- 1、主从复制
- 1.1 工作机制
- 1.2 配置实现
- 1.3 优缺点
- 1.4 部署形式
- 1.5 主从复制优化
- 2、Sentinel 哨兵模式
- 2.1 工作机制
- 2.2 配置实现
- 2.3 优缺点
- 2.4 哨兵机制选举流程
- 2.5 脑裂问题解决方案
- 3、Redis Cluster
- 3.1 工作机制
- 3.2 配置实现
- 3.3 优缺点
- 3.4 故障转移
- 3.5 哈希槽为什么是16384个槽
- 3.6 集群扩容
1、主从复制
Redis 主从复制方案是 Redis 最基本的集群方案。实现了读写分离和数据备份。
- 1、主从复制集群包括1个主节点,多个从节点。主节点用来处理写数据,从节点用来读数据,实现
读写分离
。 - 2、多个从节点做负载均衡,分发读请求到不同的从节点,以提升系统
并发能力
。 - 3、从节点复制主节点数据相当于做了
数据备份
,保证了数据安全故障转移。
从节点通过 replicaof 配置项指定主节点进行数据同步复制。一般建议2-3个从节点,保证数据的安全可故障转移。
1.1 工作机制
主从复制数据同步过程包括全量同步、部分同步、命令同步。
- 1、全量同步过程
主节点生成 RDB 快照文件,将文件发送给从节点,从节点加载 RDB 文件初始化数据。
主节点发送 RDB 文件之后发生新的写命令会记录在复制积压缓冲区(Replication Backlog),在从节点完成数据初始化后,将这段期间内复制积压缓冲区的写命令发送给从节点,保证数据一致性。 - 2、部分同步过程
主节点将复制积压缓冲区中的写命令发送给从节点,保证数据一致性。 - 3、命令同步过程
主节点将每个写命令发送给从节点,从节点接收并执行这些写命令,保持与主节点的数据一致性。
1>全量同步触发时机
(1)从节点首次连接主节点会触发全量同步。
(2)从节点的复制偏移量(Replication Offset)不在主节点的复制积压缓冲区中时触发全量同步。
2>部分同步触发时机
(1)从节点的复制偏移量在主节点的复制积压缓冲区中。
1.2 配置实现
对于从节点一般通过 redis.conf 配置文件进行配置主节点,或者可以通过启动命令指定主节点
redis.conf 配置项在 Redis5.0 之前是 slaveof,在 Redis5.0 及之后的版本是 replicaof,此处以 replicaof 演示。
假设主节点部署 ip 和 port 为 192.168.1.101:6379,密码为 123456
- 1、redis.conf 配置文件方式
# Redis5.0之前通过slaveof配置指定集群主节点
# Redis5.0及之后命令为replicaof
# slaveof 192.168.1.101 6379
replicaof 192.168.1.101 6379
# 配置主节点密码,如果没有密码,可以注释掉该配置
masterauth 123456
- 2、启动命令方式
redis-server --replicaof 192.168.1.101 6379 --masterauth 123456
1.3 优缺点
1>优缺点
- 优点
数据备份
读写分离 - 缺点
主节点宕机,需要手工切换主节点
一写多读,不支持多写
2>适合场景
适合小规模应用,读写分离。不支持故障转移,不支持数据分片。
1.4 部署形式
形式 | 说明 | 适合场景 |
---|---|---|
一主一从 | 一个主节点一个从节点 | 适合小规模应用,从节点作为主节点的备份 |
一主多从 | 一个主节点多个从节点 | 适合读多写少的场景,从节点可以分担读请求 |
链式复制 | 从节点可以作为其他从节点的主节点的链式形式 | 适合网络带宽有限或跨地域复制的场景 |
链式复制形式:主节点 -> 从节点 A -> 从节点 B
1.5 主从复制优化
- 1、启用无盘复制。主节点不写入磁盘IO,直接网络传输给从节点。
- 2、调整主节点复制缓存区大小。
- 3、调整复制积压缓冲区。针对从节点断开重连场景,会从复制积压缓冲区同步数据,如果过小,会导致全量复制。
# 1、主节点启用无盘复制
repl-diskless-sync yes
# 2、主节点复制缓存区
# 256mb:缓冲区硬限制。64mb:缓冲区软限制。60:缓冲区达到软限制后,60 秒内不再接受新数据。
client-output-buffer-limit replica 256mb 64mb 60
# 3、调整复制积压缓冲区
repl-backlog-size 128mb
- 4、主节点写操作过多,导致数据同步不及时,考虑批量写数据;考虑使用管道技术将多个写操作合并成一次网络请求。
- 5、确保主从节点部署在一个机房,降低网络延迟
- 6、升级从节点的硬件配置
- 7、从节点负载均衡,降低单个节点负载
- 8、使用Redis6.0的多线程配置
扩展:Redis 6.0 的多线程 IO
Redis 多 IO 线程模型只⽤来处理处理网络数据的读写和协议解析,对于 Redis 的读写命令,依然是单线程处理。
⽹络处理经常是瓶颈,通过多线程并⾏处理可提⾼性能。
继续使⽤单线程执⾏读写命令,不需要为了保证 Lua 脚本、事务、等开发多线程安全机制,实现更简单
建议只在机器至少有4个内核时才启用多线程模型,且至少留下一个备用内核
io-threads 3
io-threads-do-reads yes
2、Sentinel 哨兵模式
Redis 的哨兵机制(Sentinel)是一种高可用解决方案,实现了读写分离和数据备份,保证了集群高可用
- 1、主从复制集群下,当主节点挂掉,无法支持写命令,集群就挂了。
- 2、通过增加名称为“哨兵”的哨兵节点,来定期监控集群中 Redis 各个主从节点的健康情况。
- 3、当发生主节点宕机的情况,多个哨兵节点会根据 Raft 算法选举一个哨兵领导者。
- 4、哨兵领导者来负责选举一个从节点作为主节点,并通知其他从节点切换新的主节点。
2.1 工作机制
Sentinel 哨兵模式工作过程包括哨兵监控、哨兵通知、自动故障转移
- Sentinel 哨兵模式包括 Sentinel 哨兵集群和 Redis 主从复制架构两部分。
- 哨兵集群包括多个哨兵节点,一般推荐奇数个哨兵节点,避免脑裂问题。
- 哨兵节点之间通过发布/订阅机制(Pub/Sub) 和 Gossip 协议实现互相发现和通信
- 启动哨兵节点后,哨兵节点会自动加入哨兵集群,无需手动配置互相发现
- 哨兵集群监控 Redis 主从复制架构下Redis节点的健康状态。
- 哨兵节点通过 Redis 主节点,自动发现主从复制架构中所有的 Redis 从节点。
- 哨兵节点通过心跳机制,监控 Redis 节点的健康状况。
- 主节点挂掉,哨兵节点会认为需要发生故障转移。
- 当同意触发故障转移的哨兵节点数量达到配置数量 quorum 时,哨兵集群节点通过 Raft 算法选举一个哨兵领导者。
- 哨兵领导者负责从健康的从节点中选举一个从节点作为主节点。
- 哨兵节点通知其他 Redis 从节点切换旧的主节点配置为新的主节点。
2.2 配置实现
Redis 主从架构配置此处就略过,可以参考上文主从复制下的配置实现。
Redis 从节点配置节点优先级,方便故障转移时选举新的 Redis 主节点。
下面是哨兵集群的配置
1>Redis 节点配置文件 redis.conf
# 从节点的优先级越高,越容易被选中
slave-priority 100
2>哨兵节点配置文件 sentinel.conf
配置 | 说明 |
---|---|
quorum | 指定需要多少个哨兵节点同意才能触发故障转移。 |
down-after-milliseconds | 主节点多久无响应后判定为宕机。 |
failover-timeout | 故障转移的超时时间。 |
# 哨兵监听的端口
port 16379
# 监控 Redis 主节点名称、IP 和端口,quorum 表示需要多少个哨兵同意才能触发故障转移
# sentinel monitor <master-name> <master-ip> <master-port> <quorum>
sentinel monitor mymaster 192.168.1.101 6379 2
# 主节点多久无响应后标记为下线(单位:毫秒)
sentinel down-after-milliseconds mymaster 5000
# 故障转移的超时时间(单位:毫秒)
sentinel failover-timeout mymaster 180000
# 故障转移时,最多有多少个从节点同时同步新的主节点
sentinel parallel-syncs mymaster 1
# 设置主节点的密码(如果主节点设置了密码)
sentinel auth-pass mymaster 123456
3>启动哨兵节点
比如 Redis 主从节点共3个,此处部署3个哨兵节点。
通过配置文件启动哨兵节点后,哨兵节点会自动加入哨兵集群,无需手动配置互相发现
- 哨兵的自动发现机制
- 每个哨兵节点会定期向一个特定的频道(sentinel:hello)发布消息。
- 消息中包含哨兵节点的信息(如 IP、端口、运行 ID 等)。
- 其他哨兵节点会订阅这个频道,从而接收到新哨兵节点的信息。
redis-server /path/to/sentinel-1.conf --sentinel
redis-server /path/to/sentinel-2.conf --sentinel
redis-server /path/to/sentinel-3.conf --sentinel
2.3 优缺点
1>优缺点
- 优点
自动故障转移,保证了集群的高可用 - 缺点
需要部署多个哨兵节点,并配置监控规则;
无法解决写的瓶颈,只有主节点写数据
2>适用场景
中小规模应用,高可用
2.4 哨兵机制选举流程
-
哨兵节点通过ping命令监控主节点。当主节点超过配置的最大响应时长
down-after-milliseconds
,当前哨兵节点会认为主节点宕机。 -
当认为主节点宕机的哨兵节点数量,超过配置的同意故障转移的哨兵数量
quorum
时,开始故障转移。 -
哨兵节点使用 Raft 算法选举一个领导者哨兵,来负责故障转移。
- 哨兵会向其他节点发送请求
- 哨兵节点会投票给第一个收到请求的节点
- 得票最多的哨兵节点作为领导者哨兵
-
领导者哨兵选举健康的从节点,针对从节点优先级和数据偏移量进行选举。如果配置了优先级slave-priority,哨兵会优先选择优先级高的从节点。如果优先级相同,哨兵会选择复制偏移量Replication Offset最大的从节点。
-
领导者哨兵会向选举的从节点发送
SLAVEOF NO ONE
命令,提升为主节点 -
领导者哨兵回向其他从节点发送
SLAVEOF
命令,通知切换新的主节点。哨兵会更新配置,记录新的主节点
注意:哨兵数量应为奇数。避免脑裂问题。最低需要3个哨兵节点来保证集群的高可用。
2.5 脑裂问题解决方案
由于网络分区或节点故障导致的,出现多个子集群,互相认为对方已下线不可用。每个集群有自己的主节点,并且都认为自己是健康的。
- 多数派原则 Quorum,做决策时,需要得到大多数节点的同意
- 心跳检测,节点之间互相检测健康状态
- 强制隔离故障节点,写操作时必须确保存在足够多的健康的从节点时,才能写,如Redis的
MIN-SLAVES-TO-WRITE
和MIN-SLAVES-MAX-LAG
;Redis Cluster的cluster-require-full-coverage
- 合理的集群节点数量,配置奇数个
3、Redis Cluster
Redis Cluster 是 Redis 官方提供的分布式解决方案,通过数据分片(Sharding)和主从复制实现高可用性和水平扩展,支持自动故障转移、数据分片
3.1 工作机制
Redis Cluster集群包括数据分片和主从复制
- Redis Cluster 将数据划分为 16384 个哈希槽,每个节点负责一部分槽。根据键的哈希值,将数据分散到各个哈希槽,即每个节点负责一部分数据。
- 每个节点有一个或多个从节点,当主节点挂掉,可以升级为主节点,保证高可用
- Redis Cluster 使用 Gossip 协议实现节点之间的通信和状态同步。节点之前定期交换信息维持集群状态。
3.2 配置实现
- 通过 redis.conf 配置文件开启集群模式
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
- 使用命令启动 Redis 节点
redis-server /path/to/redis.conf --cluster-enabled yes
- 使用命令创建 Redis Cluster 集群
redis-cli --cluster create <node1-ip>:<node1-port> <node2-ip>:<node2-port> ... --cluster-replicas 1
3.3 优缺点
1>优缺点
- 优点
数据分片,解决单节点写的性能瓶颈
自动故障转移
去中心化,没有主单点故障 - 缺点
手工配置复杂的分片规则
扩容需要手动迁移数据
2>适用场景
大规模应用,分布式高可用
3.4 故障转移
当主节点下线时,从节点会发起故障转移,选举新的主节点。
选举过程基于 Raft 算法(参考Sentinel哨兵选举),确保只有一个从节点升级为主节点
3.5 哈希槽为什么是16384个槽
(1)集群节点越多,心跳包的消息体携带的数据越多。如果节点超过1000个,会导致网络拥堵。因此 redis 的作者,不建议 redis cluster 节点数量超过 1000 个。16384 个插槽范围比较合适,当集群扩展到1000个节点时,也能确保每个master节点有足够的插槽。
(2)正常的心跳数据包携带节点的完整配置,它能以幂等方式来更新配置。每秒 redis 节点需要发送一定数量的 ping 消息作为心跳包,如果槽位为 65536,这个 ping 消息的消息头太大了,浪费带宽;如果采用 16384 个插槽,占空间 2KB (16384/8);如果采用 65536 个插槽,占空间 8KB (65536/8)。
(3)槽位越小,节点少的情况下,压缩率更高。
3.6 集群扩容
添加节点分配哈希槽
CLUSTER MEET
CLUSTER ADDSLOTS
迁移哈希槽
CLUSTER SETSLOT
移除节点
CLUSTER FORGET
常用命令
CLUSTER MEET <ip> <port>:将节点加入集群。
CLUSTER ADDSLOTS <slot>:为节点分配哈希槽。
CLUSTER DELSLOTS <slot>:移除节点的哈希槽。
CLUSTER SETSLOT <slot> MIGRATING <node-id>:迁移哈希槽。
CLUSTER SETSLOT <slot> IMPORTING <node-id>:接收哈希槽。
CLUSTER INFO:查看集群信息。
CLUSTER NODES:查看集群节点信息。
参考博客:
Redis集群详解
Redis 主从复制功能和部分重同步的实现
相关文章:
Redis集群部署详解:主从复制、Sentinel哨兵模式与Cluster集群的工作原理与配置
集群部署形式 1、主从复制1.1 工作机制1.2 配置实现1.3 优缺点1.4 部署形式1.5 主从复制优化 2、Sentinel 哨兵模式2.1 工作机制2.2 配置实现2.3 优缺点2.4 哨兵机制选举流程2.5 脑裂问题解决方案 3、Redis Cluster3.1 工作机制3.2 配置实现3.3 优缺点3.4 故障转移3.5 哈希槽为…...

LeetCode热题100(三十四) —— 23.合并K个升序链表
LeetCode热题100(三十四) —— 23.合并K个升序链表 题目描述代码实现思路一:选择排序(199ms)思路二:归并排序(2ms) 思路解析 你好,我是杨十一,一名热爱健身的程序员在Coding的征程中,不断探索与…...

kalilinux - 目录扫描之dirsearch
情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站,例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考,我们只指导https://www.example.com/ 但不知道它下面有什么文件,文…...

浅谈云计算04 | 云基础设施机制
探秘云基础设施机制:云计算的基石 一、云基础设施 —— 云计算的根基二、核心机制之网络:连接云的桥梁(一)虚拟网络边界ÿ…...
文件上传 分片上传
分片上传则是将一个大文件分割成多个小块分别上传,最后再由服务器合并成完整的文件。这种做法的好处是可以并行处理多个小文件,提高上传效率;同时,如果某一部分上传失败,只需要重传这一部分,不影响其他部分…...
【0391】Postgres内核 checkpointer process ① 启动初始化
相关文章: 【0108】checkpointer运行原理(概念篇)(1) 【0278】checkpointer 共享内存(CheckpointerShmem)初始化(3) 文章目录 1. 启动 checkpointer process1.1 初始化 checkpointer PID1.2 注册 signal1.3 初始化 last checkpoint time2. 确认 config 的 shared memo…...
链路追踪SkyWalking
链路追踪 链路追踪作用链路追踪的关键概念链路追踪的工作原理常用链路追踪工具链路追踪的实现步骤链路追踪的典型场景 SkyWalkingSkyWalking 的主要功能SkyWalking 的架构安装 SkyWalking从 SkyWalking 的官方 GitHub 仓库 下载最新版本。配置后端存储SkyWalking使用࿰…...

Uniapp判断设备是安卓还是 iOS,并调用不同的方法
在 UniApp 中,可以通过 uni.getSystemInfoSync() 方法来获取设备信息,然后根据系统类型判断当前设备是安卓还是 iOS,并调用不同的方法。 示例代码 export default {onLoad() {this.checkPlatform();},methods: {checkPlatform() {// 获取系…...

计算机网络 (42)远程终端协议TELNET
前言 Telnet(Telecommunication Network Protocol)是一种网络协议,属于TCP/IP协议族,主要用于提供远程登录服务。 一、概述 Telnet协议是一种远程终端协议,它允许用户通过终端仿真器连接到远程主机,并在远程…...
rtthread学习笔记系列-- 23 环形缓冲块 ringblock
文章目录 23 环形缓冲块 ringblock23.1 初始化23.2 PUT & GET 块23.3 块释放23.4 rt_rbb_blk_queue_get23.5 rt_rbb_blk_alloc https://github.com/wdfk-prog/RT-Thread-Study 23 环形缓冲块 ringblock 环形块状缓冲区简称为:rbb。与传统的环形缓冲区不同的是&…...

HunyuanVideo 文生视频模型实践
HunyuanVideo 文生视频模型实践 flyfish 运行 HunyuanVideo 模型使用文本生成视频的推荐配置(batch size 1): 模型分辨率(height/width/frame)峰值显存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本项目适用于使用 N…...
Qt——QTableWidget 限制单元格输入范围的方法(正则表达式输入校验法、自定义代理类MyItemDelegrate)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》...
深度学习论文: CAS-ViT: Convolutional Additive Self-attention Vision Transformers
深度学习论文: CAS-ViT: Convolutional Additive Self-attention Vision Transformers for Efficient Mobile Applications CAS-ViT: Convolutional Additive Self-attention Vision Transformers for Efficient Mobile Applications PDF:https://arxiv.org/pdf/2408.03703 PyT…...

PyCharm文档管理
背景:使用PyCharmgit做文档管理 需求:需要PyCharm自动识别docx/xslx/vsdx等文件类型,并在PyCharm内点击文档时唤起系统内关联应用(如word、excel、visio) 设置步骤: 1、file -》 settings -》file types 2、在Files opened i…...

QNAP 上常用的几款软件
当我们谈到 NAS(Network Attached Storage)时,QNAP 凭借多年的产品迭代、稳定的硬件性能和不断丰富的软件生态,已成为很多家庭及中小型企业的首选。除了存储本身,QNAP 提供的各种官方软件和应用,也为用户带…...

LabVIEW智能水肥一体灌溉控制系统
本文详细介绍了一种基于LabVIEW的智能水肥一体灌溉控制系统的设计与实现。该系统采用模糊控制策略,能够自动调节土壤湿度和肥液浓度,满足不同作物在不同生长阶段的需求,有效提高水肥利用效率,对现代精准农业具有重要的实践和推广价…...

提问:玩游戏输入法总弹出来咋回事哎
玩游戏时输入法总弹出来的问题,通常与电脑的输入法设置、操作系统配置以及游戏程序的兼容性有关。以下是一些常见的解决方法: 一、修改输入法快捷键 禁用不必要的输入法: 在系统的语言设置中,暂时禁用非活动的输入法,…...

链家房价数据爬虫和机器学习数据可视化预测
完整源码项目包获取→点击文章末尾名片!...

【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解
分布式系统理论:CAP 与 BASE 详解 一、CAP 定理 背景与定义:1998 年由加州大学科学家埃里克布鲁尔提出,分布式系统存在一致性(Consistency)、可用性(Availability)、分区容错性(Part…...

第十二章:算法与程序设计
文章目录: 一:基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二:程序设计 基础 1.常数 …...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...