在为 Redis 选择高可用方案时,Sentinel(哨兵)和 Cluster(集群)是最常见的两种选择。虽然它们都能提供自动故障转移功能,但设计初衷和适用场景有着显著区别。
核心对比
| 特性 | Redis Sentinel (哨兵模式) | Redis Cluster (集群模式) |
|---|---|---|
| 设计初衷 | 侧重 高可用 | 侧重 可扩展性 (Scalability) |
| 数据分片 | 不支持。每个节点都保存全量数据 | 支持。数据分布在不同的哈希槽中 |
| 数据量限制 | 受限于单机物理内存 | 可以横向扩展,理论支持海量数据 |
| 读写能力 | 单主节点。写能力受限,读能力可通过从机扩展 | 多主节点。写能力随节点增加而增强 |
| 故障发现 | 由 Sentinel 集群外部监控并判定 | 节点之间通过 Gossip 协议互相监控判定 |
| 复杂度 | 较低。易于配置和管理 | 较高。涉及分片、重定向、哈希槽迁移等 |
| 客户端支持 | 需连接 Sentinel 获取主地址 | 需支持 Cluster 协议(处理 MOVED 重定向) |
详细差异分析
1. 数据分布与扩展性
- Sentinel:属于主从架构的升级版。虽然可以有多个从节点,但每个节点存储的都是完全相同的数据。如果你的数据量超过了单台服务器的内存容量,Sentinel 无法解决这个问题。
- Cluster:通过分片将数据分散存储。每个主节点只负责 16384 个哈希槽中的一部分。你可以通过增加节点来线性提升集群的总内存容量和并发写能力。
2. 故障转移机制
- Sentinel:是一个独立的进程集群。它像是一个“裁判”,在外部盯着 Redis 节点。当裁判达成共识认为 Master 挂了,就去扶持一个新的 Master。
- Cluster:是无中心化的。节点之间通过 Gossip 协议不停地交换心跳。当超过半数的主节点认为某个节点挂了,集群内部会自动发起选举和切换。
3. 运维复杂度
- Sentinel:部署相对简单,对现有架构的侵入性较小。
- Cluster:对 Key 的操作受到限制(例如
MGET等多键操作要求 Key 必须在同一个哈希槽中),且在进行扩缩容(Resharding)时需要处理哈希槽的迁移,运维压力较大。
如何选择?
优先选择 Sentinel 的场景:
- 你的数据量较小,单台服务器的内存完全能够支撑。
- 你更在乎架构的简单性和稳定性。
- 主要需求是主从备份和自动故障恢复。
优先选择 Cluster 的场景:
- 你的数据量巨大,单机内存无法装下。
- 你的系统有极高的并发写请求,需要多个主节点共同分担。
- 你需要系统具备良好的横向扩展能力,能通过加机器解决性能瓶颈。