目录
Redis主从
一、主从架构概述
1.1 为什么需要主从架构
Redis作为高性能的内存数据库,单节点架构存在明显的局限性:
-
性能瓶颈:单节点Redis的QPS通常为8-10万,无法满足高并发场景
-
可用性风险:单点故障会导致服务完全不可用
-
维护困难:备份、扩容等操作影响线上服务
主从架构通过数据复制实现了:
-
读写分离:主节点处理写请求,从节点处理读请求
-
数据冗余:多副本存储提高数据安全性
-
高可用基础:为故障自动转移提供支持
1.2 主从架构核心概念
角色 | 职责 | 特点 |
---|---|---|
Master | 处理所有写操作 | 唯一写入点,数据变更源头 |
Slave | 复制主节点数据,处理读请求 | 可配置多个,支持读写分离 |
二、主从数据同步机制
2.1 全量同步流程
当从节点首次连接主节点或无法进行增量同步时,会触发全量同步:
-
身份验证阶段:
-
从节点发送
PSYNC
命令,携带自己的replid
和offset
-
主节点校验
replid
发现不匹配,触发全量同步
-
-
数据准备阶段:
-
主节点执行
bgsave
生成RDB快照 -
将RDB文件传输给从节点
-
同时缓存期间的新命令到
repl_backlog
-
-
数据加载阶段:
-
从节点清空旧数据
-
加载RDB文件重建数据库
-
执行
repl_backlog
中的缓冲命令
-
关键参数解析:
-
replid
:数据集唯一标识,主从节点必须一致 -
offset
:命令偏移量,用于标识同步进度 -
repl_backlog
:环形缓冲区,默认大小1MB
2.2 增量同步机制
当从节点短暂断开后重新连接时,会尝试增量同步:
-
从节点发送自己的
replid
和offset
-
主节点验证
replid
一致后:-
检查
offset
是否在repl_backlog
范围内 -
将
offset
之后的命令发送给从节点
-
-
从节点执行这些命令完成数据同步
环形缓冲区工作原理:
text
[已同步][待同步][可覆盖] |---A---|----B---|----C---|
-
A:已同步到所有从节点的命令
-
B:待同步的命令
-
C:可被新命令覆盖的区域
当从节点延迟过大导致offset
被覆盖时,会退化为全量同步。
2.3 同步协议演进
Redis同步协议经历了多个版本的优化:
-
Redis 2.8之前:仅支持全量同步
-
Redis 2.8+:引入PSYNC协议,支持增量同步
-
Redis 4.0+:优化PSYNC2,支持故障转移后的部分同步
三、总结
Redis主从架构通过精巧的同步机制,在保证性能的同时实现了数据冗余。理解PSYNC协议和repl_backlog
的工作原理,是优化主从同步性能的关键。在实际生产环境中,建议:
-
根据业务需求合理设置缓冲区大小
-
实施分级监控策略
-
定期进行故障转移演练
-
结合哨兵或Cluster实现高可用
Redis哨兵
一、哨兵机制概述
1.1 为什么需要哨兵
Redis主从架构虽然解决了读写分离和数据冗余的问题,但仍然存在关键挑战:
-
故障检测:如何快速发现主节点故障
-
自动切换:如何无缝完成主从角色转换
-
服务发现:客户端如何感知拓扑变化
哨兵(Sentinel)是Redis官方提供的高可用解决方案,它通过分布式监控和自动故障转移,实现了真正意义上的Redis高可用架构。
1.2 哨兵核心功能
功能模块 | 实现机制 | 业务价值 |
---|---|---|
集群监控 | 定期ping检测节点健康状态 | 实时掌握集群运行状态 |
自动故障转移 | 基于投票机制完成主节点切换 | 服务不间断,提高可用性 |
配置中心 | 维护最新集群拓扑信息 | 客户端自动获取有效节点 |
通知系统 | 通过发布订阅机制推送状态变更 | 便于集成监控告警系统 |
二、哨兵架构深入解析
2.1 典型部署架构
https://example.com/redis-sentinel-arch.png
组件说明:
-
Sentinel节点:通常部署3个或以上奇数个节点组成集群
-
Redis主从:1个主节点+N个从节点组成数据集群
-
客户端:通过Sentinel获取当前可用节点信息
部署建议:
-
Sentinel应与Redis实例分开部署
-
至少3个Sentinel节点避免脑裂
-
跨机架/可用区部署提高容灾能力
2.2 集群监控原理
2.2.1 健康检查机制
-
主观下线(SDOWN):
-
每个Sentinel每1秒向所有节点发送PING命令
-
超过
down-after-milliseconds
(默认30秒)无响应则标记主观下线
-
-
客观下线(ODOWN):
-
Sentinel节点通过
SENTINEL is-master-down-by-addr
命令交换判断结果 -
当quorum数量的Sentinel认为主节点不可用,则标记客观下线
-
redis
# 关键配置参数 sentinel monitor mymaster 127.0.0.1 6379 2 # 指定quorum=2 sentinel down-after-milliseconds mymaster 30000
2.2.2 信息交换机制
Sentinel节点之间通过Redis的__sentinel__:hello频道进行通信,交换:
-
对主节点的判断结果
-
当前Sentinel的纪元(epoch)
-
已知的从节点信息
2.3 故障转移流程
当主节点被确认客观下线后,触发自动故障转移:
2.3.1 领导者选举
-
每个发现主节点下线的Sentinel都会尝试成为领导者
-
采用Raft算法变种进行选举:
-
每个Sentinel都有唯一epoch
-
最先检测到下线的Sentinel优先
-
-
获得多数票的Sentinel成为领导者
2.3.2 新主节点选择
领导者Sentinel按照以下优先级选择新主节点:
-
网络健康度:
-
排除断开时间超过
(down-after-milliseconds * 10)
的从节点
-
-
优先级:
replica-priority 100 # 值越小优先级越高
-
数据完整性:
-
选择复制偏移量(repl_offset)最大的节点
-
-
运行ID:
-
选择运行ID较小的节点作为最终判断
-
2.3.3 切换执行流程
-
提升新主:
SLAVEOF NO ONE
-
切换从节点:
SLAVEOF new_master_ip new_master_port
-
旧主处理:
-
当旧主恢复后自动变为从节点
-
通过
CONFIG REWRITE
持久化配置变更
-
三、总结
Redis哨兵机制通过以下核心设计实现了高可用:
-
分布式监控:多Sentinel节点协同工作,避免单点误判
-
共识决策:基于quorum的客观下线判断,防止脑裂
-
自动恢复:完善的故障检测和转移流程,最小化人工干预
生产环境部署建议:
-
至少部署3个Sentinel节点
-
合理设置down-after-milliseconds参数
-
实现客户端重试逻辑
-
建立完善的监控体系