【Redis】 高可用三大核心:主从复制 + 哨兵 + 集群(面试终极版)
大家好我是程序员二叉。简介主从复制、哨兵、集群是 Redis 高可用架构的三驾马车也是后端面试必考、必问、必深挖的核心知识点。本文从原理、流程、机制、面试题全方位拆解内容包含主从全量/增量同步、复制积压缓冲区、哨兵故障转移、Cluster 哈希槽、扩缩容、16384 槽位根源、脑裂解决。欢迎点赞收藏关注。一、Redis 主从复制原理1. 核心作用主节点Master负责写请求从节点Slave负责读请求实现读写分离、数据备份、高可用基础2. 主从复制流程从节点发送slaveof指令建立连接主从进行全量同步或增量同步主节点持续将写命令异步同步到从节点从节点接收命令并执行保持数据一致二、全量同步 增量同步1. 全量同步RDB 快照触发场景第一次同步、runId 不匹配、偏移量丢失流程主节点执行bgsave生成 RDB 文件发送 RDB 给从节点从节点清空数据加载 RDB主节点将期间缓存的增量写命令发送给从节点特点数据完整但性能开销大2. 增量同步命令重放触发场景短时间断线、网络抖动恢复流程从节点发送主节点 runId 偏移量 offset主节点在复制积压缓冲区查找 offset仅发送缺失的命令从节点快速补齐数据特点轻量、高效、无阻塞三、复制积压缓冲区作用1. 本质主节点内存中的固定长度环形队列2. 核心作用缓存主节点最近的写命令支持从节点断线后增量同步避免频繁全量同步提升主从性能3. 断线后增量同步原理从节点断线重连带上 offset主节点判断 offset 是否在缓冲区中存在 → 增量同步不存在 → 全量同步四、哨兵 Sentinel 核心原理1. 哨兵作用实时监控主从节点状态自动故障发现 故障转移主节点宕机自动选举新主提供主节点地址查询服务2. 核心工作流程哨兵每秒向主从发送心跳节点无响应 →主观下线多个哨兵确认 →客观下线哨兵间选举LeaderLeader 执行故障转移3. 故障转移完整流程原主节点客观下线哨兵集群选举 Leader从从节点中筛选新主节点执行slaveof no one升主其他从节点指向新主旧主恢复后变为从节点五、哨兵选主规则 投票机制1. 新主节点选举优先级slave-priority 优先级最高复制偏移量最大数据最新runId 最小2. 哨兵投票机制采用半数以上通过原则至少3 个哨兵才能保证高可用投票胜出者为 Leader执行切换避免脑裂保证决策唯一六、Redis Cluster 集群原理1. 核心设计去中心化架构数据按哈希槽分片存储支持水平扩容、高可用2. 哈希槽Hash Slot总数16384 个所有主节点均匀分配槽位键路由公式slotCRC16(key)mod 16384 slot CRC16(key) \mod 16384slotCRC16(key)mod16384一个槽只属于一个主节点七、集群槽位分配 分片规则集群将 16384 个槽均匀分配给所有主节点每个主节点负责一段连续槽位客户端可连接任意节点节点根据槽位返回重定向或直接响应八、集群扩容 缩容原理1. 扩容加入新主节点从旧节点迁移部分槽位到新节点迁移槽位对应的 key集群重新平衡在线无感扩容2. 缩容将下线节点的槽位全部迁移走节点下线集群自动更新槽位路由表九、为什么哈希槽是 16384面试必问官方核心原因心跳包大小限制槽位图用 bitmap 存储16384 刚好占用2KBRedis 集群节点不建议超过 1000 个16384 足够分配且槽均匀带宽 内存效率最优槽位过大会导致心跳包过大、耗流量、耗内存一句话总结16384 是节点规模、网络开销、性能效率三者的最佳平衡。十、集群高可用 脑裂问题解决1. 高可用机制一主多从主从自动切换集群内置哨兵能力槽位完整则集群可用2. 脑裂问题 解决方案脑裂场景主节点网络隔离哨兵切换新主旧主仍在线出现双主。解决方案配置min-replicas-to-write 1原理主节点检测到从节点连接数不足时拒绝写入避免双主同时写数据。十一、面试终极总结主从全量同步RDB、增量同步offset复制积压缓冲区复制缓冲区环形队列缓存命令支撑增量同步哨兵监控、选主、故障转移投票半数机制保证高可用集群16384 哈希槽分片去中心化在线扩缩容16384心跳包大小 集群规模 性能最优脑裂配置最小从节点数禁止主节点孤立写入