Redis主从复制原理(面试说这么多够不够?)


前言

主从复制是Redis分布式的基础,Redis的高可用离开了主从复制将无从进行,更是哨兵集群基石,非常有必要了解,另外主从复制原理也是面试的常考点,所以我查阅了大量资料,尽可能做到有理有据,图文并茂,以此抛砖引玉,把主从复制原理讲明说透。


一、主从架构

主从架构可以一主一从,也可以一主多从从节点Slave可以从主节点Master同步数据,也可以让部分从节点Slave从节点Slave同步数据,缓存主节点压力。
在这里插入图片描述

二、主从复制全流程

  1. Slave和Master建立socket长连接
  2. Slave发psync命令给Master
  3. Master根据psync参数决定是全量复制,还是部分复制(断点续传)
  4. 如果全量复制:Master生成rdb,发给Slave加载rdb
  5. Master发送buffer数据给Slave加载到内存
  6. 通过socket长连续持续同步写命令数据

三、主从复制细化流程

replicaof 配置

首先,我们需要在Slave上配置:replicaof [masterIP] [masterPort] ,这个配置代表自己会从masterIP masterPort同步数据。(Redis 5.0之前是slaveof)
redis配置的原文注释说明如下:
在这里插入图片描述

slave发psync 命令

只要Slave配置了replicaof,那么不管这个Slave是否是第一次连接上Master,它都会发送一个psync [runId] [offset]命令给master请求复制数据。(redis2.8之前使用sync,sync只支持全量复制,而psync支持全量和部分复制)

runId:每个redis节点启动都会生成唯一的uuid,每次redis重启后,runId都会发生变化。客户端执行info server 命令查看:
在这里插入图片描述

offset:主节点和从节点都各自维护自己的主从复制偏移量offset,当主节点有写入命令时,offset=offset+命令的字节长度。从节点在收到主节点发送的命令后,也会增加自己的offset,并把自己的offset发送给主节点。这样,主节点同时保存自己的offset和从节点的offset,通过对比offset来判断主从节点数据是否一致。

master响应psync 命令

对于Slave发送的psync [runId] [offset]命令,Master有三种响应:
在这里插入图片描述

FULLRESYNC:进行全量复制
CONTINUE:进行部分复制 (断点续传)
ERR:不支持psync命令,进行全量复制

全量复制

全量复制发生的两种情况:

  1. 第一次连接,Slave发送的是psync ? -1命令,(因为第一次发送,不知道主节点的runId,所以为?,因为是第一次复制,所以offset=-1)。
  2. 断开重新连接后runid或offset不合法,Slave会发送存储的master节点runid和已同步的offset,如果master的runid变了,或者slave记录的offset不在master的buffer队列里,那么也会触发全量复制。

详细流程如下图:
在这里插入图片描述

补充说明:

  • 如果Master收到了多个Slave并发连接请求,它只会进行一次持久化,然后再把这一份持久化的数据发送给多个并发连接的slave。
  • Slave如果开启了AOF,在加载RDB后也会异步重写AOF文件。

部分复制(断点续传)

从全量复制中,我们知道Master有一个缓冲队列repl-backlog-buffer,这个队列是维护在内存队列中的,缓存固定长度的数据,是通过repl-backlog-size配置的,默认1mb,配置中的注释说明如下:
在这里插入图片描述
基于此队列,master和它所有的slave都维护了复制的数据偏移量offset和master的runid,因此,当网络连接断开后,slave通过psync命令发送master的runid和offset,这里master会对比runid是否过期了,或者offset是否维护在缓存队列中,如果满足,从offset开始一次性将数据发送给slave节点。后续仍是通过socket长连接Master持续把写命令发给Slave.

流程图如下:
在这里插入图片描述


四、参考资料

面试官:请讲一下Redis主从复制的功能及实现原理
读配置、讲原理、看面试真题,我只能帮你到这了。。
Redis主从复制原理

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天罡gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值