Redis 持久化、复制与集群
Redis 持久化保存恢复数据,复制保留运行副本。Cluster 通过哈希槽将数据分布到多个主节点。本文以 Redis 6、7 为基线,负责恢复点、故障转移和分片边界。
1. 面试核心
先记住这几条,再读正文- 持久化方式。 RDB 保存时间点快照,AOF 记录恢复所需的写操作。卡 · RDB
- AOF 同步。
appendfsync everysec每秒同步 AOF,故障恢复依赖最近已持久化位置。卡 · AOF 重写与混合格式 - AOF 文件组织。 Redis 7.0 起,AOF 使用基础文件、增量文件和 manifest。卡 · AOF 重写与混合格式
- Sentinel 故障转移。 Sentinel 的 quorum 用于判定客观下线,故障转移授权还需多数票。卡 · Sentinel
- Cluster 分片。 Cluster 有 16384 个槽,MOVED 更新路由,ASK 只临时转发本次请求。卡 · MOVED 与 ASK 重定向
2. RDB
RDB 保存某一时刻的数据集。SAVE 在主线程同步生成快照,会阻塞请求。BGSAVE 通过 fork 子进程在后台保存。
故障恢复到最后一份有效快照。该快照之后的修改缺少恢复依据。快照紧凑,适合备份与整库加载。
后台保存仍有 fork 停顿和写时复制成本。父进程修改共享页时,需要复制对应内存页。写入越密集、子进程运行越久,额外内存压力越大。
3. AOF
设置 appendonly yes 后,Redis 记录 AOF。appendfsync 控制同步到磁盘的策略。
| 配置 | 同步方式与代价 |
|---|---|
always | 每次写入批次同步,确认延迟受磁盘同步影响。 |
everysec | 后台每秒同步,正常调度下约有一秒未同步窗口。 |
no | 由操作系统安排同步,丢失窗口取决于系统刷盘。 |
磁盘阻塞和同步延期会影响实际落盘进度。因此,约一秒是正常运行窗口,不能视为任意故障下的硬上限。
AOF 重写根据当前数据生成更短的恢复表示。它保留恢复后的状态,省去重复的中间修改。重写期间仍需评估磁盘与内存容量。
4. AOF 重写与混合格式
Redis 6 重写 AOF 时,子进程生成新文件。父进程继续写旧 AOF,并保存重写期间的增量。新文件补齐增量后,替换旧文件。
Redis 7.0 起改用多文件 AOF。重写时,父进程写新的增量文件,子进程生成基础文件。完成后原子切换 manifest,恢复时按清单加载文件。
Redis 6、7 默认 aof-use-rdb-preamble=yes。重写结果以 RDB 保存基础数据,后续增量仍是 AOF 命令。它兼顾基础数据加载与新增操作记录。Redis 7 备份需保持清单及其引用文件一致。
5. RDB 与 AOF 恢复顺序
两种持久化同时启用时,Redis 重启优先加载 AOF。独立 RDB 仍可作为时间点备份。
恢复演练需校验文件完整性与数据结果。备份应放到独立故障域,避免和运行实例一起损坏。Redis 7.x 备份 AOF 目录时,还需协调重写与 manifest 切换。
6. 主从复制
副本先同步数据,再消费主节点的命令流。主节点确认写入时,复制默认异步。因此,提升落后副本会丢失它尚未收到的写入。
PSYNC 使用复制 ID 与偏移量识别同步位置。复制历史匹配且 backlog 仍覆盖缺口时,可部分重同步。缺口超出保留范围时,需要全量同步。
全量同步传输数据集,再衔接后续命令流。大数据集会增加主节点、网络和副本加载压力。backlog 容量应结合写入速率与允许断连时长规划。
7. 复制确认与落盘确认
WAIT 等待本连接此前写入被指定数量副本确认。返回值是实际确认的副本数量。超时返回较小数量时,原写入仍保留结果。
Redis 7.2 起支持 WAITAOF。它等待本连接此前写入在本地或副本完成 AOF 同步。
SET demo:order paid
WAITAOF 1 1 1000
该例要求本地和一个副本同步,最多等待 1000 毫秒。相关节点需开启 AOF。返回两个计数,分别表示本地与副本的完成情况。
确认更多副本可减少丢失风险,但仍需约束提升对象和故障模型。WAIT 与 WAITAOF 都不自动提供强一致复制。
8. Sentinel
Sentinel 监控主从组,并协调主节点故障转移。客户端据此发现新主节点。它管理可用性,数据仍受异步复制窗口影响。
单个 Sentinel 超时判断主节点不可达,标记主观下线。达到 quorum 个 Sentinel 同意后,形成客观下线。执行切换还需获得多数 Sentinel 授权。
例如部署 5 个 Sentinel,quorum 设置为 2。两个同意可判定下线,切换仍需至少 3 个授权。quorum 高于多数时,还需满足更高的 quorum 数量。
客户端应支持主节点地址刷新和连接切换。切换期间的超时与重试,还需业务幂等处理。
9. Cluster 与哈希槽
Cluster 用 CRC16(key) mod 16384 计算槽位。键包含有效 hash tag 时,使用花括号内的部分计算。槽再分配给主节点,主节点可配置副本。
{user:42}:profile 与 {user:42}:orders 使用相同 tag。因此它们落在同一槽,可参与要求同槽的多键操作。过度复用同一 tag,会把负载集中到一个节点。
MGET、事务和 Lua 的跨键访问需遵守同槽约束。客户端将跨槽读取拆成多次请求时,只获得多次独立操作。
10. MOVED 与 ASK 重定向
MOVED 表示当前槽由另一个节点负责。客户端重发请求,并更新槽映射。
ASK 用于槽迁移期间的临时转发。客户端先向目标连接发送 ASKING,再执行原命令。它只处理这一次请求,长期槽映射保持原样。
迁移中多键操作还会遇到 TRYAGAIN 等暂时错误。客户端应使用支持 Cluster 的实现,并限制重试预算。
11. Cluster 与网络分区
Cluster 的异步复制仍存在已确认写入丢失窗口。分区中的旧主可在故障检测生效前短暂接受写入。另一侧提升副本后,这些写入会被丢弃。
少数派一侧失去继续服务的条件。默认 cluster-require-full-coverage=yes 时,未覆盖槽会影响整个集群服务。设为 no 后,可继续服务仍被覆盖的槽。
客户端需区分拓扑变化、暂时不可用与业务执行结果未知。写入重试应带幂等依据,并限制总耗时。
12. 恢复目标与配置
RPO 表示允许丢失的数据量,常以时间衡量。RTO 表示允许的恢复耗时。配置还需考虑是否分片、是否读副本,以及故障域范围。
缓存可从数据库重建时,重点是重建容量和恢复速度。Redis 保存权威状态时,还需独立备份与结果核对。选定策略后,应演练进程、磁盘与主节点故障。
13. 常见问题
13.1 AOF 的恢复边界
AOF 的恢复点由实际持久化位置决定。异步复制切换还受被提升副本的进度影响。文件损坏需由独立备份恢复,因此应同时规划 RPO 与恢复验证。
13.2 多键操作与槽位
Cluster 的多键事务和脚本要求键在同一槽。hash tag 可控制共槽,但会集中负载。客户端自行拆分跨槽操作后,结果分属多次请求。
14 · 面试题卡片
本页题目与参考回答
14.1 Redis 的 RDB、AOF、复制和 Cluster 分别解决什么问题
考察重点
- 快照与命令日志的恢复点差异。
- 异步复制和故障转移的数据窗口。
- hash slot、重定向与多 key 限制。
参考回答
RDB 保存时间点快照,AOF 保存恢复所需的写操作。
复制保留运行副本,Sentinel 协调主从故障转移。Cluster 将 16384 个槽分给多个主节点,实现数据分片。
持久化恢复点取决于有效文件和同步策略。故障转移还取决于副本已接收的进度。选择时应按 RPO、RTO 和分片需求配置并验证。
14.2 Redis 的 AOF 重写期间如何接收新写入,混合格式是什么?
考察重点:基础文件、增量文件、manifest 与 RDB 前导。
相关内容:AOF 重写与混合格式。
参考回答
Redis 6 的父进程继续写旧 AOF,并保存增量。
子进程生成新文件,补齐增量后替换旧文件。Redis 7.0 起改用基础文件、增量文件和 manifest。父进程写增量,子进程生成基础文件,完成后切换清单。
Redis 6、7 默认 aof-use-rdb-preamble=yes。基础数据采用 RDB 格式,增量采用 AOF 命令。恢复时加载基础,再重放增量命令。
14.3 WAIT 与 WAITAOF 分别等待什么,超时会回滚写入吗?
考察重点:复制确认、AOF 同步与返回计数。
相关内容:复制确认与落盘确认。
参考回答
WAIT 等待副本确认收到本连接此前的写入。
Redis 7.2 的 WAITAOF 进一步等待指定节点同步 AOF。超时只结束等待,原写入不会自动撤销。客户端需检查实际确认数,并按故障模型处理结果。
14.4 5 个 Sentinel、quorum=2 时,两个节点能完成自动故障转移吗?
考察重点:客观下线与多数授权。
相关内容:Sentinel。
参考回答
5 个 Sentinel 中只有两个能互通时,无法完成自动故障转移。
quorum=2 允许这两个节点共同判定主节点客观下线,但切换仍需至少 3 个 Sentinel 的多数授权。quorum 负责故障判定,多数授权负责协调切换。
14.5 Cluster 的 MOVED 和 ASK 有什么区别?
考察重点:槽映射、迁移与 ASKING。
相关内容:MOVED 与 ASK 重定向。
参考回答
MOVED 指示槽的当前负责人,客户端应更新槽映射。
ASK 只临时转发本次请求。客户端在目标连接先执行 ASKING,再重发原命令。ASK 后仍保留原来的长期槽路由。
14.6 Redis 副本断线重连后,什么条件下能部分重同步?
考察重点:复制 ID、偏移量与 backlog 保留范围。
相关内容:主从复制。
参考回答
复制历史必须匹配,backlog 还需覆盖副本缺失的偏移范围。
满足时,PSYNC 只补发缺失命令。历史不匹配或缺口超出范围时,需要全量同步。backlog 应结合写入速率和允许断连时长规划。