一、引言
Redis 在实际生产中不仅要保证高性能,还要保证高可用和可扩展。单机 Redis 虽然快,但存在单点故障风险,无法承载大规模数据量和高并发场景。
为了解决这些问题,Redis 提供了两大核心高可用与扩展方案:
-
哨兵模式(Sentinel):主从复制 + 自动故障转移
-
集群模式(Cluster):数据分片 + 主从高可用
二、Redis 哨兵(Sentinel)原理
1. 架构概览
哨兵模式是在主从复制(Master-Slave Replication)基础上增加了 故障监控 和 自动故障转移 的机制。典型架构:
-
一个主节点(Master)
-
多个从节点(Slave)
-
多个哨兵节点(Sentinel)监控集群健康状态
2. 核心功能
-
监控(Monitoring):周期性
PING主从节点,判断是否存活 -
通知(Notification):发现节点状态变化,通过
Pub/Sub通知其它 Sentinel 和客户端 -
自动故障转移(Automatic Failover):当 Master 挂掉时,选择一个 Slave 提升为 Master
-
配置提供者(Configuration Provider):客户端可通过 Sentinel 获取当前主节点信息
3. 故障检测机制
哨兵的故障判断分为两步:
-
主观下线(SDOWN):单个 Sentinel 认为节点不可用
-
客观下线(ODOWN):达到 quorum 数量的 Sentinel 都认同某节点不可用
参数
quorum定义了判定 ODOWN 所需的最少哨兵数。
4. 故障转移流程
-
多个 Sentinel 通过
is-master-down-by-addr命令交换状态 -
发起 领导者选举(基于 Raft 思想,取多数同意的 Sentinel 作为 leader)
-
Leader Sentinel 从可用 Slave 中选择一个(优先级 → 复制偏移量 → ID 最小)
-
发送
SLAVEOF NO ONE将其提升为新 Master -
通知其他从节点执行
SLAVEOF <new-master> -
更新配置文件,广播新的主节点信息
5. Sentinel 的优缺点
-
优点
-
配置简单,适合中小规模高可用部署
-
自动故障转移,减少人工干预
-
-
缺点
-
不支持数据分片
-
故障转移期间可能丢失部分数据(异步复制延迟)
-
三、Redis 集群(Cluster)原理
1. 架构概览
Redis Cluster 通过 哈希槽(Hash Slot) 实现数据分片,并为每个分片配备主从节点,既能 水平扩展 又能 保证高可用。
-
默认 16384 个哈希槽
-
每个主节点负责一部分槽
-
从节点作为副本提供冗余
2. 数据路由机制
客户端访问数据时:
-
计算键的 CRC16 值
-
对 16384 取模,确定哈希槽
-
发送请求到负责该槽的主节点
如果访问的节点不是目标槽的节点,会返回
MOVED或ASK重定向信息,客户端再去正确节点请求。
3. Gossip 协议
集群节点通过 Gossip 协议交换状态信息:
-
ping/pong 消息 用于检测节点健康
-
fail 消息 用于广播节点下线
-
保证集群最终一致性而非强一致性
4. 故障转移流程
-
当多数主节点检测到某主节点 FAIL 时,进入故障转移
-
从节点发起选举(基于配置纪元
configEpoch版本号) -
获胜的从节点执行
SLAVEOF NO ONE升级为主节点 -
重新分配槽位并广播
5. Redis Cluster 的优缺点
-
优点
-
自动分片,线性扩展
-
主从高可用
-
客户端直连节点,减少代理层延迟
-
-
缺点
-
不支持多键跨槽事务(除非用
hash tags) -
配置相对复杂
-
容忍度有限:每个分片主从全部挂掉则数据不可用
-
四、应用场景
-
Sentinel 适合:单业务数据库高可用(如缓存层、排行榜等)
-
Cluster 适合:数据量大、访问分布均匀的场景(如社交 Feed、用户画像)
五、典型使用这些原理的系统和中间件
-
ZooKeeper:分布式协调,类似 Sentinel 的 Leader 选举机制
-
Etcd:使用 Raft 协议做强一致性,类似 Cluster 的选主
-
Kafka:分区副本 + Leader 选举,类似 Cluster 的分片模式
六、总结
-
Sentinel 偏向于 高可用,Cluster 兼顾 高可用+水平扩展
-
二者可结合使用,例如在每个分片内部署 Sentinel 做内部高可用
5346

被折叠的 条评论
为什么被折叠?



