部分重同步(partial resynchronization)
有两种情况下是完整重同步:
slave连接上master第一次复制的时候;
如果当主从断线,重新连接复制的时候有可能是完整重同步
1从服务器连接主服务器,发送SYNC命令
2主服务器接收到SYNC命名后,开始执行bgsave命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
3主服务器basave执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
4从服务器收到快照文件后丢弃所有旧数据,载入收到的快照
5主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令
6从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
用于处理断线后重复制的情况,先介绍几个用于部分重同步的部分
runid(replication ID),主服务器运行id,Redis实例在启动时,随机生成一个长度40的唯一字符串来标识当前节点
offset,复制偏移量。主服务器和从服务器各自维护一个复制偏移量,记录传输的字节数。当主节点向从节点发送N个字节数据时,主节点的offset增加N,从节点收到主节点传来的N个字节数据时,从节点的offset增加N
replication backlog buffer,复制积压缓冲区。是一个固定长度的FIFO队列,大小由配置参数repl-backlog-size指定,默认大小1MB。需要注意的是该缓冲区由master维护并且有且只有一个,所有slave共享此缓冲区,其作用在于备份最近主库发送给从库的数据
当slave连接到master,会执行PSYNC <runid> <offset>发送记录旧的master的runid(replication ID)和偏移量offset,这样master能够只发送slave所缺的增量部分。但是如果master的复制积压缓存区没有足够的命令记录,或者slave传的runid(replication ID)不对,就会进行完整重同步,即slave会获得一个完整的数据集副本
当slave断开重连后,会发送psync 命令给master。
master首先会对服务器运行进行判断,如果与自己相同就进行判断偏移量
master会判断自己的偏移量与slave的偏移量是否一致。
如果不一致,master会去缓冲区中判断slave的偏移量之后的数据是否存在。
如果存在就会返回+continue回复,表示slave可以执行部分同步了。
master发送断线后的写命令给slave
slave执行写命令
PSYNC命令执行完整重同步和部分重同步的流程图
命令传播
当完成数据同步之后,主从服务器的数据暂时达到一致状态,当主服务器执行了客户端的写命令之后,主从的数据便不再一致。为了能够使主从服务器的数据保持一致性,主服务器会对从服务器执行命令传播 *** 作,即 每执行一个写命令就会向从服务器发送同样的写命令
在命令传播阶段,从服务器会默认以每秒一次的频率向主服务器发送心跳检测REPLCONF ACK <replication_offset>其中replication_offset是当前从服务器的复制偏移量,该命令的作用有三个
检测主从服务器的网络连接状态
辅助实现min-slaves选项
检测命令丢失
>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)