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

详解Redis的主从同步原理

前言

Redis为了保证服务高可用,其中一种实现就是主从模式,即一个Redis服务端作为主节点,若干个Redis服务端作为主节点的从节点,从而实现即使某个服务端不可用时,也不会影响Redis服务的正常使用。本篇文章将对主从模式中为了保证主节点和从节点数据一致而实现的主从同步机制进行学习。

正文

一. 主从数据同步概述

Redis主从模式中,一个高可用的Redis服务由一个Redis主节点(Master,后续简称为主节点)和若干Redis从节点(Slave,后续简称为从节点)组成。

Redis中采用读写分离来保证主节点和从节点之间的数据一致性,具体实现如下。

  • 主节点支持数据写入数据读取,从节点只支持数据读取
  • 主节点会与从节点之间执行主从数据同步,以保证主节点数据与从节点数据一致。

主从数据同步分为如下几种情况。

  • 从节点与主节点建立连接时进行全量同步;
  • 主节点与从节点正常运行时的同步;
  • 主节点与从节点连接断开后又重连时会进行增量同步或全量同步。

本篇文章将对Redis中的主从数据同步的几种情况进行学习。

二. 从节点与主节点建立连接时的全量同步

从节点与主节点建立连接时的全量同步可以用下图进行示意。

对于上图所示步骤,说明如下。

  1. 从节点通过配置文件中的replicaof {masterip} {port} 获得主节点ipport,然后向主节点发送psync {repID} {offset} 指令,其中repID表示主节点唯一标识,offset为复制偏移量,因为当前从节点与主节点尚未连接,且尚未开始复制,所以repID?offset为-1;
  2. 主节点收到psync {repID} {offset} 指令后,会响应从节点并发送fullresync {repID} {offset} 指令,从节点会将主节点的repIDoffset保存下来;
  3. 主节点收到psync {repID} {offset} 指令后,会执行bgsave异步的生成RDB文件,然后主节点将RDB文件发送给从节点,从节点接收到RDB文件后,会清空内存数据,然后加载RDB文件的数据到内存中;
  4. 由于主节点生成RDB文件时是异步生成的,此时主节点是非阻塞的,可以继续处理业务,所以在生成RDB文件期间发送RDB文件期间从节点加载RDB文件期间主节点执行的写指令均会存放到缓冲区replication_buffer中,所以当从节点加载完RDB文件后,主节点会将replication_buffer中的内容发送给从节点,从节点会执行replication_buffer中的指令,从而达到和主节点一致的状态。

特别说明:在全量同步期间,主节点是非阻塞的,同时从节点很大程度上是非阻塞的,从节点的非阻塞表现在可以通过配置让从节点在全量同步期间使用旧内存数据来处理查询指令,但是从节点在删除旧内存数据并加载RDB文件数据到内存中这段时间里,从节点是阻塞的(4.0版本前,删除旧数据和加载RDB文件都会阻塞从节点,4.0版本开始,删除旧数据可以通过配置变成不阻塞从节点,但是加载RDB文件还是会阻塞从节点)。

最后说明一个异常情况,那就是replication_buffer是有大小限制的,如果replication_buffer大小超过了限制,主节点会断开与从节点的同步连接,此时replication_buffer的数据会被清空,然后会重新开始全量同步,所以replication_buffer大小需要设置一个合理值。

更多C++后端开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击 C++后端学习资料 免费领取

三. 主节点与从节点正常运行时的同步

参见redis.io/docs/manual…中的一段话。

When a master and a replica instances are well-connected, the master keeps the replica updated by sending a stream of commands to the replica to replicate the effects on the dataset happening in the master side due to: client writes, keys expired or evicted, any other action changing the master dataset.

即正常运行期间,主节点会向从节点发送写指令流来同步主节点的数据变更到从节点。

四. 主节点与从节点断开连接又重连时的增量同步

在第二节中提到了从节点在启动后并需要与主节点进行全量同步时,会向主节点发送psync {repID} {offset} 指令,这里先对repIDoffset进行解释。

repID

repIDReplication ID,是Redis节点作为主节点启动时,或者从节点被晋升为主节点时,该主节点都会生成一个新的repID(思考一下什么情况还会有旧的repID),后续连接到该主节点的从节点在第一次全量同步的建立连接阶段会保存一份主节点的repID,所以具有相同repID的节点的数据具有相关性。

offset

offset即偏移量,可以理解为当前节点的数据的逻辑时间。举个例子,某个节点Aoffset为500,和节点A具有相同repID的节点Boffset为520,那么表明节点B的数据比节点A的数据更新,节点A需要再执行一些写指令才能够让节点A的数据状态和节点B一致。

有了上述两点认识,现在思考一个问题:主节点和从节点如果因为某些原因,断开了连接,而断开连接这段时间里主节点又处理了一些写指令,那么从节点重新连接后,应该怎么将断开连接那段时间里的写指令同步给重连的从节点?通常的想法就是再执行一次全量同步,在2.8之前的版本,确实是这么实现的,但从2.8版本开始,引入了增量同步,具体的实现如下。

  • 主节点维护着一份repl_backlog_buffer缓冲区域,叫做复制积压缓冲区,主节点在任何时候执行写指令时,都会将写指令记录在repl_backlog_buffer中,repl_backlog_buffer是一个环形数组,所以当数组满时,后续再添加的写指令会覆盖旧的写指令,因此主节点还使用了一个叫做master_repl_offset的偏移量,来记录主节点的存到repl_backlog_buffer中的最新写指令的位置,master_repl_offset就是上面提到的offset,只不过在主节点中叫做master_repl_offset
  • 从节点也有一个偏移量叫做slave_repl_offset,用来记录从节点已经从主节点的repl_backlog_buffer中同步到的最新写指令的位置;
  • 主节点收到写指令后,master_repl_offset增加,从节点从主节点的repl_backlog_buffer同步了写指令后,slave_repl_offset增加;
  • 从节点断开重连后,会向主节点发送psync {repID} {slave_repl_offset} 指令,此时slave_repl_offset通常会小于master_repl_offset,所以主节点仅需要将slave_repl_offsetmaster_repl_offset之间的写指令同步给从节点,这就是增量同步

特别注意:如果repl_backlog_buffer中记录的从节点断开连接期间的写指令已经被后续的写指令覆盖,那么此时不能执行增量同步,而是需要执行全量同步,所以需要将repl_backlog_buffer的大小设置一个合理的值,来尽可能的保证不出现重连后需要全量同步的情况。

总结

以一张图进行总结。

原文链接:详解Redis的主从同步原理 - 掘金

相关文章:

详解Redis的主从同步原理

前言 Redis为了保证服务高可用,其中一种实现就是主从模式,即一个Redis服务端作为主节点,若干个Redis服务端作为主节点的从节点,从而实现即使某个服务端不可用时,也不会影响Redis服务的正常使用。本篇文章将对主从模式…...

前端项目上线后,浏览器缓存未刷新问题

文章目录问题背景一、解决办法二、实现原理关于缓存强缓存协商缓存刷新页面对浏览器的影响总结问题背景 前端页面开发测试完,要进行上线,某些页面上传更新到服务器之后,浏览器并没有更新,渲染的还是老页面。这是因为浏览器读了缓存…...

Vulnhub系列:Raven 1

该篇为Vulnhub系列靶机渗透,本次靶机存在4个flag。下面开始我们今天的渗透之旅。Raven靶机有很多种思路,我将对其进行一一整理。首先进行信息收集,利用arp-scan和nmap,进行靶机的ip及端口扫描发现了22、80、111端口。下面访问80端…...

MybatisPlus------多数据源环境(十一)

MybatisPlus------多数据源环境&#xff08;十一&#xff09; 生产环境中常常会存在多个数据源。 比如读写分离、一主多从、混合模式等等。 首先再pom文件中需要引入依赖&#xff1a; 多数据源所需要使用到的依赖 <!-- 多数据源所需要使用到的依赖--><depend…...

Tomcat+IDEA+Servlet能显示页面但提交form表单出现404问题

问题&#xff1a; 当我们使用tomcat启动&#xff0c;然后输入对应的url路径时候&#xff0c;能出现该html的页面&#xff0c;但提交表单后&#xff0c;却出现了404的问题&#xff0c;这时候我就很疑惑了....然后开始慢慢分析。 思路&#xff1a; 首先我们得知道404状态码是什…...

【蓝桥杯集训16】多源汇求最短路——Floyd算法(2 / 2)

目录 Floyd求最短路模板 4074. 铁路与公路 - floyd 脑筋急转弯 Floyd求最短路模板 活动 - AcWing 题目&#xff1a; 给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 再给定 k 个询问&#xff0c;每个询问包含两个整数 x 和…...

simulink stateflow 状态机

系列文章目录 文章目录系列文章目录前言一、基操二、stateflow 数据三、chart动作四、chart的执行五、flow chart / junction六、状态机中的函数 Stateflow Functions七、chart层次结构八、案例——吸尘器机器人的驱动模式前言 一、基操 在tooltrip中选择DEBUG&#xff0c;通过…...

水库大坝安全监测的主要坝体类型介绍

水电站和水库大坝安全的分类中有重力坝、土石坝等不同的大坝形式。就在这里详细水库大坝安全监测按照建造形式&#xff0c;基本上可以分为三类&#xff1a;重力坝、土石坝和拱坝。 &#xff08;1&#xff09;重力坝 重力坝&#xff0c;顾名思义就是利用自身重力来维持坝体稳定…...

物理层概述(二)重点

目录前言编码与调制&#xff08;1&#xff09;基带信号与宽带信号编码与调制编码与调制&#xff08;2&#xff09;数字数据编码为数字信号非归零编码【NRZ】曼斯特编码差分曼彻斯特编码数字数据调制为模拟信号模拟数据如何编码为数字信号模拟数据调制为模拟信号物理层传输介质导…...

成都待慕电商:抖音极速版商品卡免佣扶持政策规则

新规&#xff0c;抖音极速版推出商品卡免佣扶持政策规则&#xff0c;本次抖音规则如何规定&#xff1f;具体往下看&#xff1a;一、政策简介1.1政策介绍为了更好地满足用户消费需求&#xff0c;丰富商家经营模式&#xff0c;降低商家经营成本&#xff0c;现平台针对商品卡场景推…...

青岛双软认定标准

软件企业的认定是有一定的标准的&#xff0c;需要满足以下这些条件&#xff1a;1、在我国境内依法设立了企业法人的企业&#xff1b;2、以计算机软件开发生产、系统集成、应用服务和其他相应技术服务为经营业务和主要经营收入&#xff1b;3、具有一种以上由本企业开发或由本企业…...

【00后卷王秘籍】python自动化测试—Python自动化框架及工具

1 、概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本系列选择的测试语言是 python 脚本语言。由于其…...

MySQL数据库基本操作

DDL 1、DDL解释 DDL(Data Definition Language)&#xff0c;数据定义语言&#xff0c;该语言部分包括以下内容&#xff1a; 对数据库的常用操作 对表结构的常用操作 修改表结构1、对数据库的常用操作 2、对表结构的常用操作-创建表 创建表格式 3、对表结构的常用操作-创建表…...

2023年最新的站内SEO指南:如何通过关键词优化提高网站排名

SEO或搜索引擎优化是指通过改善网站的内部和外部元素&#xff0c;以获得更好的自然搜索引擎排名和更多的网站流量。 链接建设和外链是SEO的重要组成部分&#xff0c;因为它们可以提高网站的权威性和可信度&#xff0c;从而使其在搜索引擎中排名更高。 在此指南中&#xff0c;…...

【Java】Java环开发环境安装

Java环开发环境安装 简介&#xff1a; 如果要从事Java编程&#xff0c;则需要安装JDK&#xff0c;如果仅仅是运行一款Java程序则JRE就满足要求。 Java的安装包分为两类 一类是JRE其就是一个独立的Java运行环境&#xff1b; 一类是JDK其是Java的开发环境&#xff0c;不过在JDK…...

[蓝桥杯] 枚举、模拟和排列问题

文章目录 一、连号区间数 1、1 题目描述 1、2 题解关键思路与解答 二、递增三元组 2、1 题目描述 2、2 题解关键思路与解答 三、错误票据 3、1 题目描述 3、2 题解关键思路与解答 四、回文日期 4、1 题目描述 4、2 题解关键思路与解答 五、归并排序 标题&#xff1a;蓝桥杯——…...

C++基础了解-02-C++ 数据类型

C 数据类型 一、C 数据类型 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&#xff0c;当创建一个变量时&#xff0c;就会在内存中保留一些空间。 可能需要存储各种数据类型&#xff08;比如字符型、宽…...

关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法

一、常见故障介绍  最近在开发相机项目&#xff08;项目细节由于公司保密就不介绍了&#xff09;&#xff0c;程序运行5个来月以来首次出现msvcr100.dll故障等问题&#xff0c;于是乎开始了分析之路&#xff0c;按照度娘上的一顿操作&#xff0c;期间也是出现了各种不一样的问…...

【蓝桥杯集训·每日一题】AcWing 3305. 作物杂交

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴Spfa算法一、题目 1、原题链接 3305. 作物杂交 2、题目描述 作物杂交是作物栽培中重要的一步。 已知有 N 种作物 (编号 1 至 N)&#xff0c;第 i 种作物从播种到成熟的时间…...

深入浅出PaddlePaddle函数——paddle.to_tensor

分类目录&#xff1a;《深入浅出PaddlePaddle函数》总目录 相关文章&#xff1a; 深入浅出PaddlePaddle函数——paddle.Tensor 深入浅出PaddlePaddle函数——paddle.to_tensor 通过已知的data来创建一个Tensor&#xff0c;Tensor类型为paddle.Tensor。data可以是scalar、tupl…...

JavaScript高级程序设计读书分享之10章——函数

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 定义函数 定义函数有两种方式&#xff1a;函数声明和函数表达式大致看这两种方式没有什么区别&#xff0c;事实上&#xff0c;JavaScript 引擎在加载数据时对它们是区别对待的。JavaScript 引擎在任何代…...

第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项

文章目录第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项设计注意事项第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项 IRIS 可以在特定事件发生时执行自定义代码。需要两个步骤&#xff1a; 定义 ^%ZSTART 例程、^%ZSTO…...

工作实战之拦截器模式

目录 前言 一、结构中包含的角色 二、拦截器使用 1.拦截器角色 a.自定义拦截器UserValidateInterceptor&#xff0c;UserUpdateInterceptor&#xff0c;UserEditNameInterceptor b.拦截器配置者UserInterceptorChainConfigure&#xff0c;任意组装拦截器顺序 c.拦截器管理者…...

某美颜app sig参数分析

之前转载过该app的文章&#xff0c;今天翻版重新整理下&#xff0c;版本号:576O5Zu56eA56eAYXBwIHY5MDgw (base64 解码)。 上来先抓个包&#xff1a; jadx搜索关键词 "sigTime"&#xff0c;然后定位到这里 看这行代码 cVar.addForm(INoCaptchaComponent.sig, genera…...

Linux - Linux系统优化思路

文章目录影响Linux性能的因素CPU内存磁盘I/O性能网络宽带操作系统相关资源系统安装优化内核参数优化文件系统优化应用程序软件资源系统性能分析工具vmstat命令iostat命令sar命令系统性能分析标准小结影响Linux性能的因素 CPU CPU是操作系统稳定运行的根本&#xff0c;CPU的速…...

2.Elasticsearch入门

2.Elasticsearch入门[toc]1.Elasticsearch简介Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索&#xff0c;稳定&#xff0c;可靠&#xff0c;快速&#xff0c;安装使用方便。客户端支持Java、.NET&#xff08;C#&#xff09;、PHP、Pyth…...

RK3399平台开发系列讲解(应用开发篇)断言的使用

🚀返回专栏总目录 文章目录 一、什么是断言二、静态断言三、运行时断言沉淀、分享、成长,让自己和他人都能有所收获!😄 📢断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供。 一、什么是断言 在编程中…...

云原生系列之使用prometheus监控nginx

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文主要讲解云原生系列之使用prometheus监控nginx 文章收录到 csdn 我是沐风晓月的博客【prometheus监控系列】专栏&#xff0c;此专栏是沐风晓月对云原生prometheus的的总结&#xff0c;希望能够加深自…...

第六届省赛——8移动距离(总结规律)

题目&#xff1a;X星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为1,2,3...当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。比如&#xff1a;当小区排号宽度为6时&#xff0c;开始情形如下&#xff1a;1 2 3 4 5 612 11 10 9 8 713 14 1…...

C++vector 简单实现

一。概述 vector是我们经常用的一个容器&#xff0c;其本质是一个线性数组。通过对动态内存的管理&#xff0c;增删改查数据&#xff0c;达到方便使用的目的。 作为一个线性表&#xff0c;控制元素个数&#xff0c;容量&#xff0c;开始位置的指针分别是&#xff1a; start …...

进一步加大网站集约化建设力度/关键词看片

一、百度百科“简单工厂模式”的描述简单工厂模式是属于创建型模式&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工…...

网站做广告投放 做销售线索预估/推广普通话的宣传语

相信很多app中都有通过拍照或者从相册中选择的方式设置并上传头像的功能。如下是我之前一个项目中通过相册或者拍照获取图片的一个功能&#xff08;照片来源于网络&#xff09;。现在把代码贴出来&#xff0c;大家使用时&#xff08;点击imageView或者button时&#xff09;&…...

电子商务网站建设认识/长尾关键词挖掘熊猫

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _15方法练习 {class Program{static void Main(string[] args){// 提示用户输入两个数字 计算这两个数字之间所有整数的和//1、用户只能输入…...

深圳模板建站多少钱/竞价托管运营哪家好

github传送门 目录 前言效果图快速上手CollapsingToolbarLayout折叠模式AppBarLayout滚动方式CoordinatorLayout配合Snackbar自定义伸缩头部最后前言 之前也是写了RecyclerView的内容, 这次再补充伸缩头部的实现. 港真, 伸缩头部是那种看到第一眼就会爱上的视图效果, 好看又简洁…...

wordpress相册打造的视频弹出/如何制作个人网站

首款骁龙870平板官宣&#xff1a;联想小新平板 5月25日 见预热了许久的联想小新平板&#xff0c;终于揭开了神秘的面纱&#xff0c;联想小新官博昨天发布官宣消息&#xff1a;真香价 5月25日 19&#xff1a;30分 平板发布会见。根据联想小新官博预热来看&#xff0c;此次发布会…...

加速wordpress 插件/网络推广引流是做什么工作

香蕉苹果是一种服用以后会令人造成愉快情绪的新鲜水果&#xff0c;它能够对脑神经传出激动的数据信号&#xff0c;进而使大家维持愉快&#xff0c;产生欢乐。那麼怀孕可以吃香蕉苹果吗&#xff1f;接下去一起来瞧瞧吧。怀孕可以吃香蕉苹果吗怀孕可以吃香蕉苹果&#xff0c;可是…...