深蓝黑背景品牌封面:居中大标题「Redis 只剩一台,挂了怎么办」,副标题「从单机到集群的高可用演进」;下方装饰——四个依次排开的小图标代表演进路线:单机(带故障斜杠)、主从(两台相连)、哨兵(三台加一只瞭望眼)、集群(六个小方块组成的网格);顶部标注「经典题解析 · 缓存」与「Day 06 · 09-24」 图 1:本文封面,点明「从单机到集群」的演进主线。

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料(见文末来源说明),与任何公司的当前招聘无关。这道题表面问 Redis,实际考的是你对「单点故障」的完整认识:不是背出「用集群」三个字,而是讲清从单机到主从、哨兵、集群这条演进路上,每一步解决了什么、又留下了什么。

想象面试现场,面试官问:「你们业务重度依赖一台 Redis,它挂了会怎样?怎么让它不那么容易挂?」

第一步,审题。

先回答「会怎样」:Redis 一挂,所有依赖它的读请求穿透到数据库,数据库被瞬时打满——缓存层单点故障会瞬间放大成全站事故。然后把「怎么办」拆成四级演进:主从复制解决「数据有备份」,哨兵解决「故障能自动切换」,集群解决「容量和写入也能水平扩展」。每一级都要说清代价。

第二步,第一级:主从复制,先有副本。

Redis 官方文档对主从复制的描述很直白:副本(replica)是主库的精确拷贝,链接断开后会自动重连并努力恢复成精确拷贝。机制上三条:连接正常时主库把写命令流式发给副本;断线重连时先尝试部分重同步(只补断线期间缺的那段命令流);部分重同步做不了,就全量重同步——主库生成快照发给副本再继续流式同步。副本默认只读,读请求可以分流到副本上。

但这一级有两个必须交代的代价。其一,官方文档明确 Redis 默认异步复制:主库不等副本确认就返回,低延迟高性能,代价是主库宕机时最近一批写入可能没传到副本——切换后会丢数据。想收窄丢失窗口,官方给了 min-replicas-to-write 与 min-replicas-max-lag 两个参数做尽力而为的约束,但文档同时提醒这不构成强一致。其二,主库挂了需要人工切换,半夜告警人肉升主,这不叫高可用。

第三步,第二级:哨兵,让切换自动化。

哨兵(Sentinel)是专职的监控与调度进程,官方文档列出它的四项宏观能力:监控主从实例是否正常工作、出问题时通知管理员或其它程序、主库故障时自动故障转移(把一个副本提升为主库、其余副本改挂新主、通知应用新地址)、作为客户端的配置提供方——客户端先问哨兵「现在的主库是谁」,拿到地址再连。文档还强调哨兵自身要跑多个进程协同:多个哨兵达成一致才判定主库下线,降低误判;个别哨兵挂了系统照常工作——故障转移系统自己不能是单点。

哨兵的边界也要讲清:它管的是「切换」,不管「分片」。写入仍然只有主库一个点,容量仍然受单机内存限制。

第四步,第三级:集群,把数据切开。

Redis Cluster 走另一条路:官方文档说明它不用一致性哈希,而是把全部 key 概念上划进 16384 个哈希槽,槽位由 key 的 CRC16 对 16384 取模算出,每个节点负责一段槽位;数据自动分片到多组主从,部分节点故障或失联时集群仍可运行——但文档同时写明边界:多数主库不可用时整个集群会不可用。容量与写入随节点数水平扩展,这是哨兵方案给不了的。

演进路径图:①单机——任何一份数据只有一个副本,宕机即全站缓存不可用,还会把请求全部放进数据库(缓存雪崩);②主从复制——主写从读、数据多份副本,读请求分流,但主挂了要人工切换;③哨兵——专职进程监控主从,主宕机自动选新主并通知客户端,但写入仍是单点、容量不分片;④集群——数据按槽位分片到多组主从,每组独立自动故障转移,容量与写入都能水平扩展。底部选型建议:数据量小、读多写少用主从加哨兵;数据量大或写入多,直接上集群 图 2:从单机到集群的四级演进,每级解决什么、留下什么。

选型结论。 数据量小、读多写少:主从加哨兵,够用且简单。数据量大或写入多:直接上集群。两条路没有高下,只有匹配。

易错点清单。

一,以为主从复制是同步的——默认异步,切换丢数据的窗口必须主动交代。二,以为哨兵解决了容量问题——它只做监控与切换,不分片。三,以为集群永不不可用——官方文档写明多数主库失联时集群整体不可用。四,只答架构不答演练——故障转移没演练过,等于没有。

回到面试现场,建议的答题节奏:先讲单机挂了的放大后果,再沿主从、哨兵、集群逐级讲「解决什么、留下什么」,每级主动交代代价(异步复制丢数据、哨兵不分片、集群有多数派边界),最后落到选型口径。讲代价比讲功能更能证明你用过。

AI 服务把会话状态、限流计数、结果缓存放在 Redis 里,单点故障等于服务宕机。你的缓存高可用方案走到哪一级了——主从、哨兵还是集群?切换演练过吗?欢迎聊聊。

参考资料

  • Redis Replication(Redis 官方文档:副本是主库的精确拷贝、断线自动重连、部分/全量重同步机制、默认异步复制及数据丢失窗口、min-replicas-to-write 尽力约束、副本默认只读) — https://redis.io/docs/latest/operate/oss_and_stack/management/replication/
  • Redis Sentinel(Redis 官方文档:监控、通知、自动故障转移、配置提供方四项能力,多哨兵协同判定下线降低误判) — https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/
  • Horizontal scaling with Redis Cluster(Redis 官方文档:数据自动分片、16384 个哈希槽、CRC16 取模定位、部分节点故障仍可运行、多数主库不可用时集群不可用) — https://redis.io/docs/latest/operate/oss_and_stack/management/scaling/