Redis 高可用:主从模式 + 哨兵模式

· 4 min read

背景:单机 Redis 的问题

  • 单机本质:Redis 是一个单机服务。
  • 性能瓶颈:读写性能受限于单个服务器的 CPU 和内存上限。
  • 可用性问题:一旦挂了,外部服务无法使用,缺乏高可用性。

解决方案一:经典主从模式

核心思想:加副本,分为主从关系。

节点职责

节点类型对外提供说明
主节点读写操作将写入的数据同步给从节点
从节点读操作分担读请求压力

优点

  • 提升读性能(从节点越多,读请求量越高)
  • 提升可用性(主节点挂后,可手动让从节点顶上)

部署方式

主从 Redis 分别部署在不同服务器上。


主从复制细节

问题

新增从节点时,从节点无数据,如何快速同步?

同步过程

  1. 全量同步:主节点将定期生成的 RDB 文件(内存数据持久化)传给从节点
  2. 增量同步:同步过程中的新写操作,记录到复制积压缓冲区(固定大小内存数组)
  3. 偏移量跟踪:数组下标为复制偏移量,用于跟踪主从同步进度

断点续传

从节点重启后,可根据当前偏移量继续未完成的复制。


主从切换的问题与改进

手动切换的问题

  • 主节点挂后需要手动切换,存在时间差
  • 自动化脚本(如 Keepalived)只能粗糙检测存活(进程、端口),无法感知内部状态(偏移量、数据一致性)
  • 在多从节点场景下,被选为新主节点的可能不是最合适的

解决方案

引入哨兵(Sentinel)


解决方案二:哨兵模式

哨兵是什么

  • 一个监控 Redis 内部状态的独立进程
  • 本质与 Redis 是同一套代码,通过不同启动参数部署

哨兵工作流程

  1. 获取主节点的从节点列表
  2. 每秒发送 ping 检查
  3. 发现主节点挂后,自动选择一个从节点顶上

选主规则(优先级从高到低)

优先级规则说明
1配置优先级最高的从节点如内存越大优先级越高
2复制偏移量最大的从节点数据最接近原主节点
3运行 ID 最小的从节点唯一标识,越小越优先

哨兵集群与高可用

问题

  • 单点问题:只有一个哨兵,哨兵自己挂掉则无法管理
  • 误判问题:哨兵与 Redis 节点网络问题可能导致误判

解决方案

组成哨兵集群。

下线判定

  • 主观下线:单个哨兵认为某 Redis 节点下线
  • 客观下线:大多数哨兵都认为该 Redis 下线,才确认真实下线

最终架构

哨兵集群 + 主从模式 = 哨兵模式


遗留问题

当前模式局限

  • 所有节点仍需存储全量数据
  • 写操作依然集中在主节点
  • 无法突破单机性能瓶颈

下一步

引入集群模式(解决数据容量和写性能问题)。

参考视频

Redis主从模式,哨兵模式,哨兵集群是什么?Redis高可用方案