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
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: 下面是一些常见的 Redis 面试题: 1. Redis 是什么? 2. Redis 有哪些数据类型? 3. Redis 是如何支持高并发的? 4. Redis 的优势在哪里? 5. Redis 的持久化方式有哪些? 6. Redis 支持集群吗?如何搭建 Redis 集群? 7. Redis 的事务机制是什么? 8. Redis 支持 Lua 脚本吗?为什么要使用 Lua 脚本? 9. Redis 支持消息队列吗?如何使用 Redis 实现消息队列? 10. Redis 如何实现缓存淘汰策略? 希望这些问题能帮到您。如果您有更多问题需要提问,我将尽快回答。 ### 回答2: redis面试题的数量实在是太多了,我无法在这个回答中列举所有题目,但是我可以给你一些不同难度级别的redis面试题作为参考。希望下面的问题能帮到你: 1. Redis是什么?它的主要特点是什么? 2. Redis的数据类型有哪些?请分别明每种数据类型的特点和使用场景。 3. Redis的持久化机制是什么?它有哪些策略可以选择? 4. Redis主从复制是什么?请描述主从复制的工作原理。 5. Redis的集群模式是什么?请描述集群模式的工作原理。 6. Redis如何解决缓存穿透的问题?有哪些具体的方案可以采用? 7. Redis如何解决缓存击穿的问题?有哪些具体的方案可以采用? 8. Redis如何解决缓存雪崩的问题?有哪些具体的方案可以采用? 9. Redis如何实现分布式锁?请描述具体的实现方式。 10. Redis的并发竞争问题如何解决?请描述具体的解决方案。 以上是一些基础的Redis面试题,如果你对Redis有更深入的了解,你可以进一步探讨关于缓存淘汰策略、Redis事务、Redis的应用场景等更高级的问题。建议你通过阅读相关的技术资料和参加面试题集训班来更深入地了解Redis,并进一步准备面试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天罡gg

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

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

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

打赏作者

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

抵扣说明:

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

余额充值