返回归档
🛩️Redis

Redis-高可用

文章目录

Redis的高可用(HA High Avalibility)要解决的是:

  1. 避免单点故障
  2. 保证数据尽可能不丢失
  3. 保证服务队外不中断

Redis 官方给出了三套HA的框架

特性 主从复制 哨兵模式 切片集群
数据分布 每个节点保存全量数据 每个节点保存全量数据 数据分片存储
读写分离
自动故障转移
扩展性
部署复杂度 简单 中等 复杂
维护成本
适用数据量 GB 级别 TB 级别 PB 级别

主从复制(Master-Slave)

主从式高可用的基础,是哨兵和cluster的底层依赖。

image

基本原理

  • 主节点负责写操作
  • 从节点负责读操作
  • 主节点数据自动同步到从节点

对于全量复制而言

1) slave 发 PSYNC / SYNC 请求
2) master 执行 RDB 快照 → 发送 RDB 给 slave
3) master 在发送 RDB 的同时,将新的写命令放入 replication buffer
4) slave 加载 RDB 后,再接收 replication buffer 中的增量数据

slave初次连接时必须执行全量复制,过程耗时长,网络、磁盘负载较高

对于增量复制而言

当主从短暂断开后,slave可以继续同步

  • master保留自己的rep backlog buffer
  • slave发送自己的replication offset
  • master按照offset差异,发送缺失的命令

其中有一个比较重要的点:如果 backlog 太小导致丢失 offset 范围 → 回退到全量同步(代价很大)

优缺点

pros:

  • 读写分离,提高性能
  • 数据备份
  • 实现简单

cons:

  • 主节点故障需要手动切换
  • 无法自动故障转移
  • 无法实现自动化运维

哨兵模式(Sentinel)

image

主从模式下,当主节点fail时,写入会中断。所以需要拥有failover的能力。

基本原理

  • 在主从复制基础上,增加哨兵节点监控集群状态
  • 自动进行故障检测和转移
  • 提供自动化运维能力

哨兵的功能

每个哨兵对master做PING/PONG心跳检测,多哨兵经投票后判断matser状态。

  • 主节点自动故障检测
  • 自动切换(failover)
  • 通知客户端新的master地址

哨兵如何选择新的master

优先级规则:

  1. slave priority(redis.conf 配置)
  2. replication offset(数据最新)
  3. runid(字典序最小)

配置

# 哨兵配置
sentinel monitor mymaster 192.168.1.10 6379 2    # 至少2个哨兵同意才能判定主节点故障
sentinel down-after-milliseconds mymaster 30000  # 30秒没有响应则判定为主观下线
sentinel failover-timeout mymaster 180000        # 故障转移超时时间
sentinel parallel-syncs mymaster 1               # 同时同步的从节点数量

# 主节点配置
min-slaves-to-write 1        # 至少有1个从节点连接
min-slaves-max-lag 10        # 从节点最大延迟秒数

切片集群(Redis Cluster)

哨兵模式解决了主从模式下的不可failover问题。但是单node的内存往往是有瓶颈的。所以可以通过分布式的方式——分片,通过分片实现现行扩展,实现多主多从。

image

基本原理

  • 数据自动分片到多个节点
  • 每个分片可以有主从节点
  • 支持自动故障转移

实现步骤

# 1. 配置集群节点(redis.conf)
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000

# 2. 创建集群
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

数据分片机制

  • 使用 16384 个哈希槽
  • 根据 key 的 CRC16 值对 16384 取模来分配
  • 每个节点负责一部分哈希槽

故障转移

  • 节点间通过 Gossip 协议通信
  • 自动检测节点故障
  • 从节点自动升级为主节点

新增节点是否需要数据迁移?

新增 Master 节点默认不负责任何 slot,因此必须通过 reshard 将部分 slot 从旧节点迁移到新节点。迁移采取在线 MIGRATE 方式,逐 key 搬迁,不影响服务。

删除节点是否需要数据迁移?

删除 Master 节点必须先将其 slot 迁移到其他 Master,否则无法删除;删除 Slave 节点则不需要迁移数据。

主从数据不一致问题

主从不一致本质是 Redis 的主从复制是异步的,导致读从时可能读到旧数据。

一般从三个层面处理:

  1. 业务层避免跨主从读写:强一致场景全部读写走主节点,读从仅用于弱一致需求。
  2. 使用 WAIT 命令增强一致性:写入后等待从节点确认,可实现更强的一致性保障。
  3. 使用 Redis Cluster:默认读主,自动故障切换,减少人为架构处理一致性问题。

常见真实做法是“强一致读主、弱一致读从”。

各种方案的整体对比

方案 高可用 数据一致性 扩展性 使用场景
主从复制 弱一致性 不支持横向扩容 单节点读扩展
Sentinel 弱一致性 不扩容,只 HA 高可用读写场景
Cluster 弱一致性 可横向扩容(分片) 超大规模集群、云原生
第三方 Proxy(Codis/Twemproxy) 改善一致性,但依赖 proxy 可扩容 大规模缓存(简化客户端)