图 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/