
Redis中通过slaveof命令或者设置slaveof选项,实现让一个节点(slave)称为另一个节点(master)的从节点。进行复制中的主从之间具有数据一致性,当在主节点设置key-value时,从节点也会存在相应的数据;当主节点删除某一key-value时,从节点也会删除相应的数据。
同步(sync)
主从之间使用同步在保持数据一致性时,执行的过程如下所示:
其中slaveof命令用于主从节点之间的互联,SYNC命令用于数据同步,BGSAVE用于执行RDB持久化操作。另外,主节点在执行持久化操作期间,会将持久化开始到结束所执行的所有写命令放入缓冲区中。当主节点在发送完RDB文件后,还需要向从节点发送缓冲区中所有的写命令,当前从节点也需要执行这些写命令,从而真正的保持数据的一致性。
命令传播(command propagate)
sync方式可以保证在操作执行结束后,主从节点之间的数据一致性。如果同步操作执行结束后,主节点对于数据执行了其他的操作,可能会使得主从之间不再有一致性保持。因此,此时需要将主节点上执行的命令也发送给从节点执行,继续保证数据的一致性。
PSYNC
前面的sync和命令传播虽然能够保证主从之间的数据一致性,但是当主从断连之后再次连接后,如果仍然想保证数据一致性,主节点就需要对所有的数据执行RDB操作,然后发送给从节点载入。但是,主从在断连之前大部分数据是一致的,如果每次都要执行完整数据的持久化操作,必然会消耗大量的内存、CPU、磁盘IO和网络IO等资源,效率较低。
PSYNC主要通过完整重同步和部分重同步来保证主从数据一致性,其中完整重同步发生在主从之间初次复制时,执行的同步操作和sync是相同的。而部分重同步实现了在主从重连之后,主节点只需要将断开期间节点上发生的命令发送给从节点即可,而无需再次执行BGSAVE命令,传输完整的RDB文件。
