【Redis八股|第9篇】Redis 主从复制、哨兵、集群详解
前言前面我们已经学习了 Redis 的数据类型、缓存问题、持久化、分布式锁等内容。这些知识点更多是围绕 Redis 单节点使用来讲的。但是在真实项目中Redis 如果只有一个节点会有明显问题单节点宕机服务不可用单节点内存有限单节点处理能力有限数据没有副本风险较高所以生产环境中Redis 通常会做高可用和扩展。常见方案包括主从复制哨兵模式Redis Cluster 集群面试中也经常会问Redis 主从复制是什么主从复制解决什么问题哨兵模式有什么作用Redis Cluster 和哨兵有什么区别Redis 集群为什么有 16384 个槽主从切换大概流程是什么这一篇我们就把 Redis 高可用相关知识完整梳理一遍。一、为什么 Redis 需要高可用单机 Redis 虽然简单但是存在几个问题。1. 单点故障如果 Redis 只有一个节点应用服务 - Redis一旦 Redis 宕机所有依赖 Redis 的功能都会受影响。比如登录 token 查询失败缓存不可用分布式锁不可用排行榜不可用验证码不可用所以生产环境不能只依赖单节点。2. 读压力大如果大量请求都读 Redis 单节点单节点压力会变大。虽然 Redis 很快但它也不是无限承载。3. 数据安全风险如果单节点 Redis 出问题数据副本不足恢复风险更高。所以 Redis 需要通过多节点架构提升可用性和扩展性。二、主从复制是什么主从复制是 Redis 高可用的基础。结构一般是Master 主节点 ├── Slave 从节点 1 └── Slave 从节点 2主节点负责写操作从节点复制主节点的数据。比如应用写入数据到主节点setname zhangsan主节点会把写操作同步给从节点。这样从节点也会有相同数据。三、主从复制解决了什么问题1. 数据备份主节点的数据可以复制到从节点。如果主节点出问题从节点中还有数据副本。2. 读写分离主节点负责写从节点负责读。比如写请求 - Master 读请求 - Slave这样可以分担读压力。3. 高可用基础主从复制本身不能自动故障转移但它是哨兵模式和集群模式的基础。没有从节点就没法在主节点故障后提升新主节点。四、主从复制的基本流程主从复制大致可以分为两个阶段全量同步增量同步1. 全量同步从节点第一次连接主节点时需要复制主节点的完整数据。大致流程Slave 连接 Master ↓ Master 生成 RDB 快照 ↓ Master 把 RDB 发送给 Slave ↓ Slave 加载 RDB ↓ Master 把同步期间的新写命令发送给 Slave这样从节点就能获得主节点的数据。2. 增量同步全量同步之后主节点后续新的写命令会继续同步给从节点。比如setage18incr count这些写命令会发送给从节点让从节点保持和主节点一致。五、主从复制有什么问题主从复制虽然能复制数据但它本身有一个问题主节点宕机后不能自动把从节点升级为主节点。比如Master 宕机 Slave1 仍然是从节点 Slave2 仍然是从节点这时候需要人工干预或者使用哨兵模式来自动故障转移。所以主从复制只是基础不是完整高可用方案。六、哨兵模式是什么哨兵模式也叫 Sentinel。它的作用是监控 Redis 主从节点在主节点宕机时自动选举一个从节点升级为新的主节点。结构大概是Sentinel1 Sentinel2 Sentinel3 \ | / Master Redis / \ Slave1 Slave2哨兵节点不存业务数据它们负责监控 Redis 节点状态。七、哨兵模式主要功能哨兵主要有三个功能监控自动故障转移通知1. 监控哨兵会定期检查主节点和从节点是否正常。如果发现主节点没有响应就认为它可能出问题。2. 自动故障转移当主节点确认故障后哨兵会从从节点中选出一个新的主节点。然后让其他从节点复制新的主节点。3. 通知主从切换后哨兵可以通知客户端新的主节点地址。这样应用可以连接新的主节点继续工作。八、主观下线和客观下线哨兵判断节点故障时有两个概念主观下线客观下线1. 主观下线某一个哨兵认为主节点不可用叫主观下线。比如 Sentinel1 检测 Master 没响应Sentinel1我觉得 Master 挂了但这只是一个哨兵自己的判断。2. 客观下线多个哨兵都认为主节点不可用达到一定数量后才叫客观下线。Sentinel1Master 挂了 Sentinel2Master 挂了 Sentinel3Master 挂了这时才能确认主节点真的故障并进行故障转移。为什么要这样设计因为单个哨兵可能误判。比如网络抖动导致某个哨兵连不上 Master但其他哨兵仍然能连接。所以需要多个哨兵共同判断避免误切换。九、哨兵故障转移流程主节点故障后哨兵大致会做这些事情多个哨兵确认主节点客观下线哨兵之间选举一个 leaderleader 从从节点中选一个新的主节点让新主节点执行slaveof no one让其他从节点复制新的主节点通知客户端主节点地址变化原来的主节点恢复后变成新主节点的从节点流程可以理解为旧 Master 挂了 ↓ Sentinel 确认故障 ↓ 从 Slave 中选新 Master ↓ 其他 Slave 跟随新 Master ↓ 客户端连接新 Master十、哨兵模式解决了什么哨兵模式解决的是主节点故障后的自动切换问题它让 Redis 主从架构具备了高可用能力。但是哨兵模式也有局限主要解决高可用不解决数据分片单个主节点内存仍然有限写能力主要还是受单主节点限制数据量特别大时不够用所以如果数据规模更大就需要 Redis Cluster。十一、Redis Cluster 是什么Redis Cluster 是 Redis 官方集群方案。它不仅支持高可用还支持数据分片。结构大概是Master1 Master2 Master3 | | | Slave1 Slave2 Slave3多个主节点共同存储数据。每个主节点负责一部分数据。这就解决了单机内存和性能瓶颈。十二、Redis Cluster 的槽位机制Redis Cluster 中有一个非常重要的概念槽。Redis Cluster 一共有16384 个槽每个 key 都会通过算法计算属于哪个槽。然后这个槽由某个主节点负责。比如槽 0 - 5000 - Master1 槽 5001 - 10000 - Master2 槽 10001 - 16383 - Master3当访问 key 时key - 计算槽位 - 找到负责该槽位的节点这就是 Redis Cluster 的数据分片方式。十三、为什么是 16384 个槽面试中有时会问Redis Cluster 为什么有 16384 个槽可以简单回答Redis Cluster 使用槽位来分配数据16384 是一个折中数量。槽位太少数据分布不够细。槽位太多节点之间维护槽位信息的成本会增加。16384 个槽既能满足数据分布需求又不会让集群元数据过大。面试时不需要过度展开只要知道 Redis Cluster 是通过 16384 个槽做数据分片即可。十四、Redis Cluster 如何实现高可用Redis Cluster 中每个主节点通常会有一个或多个从节点。比如Master1 - Slave1 Master2 - Slave2 Master3 - Slave3如果 Master1 宕机Cluster 会把 Master1 的从节点 Slave1 提升为新的主节点。这样集群仍然可以继续工作。所以 Redis Cluster 同时具备数据分片 高可用十五、哨兵和 Cluster 的区别对比点哨兵模式Redis Cluster是否高可用是是是否数据分片否是主节点数量通常一个主节点多个主节点适合场景数据量不大需要高可用数据量大需要扩展容量和性能写能力主要受单主限制多主分担复杂度相对低相对高简单理解哨兵解决主从自动切换 Cluster解决高可用 数据分片如果只是一个主节点的数据量够用但需要自动故障转移可以用哨兵。如果数据量大、并发高需要多主分片就用 Cluster。十六、主从复制、哨兵、Cluster 的关系可以这样理解1. 主从复制解决数据副本问题。一个主节点多个从节点2. 哨兵模式在主从复制基础上解决自动故障转移问题。主节点挂了自动选新主3. Redis Cluster解决数据分片和高可用问题。多个主节点共同存储数据每个主节点有从节点它们不是完全平级的概念而是 Redis 高可用和扩展能力的不同方案。十七、面试标准回答如果面试官问Redis 主从复制、哨兵、Cluster 分别是什么可以这样回答Redis 主从复制是指一个主节点把数据复制到一个或多个从节点。主节点负责写从节点可以承担读请求主从复制可以实现数据备份和读写分离但主节点故障后不能自动切换。哨兵模式是在主从复制基础上增加 Sentinel 节点用来监控主从节点状态。当主节点故障时多个哨兵确认客观下线然后自动从从节点中选出新的主节点并通知客户端新的主节点地址。哨兵主要解决高可用问题。Redis Cluster 是 Redis 官方集群方案它通过 16384 个槽把数据分布到多个主节点上实现数据分片。每个主节点可以有从节点当某个主节点故障时可以进行故障转移。Cluster 既解决高可用也解决单机内存和性能瓶颈。十八、常见问题总结1. 主从复制能自动故障转移吗不能。主从复制只是数据同步自动故障转移需要哨兵或 Cluster。2. 哨兵节点存业务数据吗不存。哨兵负责监控、故障转移和通知。3. 什么是主观下线某个哨兵认为 Redis 节点不可用。4. 什么是客观下线多个哨兵都认为主节点不可用达到条件后确认故障。5. Redis Cluster 有多少个槽有 16384 个槽。6. Cluster 和哨兵最大区别是什么哨兵不做数据分片Cluster 做数据分片。十九、实际开发建议实际项目中可以这样理解单机 Redis 适合学习和小项目主从复制适合数据副本和读写分离哨兵模式适合需要自动故障转移的场景Redis Cluster 适合数据量大、并发高的场景生产环境要关注主从延迟使用 Redis 高可用时客户端也要支持对应模式集群模式下 key 设计要注意槽位和多 key 操作限制Redis 不是用了集群就万事大吉也要做好监控和容量规划二十、总结这一篇主要学习了 Redis 主从复制、哨兵模式和 Redis Cluster。主从复制可以把主节点数据同步到从节点实现数据备份和读写分离但不能自动故障转移。哨兵模式在主从复制基础上增加自动监控和故障转移能力可以在主节点宕机后自动选出新的主节点。Redis Cluster 则通过 16384 个槽实现数据分片让多个主节点共同存储数据同时每个主节点可以配置从节点实现高可用。面试时要重点讲清楚主从复制解决数据副本哨兵解决自动故障转移Cluster 解决数据分片和高可用。下一篇我们继续写 Spring Boot 项目整合 Redis 实战。