Redis 高可用方案

发布于 2021-11-25  558 次阅读


Redis 实现将 MySQL 查询结果 缓存的核心思路是利用 Redis 作为中间缓存层,避免重复查询 MySQL,提升数据读取性能和系统的响应速度,掌握redis的高可用很有必要

一、Redis缓存实现原理

Redis 缓存 MySQL 查询结果的核心流程:
先查询 Redis 缓存。
如果缓存命中,直接返回结果。
如果缓存未命中,查询 MySQL 数据库,并将结果写入 Redis,设置过期时间。
后续请求直接从 Redis 缓存读取,提高系统性能,降低 MySQL 压力。
通过合理的 缓存策略 和 缓存过期时间,Redis 可以极大地提升数据读取性能,是 MySQL 数据库加速的重要手段。

流程图

用户请求 → Redis → 缓存命中?  → 是 → 返回数据  
                             → 否 → 查询 MySQL → 将结果存入 Redis → 返回数据

1.1 Redis 缓存要点

缓存过期时间(TTL):

为避免数据过时或 Redis 缓存膨胀,给缓存设置过期时间。例如 setex 命令设置缓存有效期。

缓存键设计:

缓存键(Key)应具有唯一性,通常可以使用业务逻辑生成,例如:
user:1 表示用户表中 ID 为 1 的用户数据。
product:123 表示商品表中 ID 为 123 的商品数据。

缓存一致性:

当 MySQL 数据更新时,应同步更新 Redis 缓存,避免缓存与数据库数据不一致。
常用方案:
缓存失效策略:更新 MySQL 数据时,删除 Redis 缓存(下次访问重新查询并缓存)。
消息队列:通过异步消息队列(如 Kafka、RabbitMQ)通知缓存更新。

热点数据预加载:

对访问频率极高的热点数据,可以在系统启动时提前加载到 Redis,减少首次访问的延迟。

防止缓存穿透、击穿、雪崩:

缓存穿透:对不存在的数据进行查询,导致 MySQL 压力增大。解决方案:使用空值缓存或布隆过滤器。
缓存击穿:热点数据缓存过期时大量请求同时查询数据库。解决方案:加锁、设置随机过期时间。
缓存雪崩:大量缓存同时过期。解决方案:设置随机过期时间,避免缓存同时失效。

二、高可用方案对比

方案 自动故障恢复 数据分片 扩展性 适用场景
Redis主从复制 读多写少、简单数据备份
Redis哨兵模式(Sentinel) 一般 中小规模高可用场景
Redis Cluster 大数据量、高并发场景
Redis主从复制 + Keepalived 小规模高可用场景
云服务 Redis(公有云厂商) 需要快速部署的高可用场景

主从复制 使用场景和Redis + Keepalived 只是在主从多了vip 做高可用,这里只记录Redis主从复制

2.1 Redis主从复制

主从复制是 Redis 实现数据冗余和读写分离的基本方案。

数据在主节点(Master)上写入,从节点(Slave)通过复制主节点的数据进行同步。

特点

  • 数据同步
    主节点负责写操作,并将数据同步给从节点。从节点只能处理读操作,不能进行写操作。
  • 读写分离
    主节点处理写操作,从节点处理读操作,分担主节点的压力。
  • 故障处理
    如果主节点故障,需要手动将一个从节点提升为新的主节点。
  • 一致性
    数据在主从之间同步存在一定的延迟,不保证完全实时一致性。

2.2 哨兵模式

哨兵模式是在主从复制的基础上,通过 Sentinel 组件实现主从节点的监控和自动故障转移,提升高可用性。

特点

  • 主从监控
    Sentinel 实时监控主节点和从节点的状态,判断节点是否正常工作。
  • 自动故障转移
    当主节点故障时,Sentinel 自动将从节点提升为新的主节点,并通知其他从节点进行同步。
  • 通知机制
    Sentinel 能通知客户端主节点变更,更新连接信息。
  • 一致性
    与主从复制一样,数据同步存在延迟,不保证完全实时一致性。

2.3 Redis Cluster

  • Redis Cluster 是 Redis 原生支持的分布式架构,提供 数据分片多主多从 功能,解决了单机 Redis 在存储容量和性能方面的限制。
  • 集群通过 16384 个槽(slots) 将数据分片存储到多个主节点(Master)上,每个主节点有若干从节点(Slave)提供数据冗余。

特点

  • 数据分片
    数据通过槽(slot)分散存储在多个主节点上,实现水平扩展。
  • 高可用性
    每个主节点都有从节点作为备份,主节点故障时,从节点自动提升为主节点。
  • 多主多从
    集群中每个主节点都能处理读写请求。
  • 自动故障恢复
    集群会自动检测主节点故障,并进行故障转移。
  • 一致性
    数据在主从节点之间的同步仍然存在延迟,不保证强一致性。
  • 客户端直连
    客户端需要支持 Redis Cluster 协议,直接与多个节点交互。

三、哨兵模式安装以及配置

Redis Sentinel 通过监控主从复制中的 Master 和 Slave 状态,提供 自动故障恢复高可用管理,实现主从切换。

3.1 环境准备

假设你有 3 台 Redis 实例,分别是:

  • 主节点(Master):192.168.1.1:6379
  • 从节点(Slave1):192.168.1.2:6379
  • 从节点(Slave2):192.168.1.3:6379

此外,部署 3 个 Sentinel 实例来监控这些 Redis 节点。

3.2 配置 Redis 主从复制

  • 修改 从节点 配置文件,将其设置为主节点的从节点。

Slave 配置示例

confCopy code# redis.conf 配置文件(Slave 节点)
replicaof 192.168.1.1 6379
  • 启动 Redis 服务:
redis-server /path/to/redis.conf

3.3 配置 Sentinel

在每台机器上配置一个 Sentinel 实例,分别创建 sentinel.conf 文件。以下是配置示例:

confCopy code# sentinel.conf 配置文件
port 26379  # Sentinel 监听端口
sentinel monitor mymaster 192.168.1.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 15000

参数说明

  • sentinel monitor:定义监控的主节点,mymaster 是自定义名称,2 表示至少有 2 个 Sentinel 认为主节点宕机,才触发故障转移。
  • down-after-milliseconds:判定主节点宕机的超时时间(毫秒)。
  • parallel-syncs:故障恢复后并行同步从节点的数量。
  • failover-timeout:故障转移的最大超时时间。

3.4 启动 Sentinel

启动 3 个 Sentinel 实例:

redis-sentinel /path/to/sentinel.conf

3.5 验证哨兵模式

  1. 观察 Sentinel 状态
    使用以下命令连接 Sentinel 查看主从状态:

    redis-cli -p 26379 info Sentinel
  2. 模拟主节点故障
    停止主节点服务:

    redis-cli -h 192.168.1.1 -p 6379 shutdown
    • Sentinel 会自动检测到主节点故障,将一个从节点提升为新的主节点。
  3. 查看新的主节点
    在 Sentinel 监控中查看新的主节点:

    redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

哨兵模式:适合小规模部署,要求高可用但不需要水平扩展。

四、Redis Cluster 模式安装以及配置

Redis Cluster 是 Redis 提供的原生分布式高可用方案,通过 数据分片多主多从 模式实现高可用和负载均衡。

4.1 环境准备

假设需要创建一个包含 3 个主节点和 3 个从节点的 Redis Cluster。

  • 主节点(Master):
    192.168.232.1:7000192.168.232.2:7001192.168.232.3:7002
  • 从节点(Slave):
    192.168.232.1:7003192.168.232.2:7004192.168.232.3:7005

4.2 配置 Redis Cluster 节点

为每个 Redis 实例配置 redis.conf 文件。

配置示例redis-7000.conf):

confCopy codeport 7000
cluster-enabled yes           # 启用 Redis Cluster
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000     # 集群节点超时时间
appendonly yes                # 开启数据持久化

修改不同实例的 portcluster-config-file,其他配置相同。

4.3 启动 Redis 实例

启动所有 Redis 节点:

redis-server /path/to/redis-7000.conf
redis-server /path/to/redis-7001.conf
redis-server /path/to/redis-7002.conf
redis-server /path/to/redis-7003.conf
redis-server /path/to/redis-7004.conf
redis-server /path/to/redis-7005.conf

4.4 创建 Redis 集群

使用 redis-cli 工具初始化集群,将 3 个节点设为主节点,3 个节点设为从节点。

执行以下命令:

redis-cli --cluster create 192.168.232.1:7000 192.168.232.2:7001 192.168.232.3:7002 \
192.168.232.1:7003 192.168.232.2:7004 192.168.232.3:7005 --cluster-replicas 1

说明

  • --cluster-replicas 1 表示每个主节点有 1 个从节点。

初始化后,Redis Cluster 会自动分配 16384 个槽(Slots)到各个主节点。

4.5 验证 Redis Cluster

  1. 查看集群状态
    任意节点执行以下命令查看集群信息:

    redis-cli -h 192.168.232.1 -p 7000 cluster nodes
  2. 数据测试

    • 插入数据到集群中:

      redis-cli -c -h 192.168.232.1 -p 7000 set key1 value1

      -c 参数表示客户端支持 Redis Cluster 模式。

    • 数据自动分配到不同槽,查看存储数据的节点。

  3. 故障测试
    停止某个主节点,查看集群自动进行故障转移:

    redis-cli -h 192.168.232.1 -p 7000 shutdown

    从节点会自动提升为主节点,保证集群高可用。

Redis Cluster:适合大规模高并发场景,支持数据分片和水平扩展,适用于大数据量和高可用需求。