小工具      在线工具  汉语词典  css  js  c++  java

Redis主从复制原理(面试的时候就这些够了吗?)

redis,redis,面试,java 额外说明

收录于:40天前


前言

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


一、主从架构

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

二、主从复制全流程

  1. Slave和Master建立长套接字连接
  2. Slave向Master发送psync命令
  3. Master根据psync参数决定是全部复制还是部分复制(断点续传)。
  4. 如果全量复制:Master生成RDB并发送给Slave加载RDB。
  5. Master发送缓冲区数据到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主从复制原理

. . .

相关推荐

额外说明

maven打包的小细节

打包 一般都是 clean install 那么 package,install,deploy都有什么区别??? package: 只打jar报 install : 打完jar包, 然后将它传到本地仓库 执行了package deploy: 将本地仓库的

额外说明

Docker镜像构建失败:Dockerfile语法错误

Docker镜像构建失败:Dockerfile语法错误 - Docker镜像构建失败:Dockerfile语法错误 - 摘要 引言 正文 Dockerfile语法错误的危害 1. 构建失败 2. 延误交付 常见的Dockerfile语法错误 1. 命令错

额外说明

渗透武器库—— black Arch Linux Vmware 安装

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

Flutter移动应用开发实战——章节介绍

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

机器学习 第五节 第六课

[toc] 索引的复合索引 简单的索引操作: 获取 index: 执行结果: 指定 index: 执行结果: 重新设置 index: 执行结果: 指定某一列作为 index: 执行结果: 执行结果: 返回 index 的唯一值: 执行结果:  

额外说明

iview中的table后端排序,页面数据跟接口返回的数据顺序不一致问题

iview中的table sortable排序时,发现页面数据跟接口返回的数据顺序不一样 { title: '退货比例', // sortable: true, // 错误写法 sortable: 'custom', // 正确写法

额外说明

排序:Java实现快速排序原理及代码注释详解

快速排序 1.简介: 快速排序是对冒泡排序的一种改进。它的最坏时间复杂度为O(n2),最好时间复杂度为O(nlogn),平均时间复杂度为O(nlogn),它是不稳定排序。 基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外

额外说明

JetsonNano板子的RPi.GPIO接口实物图和功能介绍

GPIO(General Purpose Input Output,通用型输入输出),对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制

额外说明

多线程安全问题原理和解决办法,Synchronized和ReentrantLock使用与区别

文章目录 线程安全问题概述 卖票问题分析 线程安全问题代码实现 线程安全问题原理分析 解决线程安全问题办法1-synchronized同步代码块 同步技术原理分析 解决线程安全问题办法2-synchronized普通同步方法 解决线程安全问题办法3-sy

额外说明

谷歌浏览器设置地址栏默认搜索为百度搜索

谷歌浏览器默认是使用谷歌搜索,但是因为在中国是无法访问谷歌搜索的,所以需要将百度搜索做为默认搜索 点击右上角按钮,选择设置。 选择搜索引擎,下拉选择设置百度为地址栏搜索引擎。 设置后效果如下

ads via 小工具