Redis主从数据同步过程:命令传播、部分重同步、复制偏移量等
请记住胡广一句话,所有的中间件所有的框架都是建立在基础之上,数据结构,计算机网络,计算机原理大伙一定得看透!!~
1. Redis数据同步
1.1 数据同步过程
大家有没想过为什么Redis多机要进行数据同步?不会是MySQL主从架构要数据同步,Redis就照猫画虎吧。
虽然这两者有关系型数据库和非关系型数据库的差异,但都是作为存储数据的数据库系统。而主从架构的目的就在于对数据有多个"备份",有了多个"备份",就自然而然衍生出众多好处。如负载均衡、灾难恢复、数据备份。
既然要"备份",那数据同步就必不可少了。Redis主从数据同步大致的过程如下。
- 首先,从服务器会先向主服务器发送SYNC命令。
- 收到命令后,Redis主服务器会执行BGSAVE命令来生成一个RDB文件,并使用AOF缓冲区来记录在生成期间执行的写命令。关于BGSAVE命令和SAVE命令的区别,大家可以往前阅读我写的Redis系列文章。
- 完成第二步后,主服务器会将RDB文件发送给从服务器,让从服务器同步RDB文件数据。
- 当然这还没完,在生成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 ++ 从单链表到创建二叉树到二叉树的遍历(结构体)
首先我们要了解二叉树的数据结构是什么,本质上二叉树是一个有两个节点的链表,我们先了解的单链表的相关定义 单链表 创建一个朴素的单链表 #include <iostream>using namespace std;struct Node{int val;Node* next;Node(int x) : val(x), next(…...

Python 编程:如何巧妙运用 `abc` 模块解锁面向对象设计的新维度?
引言 在软件开发的世界里,面向对象编程(OOP)作为一门艺术,其精髓在于通过封装、继承与多态来构建可维护性高、易于扩展的系统。而在 Python 这门语言中,abc 模块则为我们提供了一种优雅的方式来定义抽象基类ÿ…...

Jenkins 执行 shell 时报错 Host key verification failed.
1. 问题描述 在 jenkins 中执行下面的 shell 语句时 sshpass -p "123456" scp -r * dep192.168.1.100:/home/dep/Desktop/报错 Host key verification failed.可能原因是由于首次登录时需要输入 yes 导致无法连接成功。 The authenticity of host 192.168.1.100…...

MyBatis-Plus&Druid数据源
MyBatis-Plus(简称MP)和Druid数据源在Java开发中各自扮演着重要的角色,它们分别增强了MyBatis的数据库操作能力和提供了高效的数据库连接池管理。以下是对MyBatis-Plus和Druid数据源的总结: MyBatis-Plus 定义与特性:…...

MTPA控制分析与推导
目录 MTPA (Maximum torque per ampere) 一. 控制目的 二. 设计思路 三. 推导过程 MTPA (Maximum torque per ampere) 一. 控制目的 忽略电机中的铁耗只考虑铜耗的背景下,希望实现铜耗最小化。 二. 设计思路 通过给出电机在d-q坐标系下的等效电路模型&…...

Spring Boot 的Web项目如何直接显示html
前言 实际的开发中,在Spring Boot的Web项目中直接使用html文件的场景已经比较少了, 或者是只需要很简单的页面显示,或者是演示的需要, 大部分的状况都是Spring Boot作为后端提供REST 的服务,结合其他的一些前端Framework进行开发,比如VUE,Ext JS等。 Spring Boot项目中…...

【回收站选址】
题目 代码 #include <bits/stdc.h> using namespace std; const int R 2e91; typedef long long LL; unordered_set<LL> s; int piles[5]; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int dx1[4] {-1, -1, 1, 1}, dy1[4] {-1, 1, -1, 1};bool check(LL …...

Springboot整合websocket(附详细案例代码)
文章目录 WebSocket简述WebSocket是什么?WebSocket 的特点WebSocket 的工作流程WebSocket的消息(帧)格式WebSocket 与 HTTP springboot中整合WebSocketpom依赖实体类配置类握手配置类WebSocket配置类 自定义异常类webSocket服务类websocket中Session的 getBasicRemo…...

微信小程序:navigateTo跳转无效
关于 navigateTo 跳转无效问题,在IOS、模拟器上面都能正常跳转,但是在安卓上面不能跳转,过了一段时间IOS也不能跳转了。仔细找了下问题结果是要跳转的页面是tab,不能使用navigateTo 取跳转修改为: wx.switchTab({url:…...

C++ 设计模式——解释器模式
目录 C 设计模式——解释器模式1. 主要组成成分2. 逐步构建解释器模式步骤1: 定义抽象表达式步骤2: 实现终结符表达式步骤3: 实现非终结符表达式步骤4: 构建语法树步骤5: 实现内存管理步骤6: 创建上下文和客户端 3. 解释器模式 UML 图UML 图解析 4. 解释器模式的优点5. 解释器模…...

【开源大模型生态6】生态大咖与产品布局
上图是基础设施、大模型、行业应用构成大模型开源生态体系。 这里一一给大家介绍以下。 金融 Qwen:阿里云推出的一种大型语言模型,具有强大的对话能力和多模态理解能力。天工:通常指的是阿里云的一套物联网(IoT)解决…...

虚拟机苹果系统的QT安装体验
前言 苹果系统MacOS中除了安装XCode,完全可以安装QT。本质上来讲,苹果系统就是Linux改装版本,实际上和Ubuntu非常的接近。 1、Mac对应的QT安装包的下载 安装参考链接:MacOS下Qt 5开发环境安装与配置_macos qt-CSDN博客 苹果系统…...