全量同步和增量同步概述:
全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。
增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave
什么时候执行全量同步?
slave节点第一次连接master节点时
slave节点断开时间太久,repl_baklog中的offset已经被覆盖时
什么时候执行增量同步?
slave节点断开又恢复,并且在repl_baklog中能找到offset时
增量同步
rel_baklog:可以理解为是一个数据存储的集合
offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。 如果slave的offset小于master的offset,说明slave数据落后于master,需要更新
replid:当前master节点的唯一标识,在同步前确保该slave节点对应的master节点的同一个
rel_baklog底层是一个数组,他有一个特点是超出下标范围就会从0下标开始覆写,如果slave对于覆写部分已经进行了读取那还好,如果没有进行读取,那么就不能再在repl_baklog中通过offset来读取新数据,而是将原数据全部删除,再对主节点进行全量同步操作才行
slave做数据同步,必须向master声明自己的replication id 和offset,master才可以判断到底需要同步哪些数据
全量同步
基本流程:
1.从节点向主节点发送 SYNC 命令请求进行同步。
该命令请求包含了一个参数,表示从节点的复制偏移量repl_offset以及目标master节点的idreplid。该偏移量指定了从节点需要获取的数据起始点,master节点的id指定了具体同步的master节点
2.主节点收到 SYNC 请求后,开始执行 BGSAVE 命令生成 RDB 文件,并使用缓冲区记录所有接收到的写命令操作。
主节点接收到 SYNC 命令请求后,会执行 BGSAVE 命令生成 RDB 文件,并将所有接收到的写命令操作记录在主节点的 Replication Buffer 中。
Replication Buffer 是 Redis 主节点用来缓存新的写操作的内存区域,它位于主节点的服务器状态结构体 server 中。通常情况下,主节点会将所有的写操作持久化保存在 AOF 日志文件中,但是在进行全量同步时,为了减少网络传输的压力,主节点将新的写操作暂时保存在 Replication Buffer 中。
3.当 BGSAVE 命令执行完毕并成功生成 RDB 文件后,主节点通过网络将这个 RDB 文件发送给从节点,并将缓冲区中记录的所有写命令也一起发送给从节点。
当 BGSAVE 命令执行完毕并成功生成 RDB 文件后,主节点将该RDB文件发送给从节点,并将缓冲区中记录的所有写命令也一起发送给从节点。
在全量同步时,主节点不仅需要将自己保存的数据发送给从节点,还需要记录接下来的写操作。因此,主节点通过网络将 RDB 文件和缓冲区中的所有写命令发送给从节点,以确保从节点可以获取到最新的数据状态。
4.从节点接收到主节点发送的 RDB 文件和写命令缓冲区后,先加载 RDB 文件,然后再执行缓冲区中的写命令,以达到与主节点相同的数据状态。
当从节点接收到主节点发送的数据之后,首先会进行 RDB 文件的加载。RDB 文件包含了主节点的快照数据,是从节点用于恢复自身数据的重要文件。
完成 RDB 文件加载后,从节点开始处理主节点发送的写命令缓冲区。从节点依次执行这些写命令,更新自身的数据状态,以达到与主节点相同的数据状态。
master如何判断slave节点是不是第一次来做数据同步?
首先看slave的offset,如果为空就直接全局同步,如果不为空就去判断Replocation id是否一致,不一致就全局同步,一致就根据offset的位置来同步后边新的数据