你想了解的是在 Redis 主从复制场景下,当主节点开启了 AOF(Append Only File)持久化机制时,从节点具体的同步逻辑和过程,对吧?
首先要明确核心结论:主节点开启 AOF 不会改变主从复制的核心流程,Redis 主从复制的核心依赖是主节点的内存数据、RDB 快照和复制缓冲区,而非直接使用 AOF 文件同步数据(因为 RDB 是紧凑的二进制快照,传输效率远高于 AOF 的文本命令日志)。下面详细拆解同步过程:
一、主从复制的完整同步流程(主节点开 AOF)
主从复制分为「全量同步」(首次同步 / 断线重连无法部分同步)和「增量同步」(日常同步)两个阶段,主节点的 AOF 会在这个过程中并行工作:
阶段 1:全量同步(核心依赖 RDB)
- 从节点发起同步请求 :从节点执行
slaveof 主节点IP 端口后,向主节点发送PSYNC ? -1命令,请求全量同步。 - 主节点准备同步数据 :
- 主节点收到请求后,执行
BGSAVE命令后台生成 RDB 快照文件(无论主节点是否开 AOF,都会生成 RDB,这是主从全量同步的标准操作); - 生成 RDB 期间,主节点收到的所有新写命令(如 SET、HSET)会做两件事:
- 写入AOF 缓冲区(因为开了 AOF,最终会刷入 AOF 文件,保证主节点自身数据持久化);
- 写入复制缓冲区(repl backlog)(专门用于主从同步的环形缓冲区,保证增量命令不丢失)。
- 主节点收到请求后,执行
- 主节点发送 RDB 文件:主节点完成 RDB 生成后,将 RDB 文件发送给从节点。
- 从节点加载 RDB:从节点接收完 RDB 文件后,先清空自身原有数据,然后加载 RDB 文件到内存,恢复主节点的快照数据。
- 同步增量命令:主节点将生成 RDB 期间写入复制缓冲区的增量命令,发送给从节点;从节点执行这些命令,将数据追平到主节点当前状态。
阶段 2:增量同步(日常数据同步)
全量同步完成后,进入增量同步阶段,主节点的 AOF 和复制缓冲区并行工作:
- 主节点每执行一个写命令,会同时完成三个操作(开 AOF 时):
- 写入内存(更新主节点自身数据);
- 写入AOF 缓冲区(定时 / 实时刷入 AOF 文件,保证主节点持久化);
- 写入复制缓冲区(供从节点同步)。
- 从节点通过
REPLCONF ACK命令持续向主节点确认自己的同步进度,主节点根据这个进度,将复制缓冲区中未同步的增量命令推送给从节点(或从节点主动拉取)。 - 从节点执行这些增量命令,保持与主节点的数据实时一致(从节点自身是否开 AOF 不影响同步,仅影响自身是否持久化这些命令)。
二、特殊场景补充
- 主节点 AOF 重写的影响 :主节点执行
BGREWRITEAOF时,会后台重写 AOF 文件,但这一操作完全不影响主从复制 ------ 因为复制依赖的是复制缓冲区,而非 AOF 文件本身。 - 从节点 AOF 的独立状态:从节点是否开启 AOF,仅决定它是否将同步来的命令写入自己的 AOF 文件,不影响从主节点同步数据的逻辑。
总结
- 主节点开启 AOF 不改变主从复制的核心逻辑,全量同步仍依赖主节点生成的 RDB 文件(而非 AOF 文件),因为 RDB 传输效率更高。
- 主节点的写命令会「双写」:同时写入 AOF 缓冲区(保证自身持久化)和复制缓冲区(保证同步给从节点),两者互不干扰。
- 增量同步阶段,从节点通过复制缓冲区获取主节点的增量命令,始终与主节点数据保持一致,AOF 仅作用于主节点自身的持久化。