redis的主从同步(二)2.8以后的方式

2022-01-17  本文已影响0人  小草莓子桑

接上篇,《redis的主从同步(一)2.8版本以前的方式》,在最后,讲了到了2.8版本之前的方式有缺陷,大家还记得吧,今天来讲讲从2.8版本开始redis主从同步方式的改进

先来回顾下2.8版本之前redis主从同步方式的缺陷

总结下来就是,老版的主从同步方式对于断线重连情况下很低率,所以2.8版本开始通过PSYNC命令代替了SYNC命令来执行同步操作

PSYNC命令

完整同步模式(full resynchronization)
部分同步模式(partial resynchronization)
来看下断线重连情况下的PSYNC命令执行过程
时间 主服务器 从服务器
T0 主从服务器完成同步 主从服务器完成同步
T1 执行传播命令,传播 set k1 v1 命令 执行主服务器传播过来的 set k1 v1 命令
T2 执行传播命令,传播 set k2 v2 命令 执行主服务器传播过来的 set k2 v2 命令
T3 此时发生故障,主从服务器断开链接 此时发生故障,主从服务器断开链接
T4 set k3 v3 此时已经和主服务器断开连接,set k3 v3 没有传播过来
T5 set k4 v4 此时已经和主服务器断开连接,set k4 v4 没有传播过来
T6 此时故障恢复,主从服务器重新链接 此时故障恢复,主从服务器重新链接
T7 向主服务器发送 PSYNC命令
T8 向从服务器发送确认回复,执行部分同步 接受到主服务器的确认回复,执行部分同步
T9 向从服务器发送set k3 v3、set k4 v4两个命令
T10 接收到主服务器发送过来的set k3 v3、set k4 v4两个命令,并执行
T11 此时主从服务器完成部分同步 此时主从服务器完成部分同步
主从服务器的复制偏移量
主服务器偏移量:offset=100
从服务器A偏移量:offset=100
从服务器B偏移量:offset=100
主服务器偏移量:offset=100
从服务器A偏移量:offset=200
(从服务器B和主服务器断开链接)从服务器B偏移量:offset=100
主服务器的复制积压缓存区
Node1:
offset=1
val=s
Node2:
offset=2
val=e
Node3:
offset=3
val=t
Node4:
offset=4
val=k
Node5:
offset=5
val=1
Node6:
offset=6
val=v
Node7:
offset=7
val=1
时间 主服务器 从服务器
T0 此时发生故障,主从服务器断开链接 此时发生故障,主从服务器断开链接
T1 此时故障恢复,主从服务器重新链接 此时故障恢复,主从服务器重新链接
T2 向服务器发送 PSYNC命令,命令中会将自己的复制偏移量发送过去
T3 接受到从服务器传过来的复制偏移量进行判断
T4 如果该复制偏移量以后的数据还存在复制缓存区里面,就执行部分同步,数据从复制缓存区取
T5 若果该复制偏移量以后的数据不存在了(因为队列先进先出),所以要执行完整同步
redis服务的运行id
PSYNC命令执行的详细过程
时间 主服务器 从服务器
T0 主服务器启动,生成唯一运行id(假装模拟一个)=1 从服务器启动,生成唯一运行id(假装模拟一个)=2
T1 此时,主从初次复制完成(假设没有命令),主偏移量offset=0,复制积压缓存区中间没有数据 此时,主从初次复制完成(假设没有命令),从偏移量offset=0
T2 执行传播命令,传播 set k1 v1 命令,把该命令写入复制积压缓存区,主偏移量offset=9 执行主服务器传播过来的 set k1 v1 命令,从偏移量offset=9
T3 执行传播命令,传播 set k2 v2 命令,把该命令写入复制积压缓存区,主偏移量offset=18 执行主服务器传播过来的 set k2 v2 命令,从偏移量offset=18
T4 此时发生故障,主从服务器断开链接 此时发生故障,主从服务器断开链接
T5 执行set k3 v3命令,把该命令写入复制积压缓存区,主偏移量offset=27 此时已经和主服务器断开连接,set k3 v3 没有传播过来
T6 执行set k4 v4命令,把该命令写入复制积压缓存区,主偏移量offset=36 此时已经和主服务器断开连接,set k4 v4 没有传播过来
T7 此时故障恢复,主从服务器重新链接 此时故障恢复,主从服务器重新链接
T8 向主服务器发送 PSYNC命令,带了上次同步的主服务运行id=1,从服务器的偏移量offset=18
T9 主服务器接受到PSYNC命令,通过对于运行id,发现是断线之前的两个服务器
T10 主服务器在判断从服务器发送过来从服务偏移量,从服务器发送过来的偏移量offset=18,主服务判断复制积压缓存区中offset=18以后的数据是否存在,发现数据存在,主服务器判断使用部分同步
T11 向从服务器发送确认回复,执行部分同步 接受到主服务器的确认回复,执行部分同步
T12 主服务从复制积压缓存区中偏移量offset=18以后的舒服,向从服务器发送set k3 v3、set k4 v4两个命令
T13 接收到主服务器发送过来的set k3 v3、set k4 v4两个命令,并执行,并更新从服务器的偏移量offset=36
T14 此时主从服务器完成部分同步,他们的偏移量都为offset=36 此时主从服务器完成部分同步,他们的偏移量都为offset=36

今天讲了redis的主从同步中的2.8版本以后的方式,欢迎大家来交流,指出文中一些说错的地方,让我加深认识,愿大家没有bug,谢谢!

上一篇下一篇

猜你喜欢

热点阅读