Redis 主从同步的过程主要包括以下几个步骤:
1. 初次同步(全量复制)
当一个 Redis 从节点(slave)第一次连接到主节点(master)时,通常会执行全量复制。这一过程包括以下步骤:
- 建立连接:从节点向主节点发送 SYNC 或者 PSYNC 命令。
- 主节点生成快照:主节点接收到命令后,会执行 BGSAVE 命令生成 RDB 快照,并将快照保存到磁盘。
- 传输快照:主节点将 RDB 文件发送给从节点,从节点接收到后会将其加载到内存中,替换原有的数据。
- 同步增量数据:在生成快照期间,主节点仍在处理新的写操作。主节点会将这些操作命令缓存在内存中,并在快照传输完成后,将这些缓冲区中的命令发送给从节点,从节点再依次执行这些命令以达到数据同步。
2. 增量同步
- 命令传播:在初次同步完成后,主节点的每一个写操作都会被发送给从节点,从节点接收到命令后会立即执行,确保主从数据的一致性。这种方式称为增量同步。
- AOF 文件同步:如果 Redis 配置了 AOF 持久化,主节点还会将 AOF 日志中的命令发送给从节点进行同步。
3. 断线重连(部分复制)
- PSYNC 命令:Redis 2.8 版本引入了 PSYNC 命令,用于支持部分复制。当从节点因网络问题与主节点断开连接并重新连接时,主节点可以只发送断开期间的增量数据,而不需要进行全量复制。
- 复制偏移量和复制积压缓冲区:主节点会为每个从节点维护一个复制偏移量,并在主节点上保留一个固定长度的复制积压缓冲区。该缓冲区存储了最近的写操作命令。如果从节点的偏移量落在缓冲区内,主节点只需将这部分数据发送给从节点。如果偏移量不在缓冲区范围内,从节点则需要进行全量复制。
4. 同步完成后的心跳机制
主从节点之间还会定期发送心跳包(PING-PONG)来检测连接的健康状态以及从节点的复制偏移量是否正确。
5. 主从切换
如果主节点故障,从节点可以被手动或者通过工具(如 Redis Sentinel)提升为主节点,原来的从节点可以继续成为新主节点的从节点,并进行数据同步。
Redis 的主从同步机制设计较为简单且高效,但对于网络和磁盘性能有一定要求,尤其是在全量复制阶段。为了保证高可用性,通常会结合 Redis Sentinel 或 Redis Cluster 进行集群管理和主从故障切换。