ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis设计与实现3.1:主从复制 [打印本页]

作者: 小秦哥    时间: 2022-6-23 19:12
标题: Redis设计与实现3.1:主从复制
主从复制

这是《Redis设计与实现》系列的文章,系列导航:Redis设计与实现笔记
SLAVEOF
新旧复制功能

旧版复制功能

旧版复制功能的实现为 同步命令传播
当刚连上Master时,要做一次全同步:
sequenceDiagram        participant Slave        participant Master        Slave->>Master: SYNC        Master->>Master: BGSAVE        Master->>Master: 记录此时的命令到缓冲区中    Master->>Slave: 发送RDB    Master->>Slave: 发送命令缓冲区中的命令之所以要用到缓冲区是因为,在主节点进行 BGSAVE 的过程中如果有命令执行,那么我们要把这些命令也记录下来。
之后,主从节点之间只用 命令传播 就可以做到同步了,也就是说主节点执行什么命令,从节点跟着执行。(当然,一些随机、时间类的函数会直接转换成定值)
旧版复制的缺陷

如果从节点断线后重新连接,旧版复制功能的效率很低,因为为了让从服务器补足一小部分的确实却要进行一次 SYNC 命令
为什么低效:
新版复制功能

用 PSYNC 命令代替 SYNC。
PSYNC 具有 完整重同步部分重同步 两种模式,分别针对初次同步和重新同步两种场景。
复制功能的实现

复制的实现

复制的一些具体的细节,当进行复制时:
如何部分重同步

要关注的三个部分:
PSYNC的逻辑

graph LR;S(接收到SLAVEOF命令) --> A{第一次复制?}A --Y--> A1[发送PSYNC ? -1] --> E1(返回+FULLRESYNC &ltrunid> &ltoffset&gt)A --N--> A2[发送PSYNC &ltrunid&gt &ltoffset&gt] --> B{主服务器返回 +CONTINUE}B --N--> E1B --Y--> E2[执行部分重同步]主要是判断 是否是第一次复制是否是同一个主服务器,从而决定是部分重同步还是全同步。
上图没有展示的是,如果主服务器不支持 PSYNC,则返回 -ERR
心跳检测

心跳检测:在命令传播阶段,从服务器默认每秒发送一次心跳:REPLCONF ACK 。
作用有三:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4