Redis主从复制原理刨析

1.初次全量同步

当一个redis服务器初次向主服务器发送salveof命令时,redis从服务器会进行一次全量同步

1.slave服务器向master发送psync命令(此时发送的是psync ? -1),告诉master需要同步数据了。
2.master接收到psync命令后会进行BGSAVE命令生成RDB文件快照。
3.生成完后,会将RDB文件发送给slave。
4.slave接收到文件会载入RDB快照,并且将数据库状态变更为master在执行BGSAVE时的状态一致。
5.master会发送保存在缓冲区里的所有写命令,告诉slave可以进行同步了
6.slave执行这些写命令。

2.命令传播

slave已经同步过master了,那么如果后续master进行了写操作,比如说一个简单的set aaa redis,那么master执行过当前命令后,会将当前命令发送给slave执行一遍,达成数据一致性。

3.重新复制

当slave断开重连之后会进行重新同步,重新同步分完全同步和部分同步

1.当slave断开重连后,会发送psync 命令给master。
2.master收到psync后会返回+continue回复,表示slave可以执行部分同步了。
3.master发送断线后的写命令给slave
4.slave执行写命令。

4.三要素

实际上当slave发送psync命令给master之后,master还需要根据以下三点判断是否进行部分同步。
1.服务器运行ID

每个redis服务器开启后会生成运行ID。
当进行初次同步时,master会将自己的ID告诉slave,slave会记录下来。
当slave断线重连后,发现ID是这个master的就会尝试进行部分重同步。
当ID与现在连接的master不一样时会进行完整重同步。

2.复制偏移量

复制偏移量包括master复制偏移量和slave复制偏移量。
当初次同步过后两个数据库的复制偏移量相同。
之后master执行一次写命令,那么master的偏移量+1。
master将写命令给slave,slave执行一次,slave偏移量+1,
这样版本就能一致。

3.复制积压缓冲区

1.当slave断开重连后,会发送psync 命令给master。
2.master首先会对服务器运行id进行判断,如果与自己相同就进行判断偏移量
3.master会判断自己的偏移量与slave的偏移量是否一致。
4.如果不一致,master会去缓冲区中判断slave的偏移量之后的数据是否存在。
5.如果存在就会返回+continue回复,表示slave可以执行部分同步了。
6.master发送断线后的写命令给slave
7.slave执行写命令。

原文参考

猜你喜欢

转载自blog.csdn.net/weixin_45596022/article/details/108331590