第 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 开发与面试的核心要求。