第 7 课:Redis 高可用架构
Redis 在企业级项目中不仅要求高性能,还要求高可用、高并发和高扩展性。
本章将学习:
- 主从复制(Master-Slave Replication)
- 哨兵模式(Sentinel)
- Redis Cluster 集群
- Spring Boot 整合 Redis Cluster
7.1 主从复制
什么是主从复制?
主从复制(Master-Slave Replication)是 Redis 提供的数据同步机制。
架构如下:
Master(主节点)
|
-----------------
| |
Slave1 Slave2
(从节点) (从节点)
工作方式:
- 主节点负责写操作
- 从节点负责读操作
- 主节点自动同步数据到从节点
配置步骤
1、复制配置文件
cp redis.conf redis-slave1.conf
cp redis.conf redis-slave2.conf
2、修改从节点配置
redis-slave1.conf
port 6380
replicaof 127.0.0.1 6379
replica-read-only yes
redis-slave2.conf
port 6381
replicaof 127.0.0.1 6379
replica-read-only yes
3、启动服务
redis-server redis.conf
redis-server redis-slave1.conf
redis-server redis-slave2.conf
4、查看复制状态
redis-cli -p 6379 info replication
返回:
role:master
connected_slaves:2
主从复制优点
| 优点 | 说明 |
|---|---|
| 读写分离 | 提高并发能力 |
| 数据备份 | 提升数据安全性 |
| 减轻主库压力 | 查询请求分散到从节点 |
主从复制缺点
| 缺点 | 说明 |
|---|---|
| 主节点单点故障 | 主库挂掉后服务不可写 |
| 手动切换 | 故障恢复需要人工干预 |
7.2 哨兵模式(Sentinel)
什么是 Sentinel?
Redis Sentinel 是 Redis 官方提供的高可用解决方案。
作用:
- 监控 Redis 节点
- 自动故障转移
- 自动选举新的主节点
- 自动通知客户端
架构:
Sentinel1
|
Sentinel2
|
Sentinel3
|
Master
/ \
Slave1 Slave2
Sentinel 工作流程
1、监控
持续检查:
- Redis 是否存活
- 主从是否正常同步
2、故障发现
如果 Master 超时:
SDOWN
主观下线。
3、投票确认
多个 Sentinel 投票:
ODOWN
客观下线。
4、故障转移
自动选举:
Slave → New Master
Sentinel 配置
创建:
vim sentinel.conf
内容:
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
启动 Sentinel
redis-sentinel sentinel.conf
或者:
redis-server sentinel.conf --sentinel
生产环境建议
至少部署:
3个 Sentinel
原因:
避免脑裂问题。
Sentinel 优点
| 优点 | 说明 |
|---|---|
| 自动故障转移 | 主节点挂掉自动恢复 |
| 自动选主 | 无需人工干预 |
| 高可用 | 服务不中断 |
Sentinel 缺点
| 缺点 | 说明 |
|---|---|
| 单主架构 | 写性能受限 |
| 数据无法分片 | 无法水平扩容 |
7.3 Redis Cluster 集群
为什么需要 Cluster?
主从 + Sentinel 可以解决:
- 高可用
但不能解决:
- 海量数据存储
- 水平扩容
因此出现:
Redis Cluster
Cluster 架构
Redis Cluster 采用:
16384 个 Hash Slot
数据会自动分布到多个节点。
示例:
Master1 -> Slot 0~5460
Master2 -> Slot 5461~10922
Master3 -> Slot 10923~16383
每个主节点再挂一个从节点:
Master1 <-> Slave1
Master2 <-> Slave2
Master3 <-> Slave3
形成:
3主3从
Cluster 特点
自动分片
Redis 自动决定:
key 存到哪个节点
自动故障转移
Master 宕机:
Slave 自动升级
水平扩容
增加节点即可扩容。
Cluster 配置
节点配置
例如:
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
appendonly yes
其余节点:
7002
7003
7004
7005
7006
同理配置。
启动所有节点
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
redis-server redis-7006.conf
创建集群
redis-cli --cluster create \
127.0.0.1:7001 \
127.0.0.1:7002 \
127.0.0.1:7003 \
127.0.0.1:7004 \
127.0.0.1:7005 \
127.0.0.1:7006 \
--cluster-replicas 1
查看集群状态
redis-cli -p 7001 cluster nodes
查看:
redis-cli -p 7001 cluster info
Cluster 优点
| 优点 | 说明 |
|---|---|
| 自动分片 | 支持海量数据 |
| 水平扩容 | 节点可动态增加 |
| 自动故障转移 | 高可用 |
| 高并发 | 多节点共同处理请求 |
Cluster 缺点
| 缺点 | 说明 |
|---|---|
| 配置复杂 | 运维成本高 |
| 多键操作受限 | key 必须在同一个 Slot |
| Lua 脚本限制 | 涉及跨 Slot 会失败 |
7.4 Spring Boot 整合 Redis Cluster
application.yml
spring:
redis:
cluster:
nodes:
- 127.0.0.1:7001
- 127.0.0.1:7002
- 127.0.0.1:7003
- 127.0.0.1:7004
- 127.0.0.1:7005
- 127.0.0.1:7006
timeout: 2000ms
lettuce:
pool:
max-active: 20
max-idle: 5
min-idle: 2
测试代码
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testCluster() {
redisTemplate.opsForValue().set("name", "redis-cluster");
Object value = redisTemplate.opsForValue().get("name");
System.out.println(value);
}
高可用方案对比
| 方案 | 高可用 | 自动故障转移 | 数据分片 | 扩展能力 |
|---|---|---|---|---|
| 单机 Redis | ❌ | ❌ | ❌ | ❌ |
| 主从复制 | 部分支持 | ❌ | ❌ | ❌ |
| Sentinel | ✅ | ✅ | ❌ | ❌ |
| Cluster | ✅ | ✅ | ✅ | ✅ |
企业项目选型建议
| 场景 | 推荐方案 |
|---|---|
| 学习阶段 | 单机 Redis |
| 中小型项目 | 主从 + Sentinel |
| 高并发系统 | Redis Cluster |
| 亿级数据量 | Redis Cluster |
课后练习
练习 1
搭建 Redis 主从复制架构。
要求:
- 1 个主节点
- 2 个从节点
- 测试数据同步
练习 2
搭建 Sentinel。
要求:
- 至少 3 个 Sentinel
- 模拟主节点宕机
- 观察自动切换过程
练习 3
搭建 Redis Cluster。
要求:
- 3 主 3 从
- 测试数据分片
- 测试自动故障转移
练习 4
Spring Boot 连接 Redis Cluster。
要求:
- 完成配置
- 完成读写测试
- 验证故障转移后仍能正常访问
至此,你已经掌握:
- Redis 五大数据结构
- Redis 持久化
- Redis 事务
- Redis Lua
- Redis 分布式锁
- Redis 缓存
- Redis 限流
- Redis 排行榜
- Redis 主从复制
- Redis Sentinel
- Redis Cluster
已经达到企业项目 Redis 开发与面试的核心要求。