主从复制原理

主从复制原理,第1张

Redis的主从同步分为:    完整重同步(full resynchronization)
                                          部分重同步(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选项
检测命令丢失
>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10774765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存