【Redis】主从复制(下)--主从复制原理和流程
文章目录
- 主从复制原理
- 主从节点建立复制流程图
- 数据同步 psync
- psync的语法格式
- psync运行流程
- 全量复制
- 全量复制的流程
- 全量复制的缺陷
- 有磁盘复制 vs 无磁盘复制
- 部分复制
- 部分复制的流程
- 复制积压缓冲区
- 实时复制
主从复制原理
主从节点建立复制流程图

- 保存主节点的信息
- 从节点(slave)内部通过美妙运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点之后,会尝试与主节点建立基于tcp的网络连接.如果从节点无法建立连接,定时任务会无限重试直到连接成功或者用户停止主从复制.
- 发送ping命令
tcp网络连接建立成功之后,从节点通过ping命令确认主节点在应用层上是工作良好的.如果ping命令的结果pong返回超时,从节点结会断开tcp网络连接,等待定时任务下一次重新建立连接. - 权限验证
- 同步数据集
对于首次建立复制的场景,主节点会把当前持有的所有数据全部发送给从节点,这一步操作基本是耗时最长的,所以又划分成两种情况:全量同步和部分同步. - 命令持续复制
当从节点复制主节点的所有数据之后,针对之后的修改命令,主节点会持续的把命令发送给从节点,从节点执行修改命令,保证主从数据的一致性.
数据同步 psync
Redis使用psync命令完成主从数据同步(首次建立复制的场景中),同步过程为:全量复制和部分复制.
- 全量复制:一般用于初次复制的场景,Redis早期支持的复制功能只有全量复制,它会把主节点的数据一次性发送给从节点,当数据量较大的时候,会对主节点和网络造成很大的开销.
- 部分复制:用于处理在主从复制中因为网络闪断等原因造成的数据丢失的场景,当从节点再次连上主节点之后,如果条件允许,主节点会补发数据给从节点.因为补发的数据远小于全量数据,可以有效避免全量复制的过高开销.
psync的语法格式
psync replicationid offset
注意:
replicationid设置为?并且offset设置为-1,此时就是在尝试进行全量复制replicationid和offset设置为具体值,此时就是在尝试进行部分复制
什么是replicationid和offset?
replicationid/replid(复制id):主节点的复制id,主节点重新启动,或者从节点晋级成主节点,都会生成一个replicationid(同一个节点,每次重启,生成的replicationid也会发生变化,相当于一个主节点的唯一标识)offset(偏移量):参与复制的主从节点都会维护自身复制偏移量.主节点的offset中记录的是主节点操写命令的数据字节数;从节点offset中记录的则是从节点从主节点处同步到的数据字节数.所以,可以根据对比主从节点的复制偏移量,来判断主从节点数据是否一致
我们可以再回顾主节点的复制状态中的各种属性:

这里我们圈出几个重点属性:
-
master_repl_offset:主节点(master)在处理完写入命令后,会把命令的字节长度做累加记录 -
记录从节点属性中的
offset:该偏移量维护的是从节点从主节点那里同步了多少字节的数据,同时从节点也会每秒向主节点上报自身的复制偏移量给主节点 -
master_replid:主节点的复制id,主节点重新启动,或者从节点晋级成主节点,都会生成一个replicationid(同一个节点,每次重启,生成的replicationid也会发生变化,相当于一个主节点的唯一标识) -
master_replid2:一般默认为0,只有在异常情况下用来记录原来的master的replid.关于master_replid和master_replid2
这个设定解决的问题场景是这样的:
比如当前有两个节点:A--master和B-slave
此时B就会记录A的master_replid.
如果此时出现了网络抖动,B以为A挂了,B自己就会成为主节点.于是B给自己分配了一个新的master_replid.此时就会使用master_replid2来保存之前A的master_replid- 后续如果网络恢复了,B就可以根据
master_replid2找回之前的主节点; - 后续如果网络没有回复,B就按照新的master_replid自成一派,继续处理后续的数据.
- 后续如果网络恢复了,B就可以根据
所以,repid+offset共同标识了一个"数据集",如果两个节点,他们的replid和offset都相同,则这两个节点上持有的数据就一定相同
psync运行流程

- 从节点发送
psync给主节点,replid和offset默认值分别是?和-1 - 主节点根据
psync参数和自身数据情况确定响应结果:- 如果回复
+fullresync replidoffset,则从节点需要进行全量复制流程 - 如果回复
+contineu,从节点进行部分复制流程 - 如果回复
-err,说明Redis主节点版本过低,不支持psync命令.从节点可以使用sync命令进行全量复制
- 如果回复
psync一般不需要手动执行,Redis会在主从复制模式下自动调用执行sync会阻塞redis server处理其他请求,psync则不会
全量复制
全量复制时Redis最早支持的复制方式,也是主从第一次建立复制时必须经历的阶段.
全量复制的流程

- 从节点向主节点发送
psync命令,进行数据同步,由于是第一次进行复制,所以将进行全量复制 - 主节点根据命令,解析到需要进行全量复制,回复
+fullresync响应 - 从节点接收到主节点的运行信息,进行保存(如主节点的
ip和port) - 主节点执行
bgsave进行RDB文件的持久化 - 从节点发送
RDB文件给从节点,从节点保存RDB数据到本地硬盘 - 主节点将生成
RDB到就收完成期间执行的写命令,放入缓冲区中,等从节点保存完RDB文件后,主节点再将缓冲区内的数据补发给从节点,不发的数据仍然按照rdb的二进制格式追加写入到收到的rdb文件中,保持主从一致性 - 从节点清空自身原有的数据
- 从节点加载
RDB文件得到与主节点一致的数据 - 如果从节点加载
RDB文件完成之后,并且开启了AOF持久化功能,它会进行bgrewrite操作,得到最近的AOF文件
全量复制的缺陷
我们分析了全量复制的所有流程,就会发现:全量复制是一件高成本的操作,主节点bgsave的时间,RDB在网络传输的时间,从节点清空旧数据的时间,从节点加载RDB的时间等.所以一般应该尽可能避免对已经有的大量数据集的Redis进行全量复制
有磁盘复制 vs 无磁盘复制
默认情况下,进行全量复制需要主节点生成RDB文件到主节点的磁盘中,再把磁盘上的RDB文件通过网络发送给从节点
Redis从2.8.18版本开始支持无磁盘复制.主节点在执行RDB生成流程时,不会生成RDB文件到磁盘中了,而是直接把生成的RDB数据通过网络发送给从节点.这样就节省了一系列的写磁盘和读磁盘的开销
部分复制
部分复制主要是Redis针对全量复制的过高开销做出的一种优化措施,使用psync replicationid offset命令来实现.当从节点正在复制主节点时,如果出现网络闪断或者命令丢失等异常情况时,从节点会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区存在数据则直接发送给从节点,这样就可以保持主从节点复制的一致性.补发的这部分数据一般远远小于全量数据,所以减少了开销.
部分复制的流程

-
当主从节点之间出现网络中断时,如果超过了
repl-timeout的时间,主节点就会认为从节点故障并中断复制连接 -
主从连接中断期间,主节点依然响应命令,但这些复制命令都因为网络中断而无法及时发送给从节点,所以要暂时将这些命令滞留在复制积压缓冲区中
-
当主从节点网络恢复之后,从节点再次连上主节点
-
从节点将之前保存的
replicationid和复制偏移量作为psync的参数发送给主节点,请求部分复制 -
主节点接到
psync请求后,进行必要的验证.随后根据offset去复制积压缓冲区查找合适的数据,并且响应+continue给从节点- 注意:如果
replid不一样,那么就需要进行全量复制,如果replid一样,那么就需要判断offset是否还在复制积压缓冲区中,如果在,就直接进行部分复制;如果不再,就进行全量复制
- 注意:如果
-
主节点将需要从节点同步的数据发送给从节点,完成一致性
复制积压缓冲区
复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小是1MB,当主节点连接从节点的时候被创建,这时主节点响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区中,缓冲区本质上是一个先进先出的定长队列,所以能够实现保存最近已复制数据的功能,用于部分复制和复制命令丢失的数据补救.
我们可以在主节点中执行info replication来观察复制缓冲区的相关属性:

repl_backlog_active:1:开启复制缓冲区repl_backlog_size:148576:缓冲区的最大长度repl_backlog_first_byte_offset:1:起始偏移量,计算当前缓冲区可用范围repl_backlog_histlen:956418:已保存数据的有效长度
所以,根据上面的属性,我们可以计算出复制积压缓冲区内的可用偏移量范围:[repl_backlog_first_byte_offset,repl_backlog_first_byte_offset+repl_backlog_histlen]
如果进行偏移量的比对后发现,从节点需要的数据,已经超出了主节点的积压缓冲区的范围,则无法进行部分复制,只能进行全量复制了.
实时复制
我们刚才学过的全量复制和部分复制,全都是在数据进行初始化的过程中进行的,而实时复制是发生在主从节点之间已经同步完成数据了,然后架构主节点后续获得的信息继续同步到从节点中
主从节点在建立复制连接之后,主节点会把自己收到的修改操作,通过tcp长连接的方式,源源不断的输给从节点.从节点就会根据这些请求来同时修改自身的数据,从而保证和主节点数据的一致性.
另外,这样的长连接,需要通过心跳包的方式来维护连接状态(注意:这里的心跳包并不是tcp自带的心跳,而是应用层自行实现的心跳机制)
- 主从节点彼此都会存在心跳检测机制,各自模拟成对方的客户端进行通信
- 主节点默认每个10秒对从节点发送
ping命令,判断从节点的存活性和连接状态 - 从节点默认每隔1秒向主节点发送
replconf ack {offset}命令,给主节点上报自身当前的复制偏移量
如果主节点发现从节点通信演出超过repl-timeout配置的值(默认60秒),则判定从节点下线,断开复制客户端连接.从节点恢复连接之后,心跳机制将继续进行.
相关文章:
【Redis】主从复制(下)--主从复制原理和流程
文章目录 主从复制原理主从节点建立复制流程图数据同步 psyncpsync的语法格式 psync运行流程全量复制全量复制的流程全量复制的缺陷有磁盘复制 vs 无磁盘复制 部分复制部分复制的流程复制积压缓冲区 实时复制 主从复制原理 主从节点建立复制流程图 保存主节点的信息从节点(sla…...
Pencils Protocol上线 Vaults 产品,为 $DAPP 深入赋能
Pencils Protocol 是 Scroll 生态一站式综合收益平台,该平台以 DeFi 功能作为抓手,基于 Farming、Vaults、Auction 等功能不断向 LRT、LaunchPad、AI、FHE、RWA 等领域深入的拓展。 近期 Pencils Protocol 生态不断迎来重磅进展,一个是 $DAPP…...
uni-app+vue3+pina实现全局加载中效果,自定义全局变量和函数可供所有页面使用
首先自定义一个加载中组件 ccloading.vue <template><view class"request-loading-view" v-if"loadingShow"><view class"loading-view"><image class"loading-img" :src"loading" mode"aspectF…...
基于SSM+小程序的在线课堂微信管理系统(在线课堂1)(源码+sql脚本+视频导入教程+文档)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 &emsp1、管理员实现了首页、个人中心、用户管理、课程分类管理、课程信息管理、课程订阅管理、课程视频管理、公告栏管理、留言板管理、系统管理。 2、用户实现了首页、课程信息、公…...
Uniapp 微信小程序 最新 获取用户头像 和 昵称 方法 有效可用
文章目录 前言代码实现运行效果技术分析 前言 同事有个需求 授权获取用户头像 和 昵称 。之前做过线上小程序发版上线流程 就实现了下 最新的方法和 api 有些变化 记录下 代码实现 先直接上代码 <template><view class"container"><buttonclass&qu…...
儿童手抄报模板-200个(家有神兽必备)
在这个充满色彩与想象的世界里,每一位小朋友都是一位小小艺术家和梦想家。作为家长或老师,我们总是希望能为他们的学习生活增添一抹亮色,激发他们的创造力与探索欲。今天,就为大家带来一份超级实用的资源——儿童手抄报模板-200个…...
动态规划入门题目->使用最小费用爬楼梯
1.题目: 2.解析: 做题模式: 步骤一:找状态转移方程 步骤二:初始化 步三:填表 步骤四:返回-> dp[n] dp[i]表示到达 i 位置最小花费 逻辑:要爬到楼顶先找到 i 位置 , 要…...
中间添加一条可以拖拽的分界线,来动态调整两个模块的宽度
在 React 中操作 DOM 元素时,使用 document.querySelector 以及全局事件监听(如 addEventListener)并不推荐,因为这些方法无法与 React 的生命周期很好地协调,可能会导致内存泄漏或影响性能。 可以改为使用 useRef 和…...
C++的vector优化
1、C中的动态数组一般是特指vector类 2、vector需要优化的原因之一是当我们push_back元素到数组中时,如果原来分配给动态数组的内存不够用了,那么就会找一块更大的内存空间分配给数组,把旧的内容复制到新的内存中去,这就是导致程…...
基于飞腾平台的OpenCV的编译与安装
【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…...
pyside6与协程
目录 一、常见错误 错误一、使用协程函数作为槽函数。 错误二、在Qt循环中创建新的loop 二、解决方法: ①安装库qasync ②修改Qt入口 ③异步槽函数 ④异步函数 ⑤整体示例 一、常见错误 错误一、使用协程函数作为槽函数。 这样是肯定是不行ÿ…...
手机如何五开玩梦幻西游端游?用GameViewer远程手机免费畅玩梦幻西游
用手机就能免费玩梦幻西游端游,还可以随时查看挂机进度! 想要实现这一点,就用网易GameViewer远程,而且不光手机可以玩梦幻西游端游,平板也能免费玩,并为你实现五开玩梦幻西游端游。 那么,通过Ga…...
【笔记】X射线物理基础
一、X射线衍射分析简史 1895年X射线发现 1896 年 2 月对骨折的观察:G.和 E. Frost是第一个使用 X 射线进行医疗用途 1897 年法国海关官员的行李扫描。 X射线衍射理论1 X射线衍射理论2 元素的特征X射线 X射线光电子的应用 电磁波的粒子属性 X射线层析成像法 X-ray…...
Vue3与Flask后端Demo
文章目录 准备工作Flask 后端设置Vue3 前端设置跨域问题测试 准备工作 安装开发环境 安装 Python(推荐 Python 3.8 或更高版本)。安装 Node.js(推荐 LTS 版本)。安装 PyCharm(用于 Flask 开发)和 VSCode&am…...
第一本RAG书籍《大模型RAG实战》出版!
随着ChatGPT的爆火,推动了新一轮的AI技术进步。但大模型自身存在幻觉、知识更新难等问题,阻碍了其直接进行落地应用。RAG(Retrieval-Augmented Generation)技术将LLM与文本信息检索相结合,解决了在一些场景下模型知识不…...
Pandas -----------------------基础知识(四)
自定义函数 Series 加载数据 import pandas as pd df pd.DataFrame({Age: [20, 25, 30, 35, 40]}) df # 目标: 让 Age 列 的每个元素 num1 num2 def add_nums(x,num1,num2):return x num1 num2 df[Age].apply(add_nums,num1 2,num2 3) 法二 df[Age].apply(lambda x ,num1…...
鼎阳加油-IOC关键技术问题的解决记
鼎阳SDS6204示波器EPICS IOC的搭建-CSDN博客 这款示波器在labview下工作的很好,以前搭建逐束团3D系统时连续几个月不间断的工作连接从没断过线,并做过速率测试,单通道时10Hz的波形更新速率都可以达到: 鼎阳SDS6204示波器波形读取…...
【HarmonyOS】TaskPool非阻塞UI
TaskPool方法不会阻塞UI,如果做上传图片的功能加载Loading记得使用TaskPool,Promise、Async/Await都会阻塞UI 【引言】 发现Promise可能会阻塞UI,尝试使用async或await,但发现它们仍然会导致阻塞。后来看到chaoxiaoshu回复的Tas…...
关于使用/bin/sh -c 用于Dockerfile的Entrypoint的问题
问题描述 相同的dockerfile,使用不同的基础镜像制作镜像1号进程不相同 ENTRYPOINT都是: /bin/sh -c pre-start.sh && myblockserver 的形式 就是执行多个命令命令,最后的一个命令是阻塞的 镜像1: 1号进程是 /bin/sh -c pre-start…...
JS---获取浏览器可视窗口的尺寸
innerHeight 和 innerWidth 这两个方法分别是用来获取浏览器窗口的宽度和高度(包含滚动条的) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
