当启动多个 Redis 实例的时候,它们相互之间就可以通过 replicaof(Redis 5.0 之前使用 slaveof)命令形成主库和从库的关系。例如,让实例 1(ip:172.16.19.3)和实例 2(ip:172.16.19.5)成为主从关系的命令:replicaof 172.16.19.3 6379
,当关系建立后,第一次同步分数据为三个阶段:
(1)从库给主库发送 psync 命令,表示要进行数据同步,包含主库的 runID(redis 实例启动生成的随机 ID) 和复制进度 offset 两个参数,初次复制runID 为 ?offset 为 -1,主库会用 FULLRESYNC(初次为全量复制)响应命令带上两个参数返回给从库,从库收到响应后会记录 runID、offset 两个参数。
(2)主库执行 bgsave 命令,生成 RDB 文件并发给从库,从库会先清空当前数据库,然后加载 RDB 文件。这个过程中主库不会被阻塞,为了保证主从库的数据一致性,主库会在内存中用专门的 replication buffer,记录 RDB 文件生成后收到的所有写操作。
(3)主库完成 RDB 文件发送后,就会把此时 replication buffer 中的修改操作发给从库,从库再重新执行这些操作。