当前位置: 首页 > news >正文

Redis主从数据同步过程:命令传播、部分重同步、复制偏移量等

请记住胡广一句话,所有的中间件所有的框架都是建立在基础之上,数据结构,计算机网络,计算机原理大伙一定得看透!!~

1. Redis数据同步

1.1 数据同步过程

大家有没想过为什么Redis多机要进行数据同步?不会是MySQL主从架构要数据同步,Redis就照猫画虎吧。

虽然这两者有关系型数据库和非关系型数据库的差异,但都是作为存储数据的数据库系统。而主从架构的目的就在于对数据有多个"备份",有了多个"备份",就自然而然衍生出众多好处。如负载均衡、灾难恢复、数据备份。

既然要"备份",那数据同步就必不可少了。Redis主从数据同步大致的过程如下。

  1. 首先,从服务器会先向主服务器发送SYNC命令
  2. 收到命令后,Redis主服务器会执行BGSAVE命令来生成一个RDB文件,并使用AOF缓冲区来记录在生成期间执行的写命令。关于BGSAVE命令和SAVE命令的区别,大家可以往前阅读我写的Redis系列文章。
  3. 完成第二步后,主服务器会将RDB文件发送给从服务器,让从服务器同步RDB文件数据。
  4. 当然这还没完,在生成RDB文件的过程中,仍然会有其他写命令到达服务器。Redis主服务器的AOF缓冲区会继续发送给从服务器,让它们之间的数据同步至最终状态

1.2 命令传播

有了AOF缓冲区的概念还没完,Redis主从复制还有一个命令传播的概念等着你去学。

从服务器使用SYNC进行初次数据同步后,主、从服务器的数据库状态并不是每时每刻都保持一致的,这种情况反而是常态。肯定不能为了一条写指令的差异就重新执行SYNC命令,因为SYNC命令是一个非常耗费资源的操作。

这种情况Redis主服务器会将造成主从服务器数据不一致的写命令,即最近执行的写命令,发送给从服务器执行。这便是命令传播的过程,当从服务器执行命令后,主从服务器的数据库状态也就保持了一致。

如果后续有新的命令写入主服务器,主服务器会继续重复命令传播的过程。

1.3 部分重同步

主从服务器断线的话,假设你是Redis开发者,要怎么高效地恢复主、从服务器数据同步的状态。

如果还是用的RDB文件来同步,也太浪费资源了。有可能只是短时间断线,执行的写命令不过几十个,上文我已经提到SYNC命令是很耗费资源的一种操作。

能不能有一支记号笔,在主、从服务器断线时在主服务器的命令队列画下一个记号?

其实Redis除了提供SYNC命令的支持,还有一个叫PSYNC命令

主从服务器断线后,Redis从服务器会发送一个PSYNC命令给主服务器。收到命令后主服务器会将两者断线期间执行的写命令一条不剩地发送给从服务器。

从服务器执行命令后,主、从服务器的数据也就同步了。这种同步方式也叫部分重同步

1.4 复制偏移量

提前剧透下,前面提到的记号笔就是复制偏移量,命令队列也就是复制积压缓冲区队列

Redis主、从服务器都会去维护一个复制偏移量,复制偏移量是什么?例如主从服务器的初始偏移量都是0,主服务器发送给从服务器N字节数据后,主从服务器的偏移量就会 + N。复制偏移量通过该数值来代表主服务器发送给从服务器的字节总量

通过复制偏移量就可以来记录同步状态。

Redis其实有是一个容器来存储命令传播的写命令,命令传播的命令保存在一个有复制偏移量标识的复制积压缓冲区队列。

从服务器发送PSYNC命令给主服务器,还会同时发送从服务器的复制偏移量。主服务器只要根据该复制偏移量在复制积压缓冲区队列中找到对应的命令,就可以发送相关命令给到从服务器。

2. 服务器运行ID

每个Redis节点都有自己的服务器运行ID,这个ID由服务器启动时自动生成。

当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。

当断线后数据同步时,从服务器会向当前连接的主服务器发送之前保存的主服务器运行ID

如果此时主服务器发现从服务器发送的运行ID与自己的不一致。那就说明此时的主服务器是新的主服务器,它也没有复制积压缓冲区队列,也就不能进行部分重同步。此时Redis主服务器会向从服务器发送RDB文件来进行数据同步。

3. Redis心跳检测

从服务器默认会每秒一次向主服务器发送心跳检测命令,如果主服务器超过1s没有收到replconf命令,说明主从服务器的网络连接有问题了。

以下是心跳检测命令。

REPLCONF ACK <replication_offset>

同时这个心跳检测命令还会附带传送一个复制偏移量,也就是上文的replication_offset

在心跳检测时的过程中,如果主服务器发现他们的复制偏移量不一致,就会通过该偏移量找到从服务器丢失的写命令,从而发送给从服务器保持同步。

到这我们就知道了,心跳检测不仅仅能让主服务器检测从服务器是否存活。Redis开发者很聪明,在从服务器发送心跳检测命令时添加复制偏移量,让心跳检测也具有检测命令丢失的功能。

 你好,我是胡广。 致力于为帮助兄弟们的学习方式、面试困难、入职经验少走弯路而写博客 🌹🌹🌹 坚持每天两篇高质量文章输出,加油!!!🤩

 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注     吧 我会尽力带来有趣的内容 。

 😎感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以      给我留言咨询,希望帮助更多的人

更多专栏:
📊 Java设计模式宝典:从入门到精通(持续更新)

📝 Java基础知识:GoGoGo(持续更新)

⚽ Java面试宝典:从入门到精通(持续更新)

🌟 程序员的那些事~(乐一乐)

🤩 Redis知识、及面试(持续更新)

🚀 Kafka知识文章专栏(持续更新)

🎨 Nginx知识讲解专栏(持续更新)

📡 未完待续。。。

🎯 未完待续。。。

🔍 未完待续。。。

感谢订阅专栏 三连文章

相关文章:

Redis主从数据同步过程:命令传播、部分重同步、复制偏移量等

请记住胡广一句话,所有的中间件所有的框架都是建立在基础之上,数据结构,计算机网络,计算机原理大伙一定得看透!!~ 1. Redis数据同步 1.1 数据同步过程 大家有没想过为什么Redis多机要进行数据同步&#…...

《JavaEE进阶》----13.<Spring Boot【配置文件】>

本篇博客讲解 1.SpringBoot配置文件的格式以及对应的语法 2.了解两个配置文件格式的差异、优缺点。 我们这里只做简单的介绍。看会,了解,学会读取就行了。 因为配置文件实在太多了,这里只做基础的介绍。 一、配置文件的作用 前言 计算机中有许…...

【练习8】

链接:https://www.nowcoder.com/questionTerminal/e671c6a913d448318a49be87850adbcc 分析: 创建一个二维数组来实现杨辉三角,因为当前元素的值是上一行的当前列与前一列的和,所以创建数组的时候要实现n1,相当于罩子一…...

vivado 时间汇总报告

步骤7:时间汇总报告 定时路径在时钟元素处开始和结束。输入和输出端口不是顺序的 元素,默认情况下,Vivado时序分析不会对进出I/O端口的路径进行计时 设计,除非指定了输入/输出延迟约束。 在此步骤中,您将在Vivado中生成…...

【软考】设计模式之代理模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.代理模式(Proxy Pattern)。2.意图:为其他对象提供一种代理以控制对这个对象的访问。3.通过提供与对象相同的接口来控制对这个对象的访问。4.是设计模…...

3.创建型设计模式详解:生成器模式与原型模式的深度解析

设计模式(Design Patterns)是软件开发中常用的解决方案,帮助开发者处理常见的设计问题。创建型设计模式专注于对象的实例化,旨在提高系统的灵活性和可维护性。在这篇文章中,我们将深入探讨创建型设计模式中的生成器模式…...

goframe结构体标签和命令行标签

元数据gmeta 基础标签 更多了解:https://swagger.io/specification/ g.Meta path:"/profile" method:"get" summary:"展示个人资料页面" tags:"个人" g.Meta mime:"text/html" type:"string" example…...

pytest压力测试:不断发送数据,直到发现数据丢失

示例场景 假设有一个 send_data 函数接受数据并返回成功或失败的状态。 创建一个测试用例,通过逐步增加数据量来测试这个函数,直到返回失败为止。 步骤 定义压力测试函数 定义一个函数。不断发送数据,直到发现数据丢失。 创建 pytest 测试…...

自选择问题和处理效应模型

自选择问题和处理效应模型 DGP 注意: 这里的概率密度超过了1,这是正常的。概率密度的三原则,1是大于等于0;2是积分等于1;对于连续型随机变量,给定一个具体的x值,f(x)并不是该事件发生的概率。而…...

[数据集][目标检测]水面垃圾检测数据集VOC+YOLO格式2027张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2027 标注数量(xml文件个数):2027 标注数量(txt文件个数):2027 标注…...

OpenCV 之 模版匹配多个对象、图片旋转 综合应用

引言 在图像处理和计算机视觉中,模板匹配是一种常用的技术,用于在一幅较大的图像中查找与给定模板图像相似的部分。然而,在实际应用中,目标物体可能会出现在不同的角度,这就需要我们在匹配之前对模板进行旋转处理。本…...

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细…...

机械学习—零基础学习日志(Python做数据分析02)

现在开始使用Python尝试做数据分析。具体参考的网址链接放在了文章末尾。 引言 我通过学习《利用Python进行数据分析》这本书来尝试使用Python做数据分析。书里让下载,anaconda,使用Jupyter来写代码,只是下载一个anaconda的确有点费时间&am…...

BRAM IP Native模式使用

简介 BRAM(‌Block RAM)是‌FPGA(Field-Programmable Gate Array)中的一种专用RAM资源,固定分布在FPGA内部的特定位置。该内容主要对BRAM(Block RAM”的缩写)Native模式下IP界面做详细描述和使用…...

react的useRef用什么作用

useRef 是 React 提供的一个钩子,用于在函数组件中创建和管理对 DOM 元素或组件实例的引用。它返回一个包含 current 属性的对象,可以用来存储对某个值的引用,而这个引用在组件的整个生命周期内保持不变。 useRef 的主要用途 1.访问 DOM 元素…...

10.2 TCP IP模型、IP协议、IPv4、子网掩码

TCP / IP 协议族 IP协议 IPv4地址 IPv4地址分类 子网掩码 子网掩码用来区分 网络地址 和 主机地址 真题 1...

工业相机飞拍的原理及工作原理

工业相机飞拍(或称为工业高速相机飞行拍摄)是一种利用高速图像捕捉技术和精密运动控制系统进行高效图像采集的先进技术。它广泛应用于工业检测、质量控制和自动化生产等领域。本文将详细探讨工业相机飞拍的原理及其工作方式。 一、工业相机飞拍的基本概…...

通过AI来创建一个_____html css网页制作成品 例子演示

使用AI 输入创建一个 html css网页制作成品 例 然后出来 好的,我将为您创建一个简单的HTML和CSS网页制作的示例。这个示例将包括基本的布局、文本样式和一些内联的CSS样式。 { "name": "dalle", "description": "A simple exa…...

C ++ 从单链表到创建二叉树到二叉树的遍历(结构体)

首先我们要了解二叉树的数据结构是什么&#xff0c;本质上二叉树是一个有两个节点的链表&#xff0c;我们先了解的单链表的相关定义 单链表 创建一个朴素的单链表 #include <iostream>using namespace std;struct Node{int val;Node* next;Node(int x) : val(x), next(…...

Python 编程:如何巧妙运用 `abc` 模块解锁面向对象设计的新维度?

引言 在软件开发的世界里&#xff0c;面向对象编程&#xff08;OOP&#xff09;作为一门艺术&#xff0c;其精髓在于通过封装、继承与多态来构建可维护性高、易于扩展的系统。而在 Python 这门语言中&#xff0c;abc 模块则为我们提供了一种优雅的方式来定义抽象基类&#xff…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...