基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Redis 高可用性方案对比

知识点图片

本文讲解Redis高可用方案。核心是利用主从复制做数据备份,再通过哨兵模式实现自动故障转移,或使用集群模式同时解决高可用与水平扩展问题。

这是一个关于 Redis 高可用性(High Availability, HA)的非常核心且重要的问题。下面我将从基本原理到主流方案,详细地解释 Redis 是如何实现高可用的。

简单来说,Redis 实现高可用主要依赖于数据冗余(主从复制)自动故障转移(哨兵或集群) 这两个核心机制。


核心基础:主从复制 (Master-Slave Replication)

这是所有高可用方案的基石。没有数据冗余,就谈不上高可用。

  • 工作原理
    1. 一个主节点(Master):负责处理所有写操作(SET, HSET 等),并将数据变更同步给所有从节点。
    2. 一个或多个从节点(Slave):从主节点异步地复制数据。从节点通常是只读的,可以分担读请求的压力。
  • 作用
    • 数据备份:当主节点数据丢失时,从节点上还保留着一份完整的数据副本。
    • 读写分离:将读请求分散到从节点,减轻主节点的压力,提高整体吞吐量。
  • 局限性
    主从复制本身不能实现自动故障转移。如果主节点宕机,需要人工介入,选择一个从节点提升为新的主节点,并让其他从节点指向这个新主。这个过程会产生服务中断。

为了解决这个“人工介入”的问题,就引出了下面两种主流的高可用方案。


方案一:Redis Sentinel (哨兵模式)

哨兵模式是 Redis 官方推荐的、用于监控和自动故障转移的解决方案。它专注于解决主从复制模式下的故障自动切换问题。

  • 架构

    • 一个主从复制集群:包含一个 Master 和多个 Slave。
    • 一个或多个 Sentinel 进程:Sentinel 是一个独立的进程,它不存储业务数据,只负责监控 Redis 节点。为了避免 Sentinel 自身成为单点故障,通常会部署一个Sentinel 集群(推荐至少 3 个实例,部署在不同机器上)。
  • 核心功能

    1. 监控 (Monitoring):Sentinel 会持续不断地向 Master、Slave 以及其他 Sentinel 发送心跳包(PING),检查它们是否正常工作。
    2. 通知 (Notification):当被监控的 Redis 节点出现问题时,Sentinel 可以通过 API 通知系统管理员或其他应用程序。
    3. 自动故障转移 (Automatic Failover):这是 Sentinel 的核心价值。当 Master 节点被判定为下线时(主观下线 + 客观下线),Sentinel 集群会执行以下步骤:
      a. 选举 Leader Sentinel:在 Sentinel 集群内部通过 Raft 算法选举出一个 Leader,由它来负责执行故障转移。
      b. 选举新 Master:Leader Sentinel 从存活的 Slave 节点中,按照一定规则(如优先级、复制偏移量、运行 ID 等)选举出一个最合适的 Slave 作为新的 Master。
      c. 执行切换
      - 向被选中的 Slave 发送 SLAVEOF NO ONE 命令,使其提升为新的 Master。
      - 向其余的 Slave 发送 SLAVEOF new_master_ip new_master_port 命令,让它们去复制新的 Master。
      - 将已下线的旧 Master 标记为 Slave,待其恢复后,也会自动去复制新的 Master。
    4. 配置提供者 (Configuration Provider):客户端连接 Sentinel 时,可以询问当前 Master 的地址。当发生故障转移后,Sentinel 会将新的 Master 地址告知客户端,从而实现无感知切换。
  • 优点

    • 解决了主从模式下需要手动切换的问题,实现了真正的高可用。
    • 架构相对简单,易于部署和理解。
    • 是 Redis 官方成熟的解决方案。
  • 缺点

    • 写操作仍然是单点:整个系统只有一个 Master 节点处理写请求,写性能和数据容量受限于单个节点的硬件能力。
    • 需要额外部署和维护 Sentinel 集群。

方案二:Redis Cluster (集群模式)

Redis Cluster 是 Redis 3.0 版本后推出的官方分布式解决方案。它不仅提供了高可用性,还解决了数据分片(Sharding)水平扩展 的问题。

  • 架构

    • 去中心化:没有像 Sentinel 那样的中心监控节点。所有节点之间通过 Gossip 协议互相通信,交换状态信息。
    • 数据分片:整个数据集被划分为 16384 个哈希槽(hash slots)。每个 Master 节点负责管理一部分哈希槽。
    • 内置主从复制:集群中的每个 Master 节点都可以有零个或多个 Slave 节点。这种主从结构是集群实现高可用的基础。
  • 核心功能

    1. 数据分片 (Data Sharding)
      • 当客户端要操作一个 key 时,集群会通过 CRC16(key) % 16384 算法计算出这个 key 属于哪个哈希槽。
      • 根据槽与节点的映射关系,确定由哪个 Master 节点来处理这个 key。
      • 客户端可以直接连接集群中的任意节点,如果找错了节点,该节点会返回 MOVEDASK 重定向指令,告知客户端正确的节点地址。
    2. 内置高可用 (Built-in HA)
      • 集群内的节点会互相 PING/PONG 来检测对方是否下线。
      • 如果一个 Master 节点超过半数以上的其他 Master 节点都认为它下线了,那么该 Master 就会被标记为故障状态。
      • 此时,该故障 Master 的所有 Slave 节点会进行选举。
      • 选举胜出的 Slave 会提升为新的 Master,接管原来 Master 负责的哈希槽,并继续提供服务。
      • 整个故障转移过程由集群内部自动完成,无需 Sentinel 介入。
  • 优点

    • 高可用与高扩展性兼备:不仅解决了单点故障问题,还能通过增加节点来扩展数据存储容量和读写吞吐量。
    • 去中心化设计:避免了中心节点的瓶颈,更加健壮。
    • 官方原生支持,是未来 Redis 发展的方向。
  • 缺点

    • 架构相对复杂,运维要求更高。
    • 对批量操作命令(如 MSETMGET)支持有限,要求所有 key 必须在同一个哈希槽中(可以通过 hash tags 解决)。
    • 客户端需要使用支持 Redis Cluster 协议的库。

方案对比与选择

特性 Redis Sentinel (哨兵模式) Redis Cluster (集群模式)
主要目标 高可用 (High Availability) 高可用 + 水平扩展 (Scalability)
数据存储 数据全量存储在一个 Master 节点上 数据分片存储在多个 Master 节点上
写性能瓶颈 存在(受限于单机性能) 不存在(可通过增加节点线性扩展)
架构 主从 + 独立的 Sentinel 集群 去中心化,所有节点对等(角色不同)
故障转移 由 Sentinel 集群仲裁和执行 由集群内部节点投票和执行
复杂度 相对简单 相对复杂
适用场景 数据量不大,写并发不高的场景,主要追求高可用。 数据量巨大,或读写并发非常高的场景,需要高可用和扩展性。

总结

  • 主从复制是基础,提供数据冗余。
  • 哨兵模式在主从复制的基础上,增加了自动故障转移功能,解决了高可用问题,但没有解决数据扩展问题。
  • 集群模式是一个更全面的方案,它通过数据分片内置的主从复制及故障转移,同时解决了高可用水平扩展两大难题。

如何选择?

  • 如果你的数据量可以被单台 Redis 服务器容纳,且写请求压力不大,哨兵模式是一个非常成熟、稳定且简单的选择。
  • 如果你的业务数据量巨大,或者未来的增长会超过单机内存限制,或者写并发量非常高,那么应该直接选择集群模式。对于新的大型项目,推荐优先考虑 Redis Cluster。
  • 另外,现在各大云服务商(如 AWS ElastiCache, GCP Memorystore)都提供了托管的 Redis 服务,它们在底层封装了这些高可用机制,大大简化了运维工作,也是一个非常好的选择。
00:00
00:00