当数据落在不同节点上时,如何保证数据节点之间的一致性是非常关键的 Redis采用主备复制的方式保证一致性,所有节点中,只有一个节点为主节点(master),它对外提供写服务,然后异步的将数据复制到其他节点上
Redis包含master 和slave 2种节点:
主备复制由master 主动触发
1、首先slave向master发起SYNC命令。这一步在slave启动后触发,master 被动的将新slave节点加入主备复制集群
2、master收到SYNC后,开启BGSAVE 操作。BGSAVE 是Redis的一种全量持久化机制(RDB)
3、BGSAVE完成后,master将快照信息发送给slave
4、发送期间,master收到来自Client的新写入命令,除了正常响应外,再存入一份到backlog队列
5、快照信息发送完成后,master继续发送backlog队列中的信息
6、backlog发送完成之后,后续的操作同时发给slave,保持实时的异步复制
如果有多个slave 同时发送SYNC 命令
当每次slave 通过SYNC 和master同步数据时,master都会dump 全量数据并发送
当一个已经和master 完成了同步,并且并保持了长时间的slave,当网络断开很短时间再重新连上时,master不得不重新做一次全量的dump传送。这种无疑会增加大量的无效开销,最好的方式是只同步网络断开期间的增量数据。
Redis的 PSYNC(Partial Sync)可以用于代替SYNC,做到master-slave基于断点续传的主备同步协议。master-slave 2端通过维护一个offset记录当前已经同步的命令,slave断开期间,master的增量命令会保存在缓存中。当slave重连后,告知master断开时的offset,master会将后续的数据继续同步,从而完成了断点续传。