目标
理解一下 redis 单点、哨兵、集群模式
chat
redis 的三种部署模式
理解 Redis 的三种部署模式(单点、哨兵、集群)是掌握 Redis 架构设计的关键。
我们可以从以下六个角度来系统理解它们:
🌱 1. 概念与架构 ⚙️ 2. 读写机制 💀 3. 故障转移机制 🌐 4. 客户端访问方式 ⚡ 5. 优缺点对比 🧭 6. 典型使用场景
🧩 一、单点模式(Standalone)
🏗️ 架构概念
最简单的 Redis 部署方式:
只有一个 Redis 实例(一个进程),负责所有数据读写。
Client ⇆ Redis Server
- 所有 key 都存储在这个单实例中;
- 不存在主从复制;
- 不存在自动容灾机制。
⚙️ 读写机制
- 所有命令都直接在一个 Redis 实例上执行;
- 数据保存在内存中,定期通过 RDB / AOF 落盘。
💀 故障转移
- 无高可用机制:Redis 一旦挂掉,业务就不可用;
- 需要人工重启或脚本监控。
🌐 客户端连接
- 直接指定一个 IP + 端口;
- 配置简单;
- 不需要任何额外中间层。
spring.redis.host: 127.0.0.1
spring.redis.port: 6379
⚖️ 优缺点
优点 | 缺点 |
---|---|
架构简单,易部署 | 单点故障,无法自动恢复 |
性能高,无主从延迟 | 无高可用 |
配置最少 | 无扩展性 |
🧭 典型场景
- 本地开发环境;
- 单机小项目;
- 临时缓存或测试用途。
🛰️ 二、哨兵模式(Sentinel)
🏗️ 架构概念
Sentinel 模式 = 主从复制 + 自动故障转移。
它由:
- 1 个主节点(Master)
- 若干从节点(Slave)
- 若干 Sentinel 监控节点组成。
+----------------+
| Sentinel A |
+----------------+
|
| monitor
v
+---------+ +---------+
| Master | <-----> | Slave1 |
+---------+ +---------+
^ |
| v
| +---------+
| | Slave2 |
| +---------+
|
+------> Sentinels detect & promote Slave
⚙️ 读写机制
- 写操作 → 发送到 主节点(Master)
- 读操作 → 可发到 主节点或从节点(可读从)
- 从节点通过 复制(replication) 同步主节点数据
💀 故障转移机制
- Sentinel 通过心跳监控 Master;
- 若超过
down-after-milliseconds
未响应; - Sentinel 进入 “主观下线(SDOWN)”;
- 多个 Sentinel 协商(投票)一致后确认 “客观下线(ODOWN)”;
- 从节点中选举一个新 Master;
- 客户端更新新的 Master 地址并继续工作。
整个过程是自动化的主从切换。
🌐 客户端连接方式
客户端不会直接连接固定主节点,而是:
- 连接到哨兵(Sentinel);
- Sentinel 通知客户端当前的主节点是谁。
Spring Boot 示例:
spring.redis.sentinel.master: mymaster
spring.redis.sentinel.nodes: host1:26379,host2:26379,host3:26379
⚖️ 优缺点
优点 | 缺点 |
---|---|
自动主从切换,高可用 | 主从切换时短暂不可用 |
读写分离可提升性能 | 写性能受限(仍为单主) |
支持横向扩展读节点 | 无法分片扩容 |
Sentinel 可动态发现 Master | 配置复杂度略高 |
🧭 典型场景
- 需要高可用但数据规模不大的中小型系统;
- 常见于微服务缓存层;
- 一主多从结构。
⚙️ 三、集群模式(Cluster)
🏗️ 架构概念
Redis Cluster 是 Redis 官方提供的 分布式高可用方案。
通过哈希槽(Hash Slot)机制实现数据分片与节点自治。
架构如下:
+---------+ +---------+ +---------+
| Master1 | | Master2 | | Master3 |
+---------+ +---------+ +---------+
| \ | \ | \
| \ | \ | \
+------+ +------+ +------+
|Slave1| |Slave2| |Slave3|
+------+ +------+ +------+
(16384 slots 分配到各 Master)
⚙️ 读写机制
- 每个 Master 负责部分 key(通过 16384 个槽位分配);
- 写操作 → 发到该 key 所在的 Master;
- 读操作 → 默认 Master,也可读 Slave;
- 从节点仅负责数据冗余,不参与写入。
💀 故障转移机制
- 每个节点都保存集群拓扑;
- 节点间通过 gossip 协议通信;
- Master 掉线后,其 Slave 自动晋升为新 Master;
- 客户端可自动重定向(MOVED/ASK)。
🌐 客户端连接方式
客户端必须是 支持 Redis Cluster 协议的客户端:
spring.redis.cluster.nodes: host1:7001,host2:7002,host3:7003
spring.redis.cluster.max-redirects: 3
RedisTemplate / Lettuce / JedisCluster 都会自动路由请求。
⚡ 哈希槽(Hash Slot)机制详解
- Redis Cluster 把整个 key 空间划分为 16384 个 slot;
- 每个 Master 管理一部分 slot;
-
key 对应 slot 的算法:
slot = CRC16(key) % 16384
- 客户端通过槽位路由到正确节点;
-
若 key 落在其他节点,Redis 会返回:
MOVED slot 127.0.0.1:7002
客户端随后会更新本地路由缓存。
⚖️ 优缺点
优点 | 缺点 |
---|---|
真正的水平扩展(分片) | 不支持跨节点事务 |
自动高可用 | 管理复杂 |
故障自动转移 | pipeline / Lua 跨 slot 受限 |
数据分散存储 | 部分命令(如 keys, mget)受限 |
🧭 典型场景
- 大规模缓存;
- 分布式会话、排行榜;
- 数据量 > 单机内存;
- 高可用 + 水平扩展要求。
🧮 四、三种模式的对比总览
特性 | Standalone | Sentinel | Cluster |
---|---|---|---|
数据副本 | 1 | 1主+多从 | 多主多从 |
容错能力 | ❌ 无 | ✅ 有 | ✅ 有 |
扩展性 | ❌ 无 | ❌ 读扩展 | ✅ 水平扩展 |
自动故障转移 | ❌ | ✅ | ✅ |
支持分片 | ❌ | ❌ | ✅ |
支持事务 | ✅ | ✅ | ⚠️ 仅单 slot |
支持 pipeline | ✅ | ✅ | ⚠️ 仅单节点 |
客户端复杂度 | 低 | 中 | 高 |
推荐场景 | 开发/测试 | 高可用中小项目 | 大规模高并发系统 |
🧭 五、一个形象类比
类比场景 | 描述 |
---|---|
单点模式 | 一台单独的服务器,老板干所有活,累死算你的。 |
哨兵模式 | 老板+几个备份员工,老板倒下时备份自动顶上。 |
集群模式 | 多个分店(各干一部分活),每个分店都有副店长备用。 |
✅ 六、总结一句话:
- 单点模式:简单高效,但没高可用。
- 哨兵模式:高可用 + 主从复制,适合中小规模。
- 集群模式:分片 + 高可用,适合大规模高并发场景。
小结
理解为什么这样,反而比直接知道答案更加重要。