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

redis杂谈之部分重同步的实现

背景:

部分重同步则用于处理断线后重复制情况:当从服务器在断线 后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连 接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这 些写命令,就可以将数据库更新至主服务器当前所处的状态

部分重同步功能由以下三个部分构成:

·主服务器的复制偏移量(replication offset)和从服务器的复制偏移量。

·主服务器的复制积压缓冲区(replication backlog)。

·服务器的运行ID(run ID)。

1.复制偏移量

执行复制的双方——主服务器和从服务器会分别维护一个复制偏移 量:

·主服务器每次向从服务器传播N个字节的数据时,就将自己的复制 偏移量的值加上N。

·从服务器每次收到主服务器传播来的N个字节的数据时,就将自己 的复制偏移量的值加上N

 如果这时主服务器向三个从服务器传播长度为33字节的数据,那么 主服务器的复制偏移量将更新为10086+33=10119,而三个从服务器在接 收到主服务器传播的数据之后,也会将复制偏移量更新为10119‘

 通过对比主从服务器的复制偏移量,程序可以很容易地知道主从服 务器是否处于一致状态:

·如果主从服务器处于一致状态,那么主从服务器两者的偏移量总 是相同的。

·相反,如果主从服务器两者的偏移量并不相同,那么说明主从服 务器并未处于一致状态

2.复制积压缓冲区

复制积压缓冲区是由主服务器维护的一个固定长度(fixed-size)先 进先出(FIFO)队列,默认大小为1MB

当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务 器,还会将写命令入队到复制积压缓冲区里面

 主服务器的复制积压缓冲区里面会保存着一部分最近传播的 写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏 移量

 自己的复制偏移量offset发送给主服务器,主服务器会根据这个复制偏 移量来决定对从服务器执行何种同步操作:

·如果offset偏移量之后的数据(也即是偏移量offset+1开始的数据) 仍然存在于复制积压缓冲区里面,那么主服务器将对从服务器执行部分 重同步操作。

·相反,如果offset偏移量之后的数据已经不存在于复制积压缓冲 区,那么主服务器将对从服务器执行完整重同步操作

3.服务器运行id

除了复制偏移量和复制积压缓冲区之外,实现部分重同步还需要用 到服务器运行ID(run ID): ·每个Redis服务器,

不论主服务器还是从服务,都会有自己的运行 ID。 ·运行ID在服务器启动时自动生成,由40个随机的十六进制字符组 成,例如53b9b28df8042fdc9ab5e3fcbbbabff1d5dce2b3。

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

当从服务器断线并重新连上一个主服务器时,从服务器将向当前连 接的主服务器发送之前保存的运行ID:

·如果从服务器保存的运行ID和当前连接的主服务器的运行ID相 同,那么说明从服务器断线之前复制的就是当前连接的这个主服务器, 主服务器可以继续尝试执行部分重同步操作

4.综合举例

 

主从服务器当前的复制偏 移量都为10086,但是就在主服务器要向从服务器传播长度为33字节的 数据之前,从服务器A断线了,那么主服务器传播的数据将只有从服务 器B和从服务器C能收到,在这之后,主服务器、从服务器B和从服务器 C三个服务器的复制偏移量都将更新为10119,而断线的从服务器A的复 制偏移量仍然停留在10086,这说明从服务器A与主服务器并不一致

1.假设从服务器A在断线之后就立即重新连接主服务器,并且成功, 那么接下来,从服务器将向主服务器发送PSYNC命令,报告从服务器A 当前的复制偏移量为10086

2.主服务器收到从服务器发来的PSYNC命令以及偏移量10086之后, 主服务器将检查偏移量10086之后的数据是否存在于复制积压缓冲区里 面,结果发现这些数据仍然存在,于是主服务器向从服务器发送 +CONTINUE回复,表示数据同步将以部分重同步模式来进行

3.接着主服务器会将复制积压缓冲区10086偏移量之后的所有数据 (偏移量为10087至10119)都发送给从服务器。 ·从服务器只要接收这33字节的缺失数据,就可以回到与主服务器 一致的状态

 

相关文章:

redis杂谈之部分重同步的实现

背景: 部分重同步则用于处理断线后重复制情况:当从服务器在断线 后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连 接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这 些写命令&#xff…...

多态部分参考答案

一、选择题 1、下列关于动态联编的描述中,错误的是()。 A.动态联编是以虚函数为基础 B.动态联编是运行时确定所调用的函数代码的 C.动态联编调用函数操作是指向对象的指针或对象引用 D.动态联编…...

【高项】项目人力资源管理,沟通管理与干系人管理(十大管理)

【高项】项目人力资源管理,沟通管理与干系人管理(十大管理) 文章目录1、人力资源管理1.1 什么是人力资源管理?1.2 如何进行人力资源管理?(过程)1.3 人力资源管理工具1.4 人力资源管理文件2、沟通…...

Wikijs简介-强大可扩展的开源维基软件

Wikijs - 最强大 最可扩展的开源维基软件 使用 wiki.js 美丽直观的界面,让文档成为写作的乐趣! 优点 🔧 随时随地安装 几乎适用于任何平台,并与PostgreSQL、MySQL、MariaDB、MS SQL Server 或 SQLite 兼容! ⚙️ 管…...

微博舆情分析系统的设计与实现(python)

背景分析 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发达,微博舆情分析系统的资讯信息通过网络进行信息管理掀起了热潮,所…...

【AUTOSAR】【Lin通信】LinTrcv

目录 一、概述 二、功能说明 2.1 LIN收发器驱动程序操作模式 2.2 LIN收发器硬件操作模式 2.3 LIN收发器唤醒类型 2.4 LIN收发器唤醒模式 2.5 错误分类 2.5.1 开发错误 三、API接口 3.1 API定义 一、概述 该规范规定了模块LIN收发器驱动程序的功能、API和配置。它负责…...

UE4C++学习篇(十九)-- 动画蒙太奇初级使用

用一个第三人称的射击案例来简单介绍一下动画蒙太奇的使用,动画蒙太奇的具体介绍这里就不多说了,不知道的小伙伴可以去搜一下了解。 这里介绍角色射击,射击的时候播放一个射击动画。 选中需要创建出动画蒙太奇的动画,点击创建&am…...

子集和问题

目录 子集和问题 程序设计 程序分析 子集和问题 【问题描述】子集和问题的一个实例为〈S,c〉。其中,S={ x1 , x2 ,…,xn }是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得: 试设计一个解子集和问题的回溯法。 对于给定的正整数的集…...

苹果蓝牙耳机太贵了买哪个替代?苹果蓝牙耳机平替推荐

随着人们生活水平的提高,蓝牙耳机已经遍布在我们生活的各个角落。同时随着科技的发展,许多人果粉选择苹果耳机平替。下面我们一起来看看2023年有哪些适用于苹果的平替蓝牙耳机吧! 一、南卡小音舱Lite2蓝牙耳机 蓝牙版本:5.3 售…...

CK-UR05-US桌面式超高频RFID发卡器开发手册之USB控制命令格式

CK-UR05-US桌面式超高频RFID发卡器支持USB控制命令格式,本文重点就此格式展开说明! CK-UR05-US桌面式超高频RFID发卡器1、取版本号(GetReaderVersion) 功能:取读写器的硬件、软件版本 命令码: 02H 命令参数:无 命令包: 『40H 02H 02H BCH』 举例: 如…...

【华为OD机试】1025 - 字符串加解密

文章目录一、题目🔸题目描述🔸输入输出🔸样例1二、代码参考作者:KJ.JK🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x…...

阿里云版GPT官宣,我们问了它10个问题

4月7日,阿里云宣布自研大模型“通义千问”,目前已开始邀请用户测试体验。 阿里达摩院在NLP自然语言处理等前沿科研领域早已布局多年,并于2019年启动大模型研发,通义千问便是其最新成果,相当于阿里云版的“ChatGPT”。 …...

ORM框架之NHibernate

什么是NHibernate NHibernate是一个开源的对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式来访问关系型数据库。它是Hibernate框架的C#版本,Hibernate框架是Java平台上的ORM框架。 使用NHibernate,您可以将…...

凑微分练习

前言 在学习第一类换元法(凑微分法)时,我们常常需要凑微分。为了更加熟练地运用凑微分法,下面有几道凑微分例题供大家练习。 记住df(x)f′(x)dxdf(x)f(x)dxdf(x)f′(x)dx 例题1 dx‾d(ax)dx\underline{\quad}d(ax)dx​d(ax)dx‾…...

JavaWeb——多线程使用哈希表

目录 一、HashMap 1、定义 二、HashTable 1、定义: 2、区别: 三、ConcurrentHashMap 1、定义: 2、优化 (1)、加锁粒度不同——触发锁冲突的频率不同 (2)、充分利用CAS机制——无锁编程…...

anaconda permission denied

可能是路径不对 我的是只写了dir,没写文件名,而我要的是某个文件的路径,所以就报这个错。 具体,我需要某个权重的路径,比如pytorch_resnet50.pth,但我只写了这个权重所在的dir,比如F:/software/…...

蓝桥杯带刷,带刷!!!

A:::::::::::::::::::::::::::::::::::m计划(双指针,滑动窗口,倍增) 题目描述 小明是个鹅卵石收藏者,从小到大他一共收藏了 nn 块鹅卵石,编号分别为 1∼n,价值分别为 a1​,a2​&…...

第03讲:MinIO分布式文件服务器

一、什么是MinIO Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。 官网地址:MinIO | High Performance, Kubernetes Native Object Storageopen in new window官网文档地址:MinIO | The MinIO Qui…...

WireShark

wireshark 常用命令&#xff1a; frame.len 帧数据总长度&#xff1a;包含MAC头IP头UDP头UDP数据 eg: 1、 重传命令的长度是62, Frame.len 62 2、 长度大于200的包&#xff0c;frame.len > 200 3、 长度小于80的包&#xff0c;frame.len < 80 Ip.src 数据包的发送源IP地…...

Thinkphp 6.0多语言

本节课我们来学习一下如何配置的多语言功能&#xff0c;并实现调用方法。 一&#xff0e;多语言 1. 如果要开启多语言切换功能&#xff0c;中间件定义文件 middleware.php 开启&#xff1b; // 多语言加载 \think\middleware\LoadLangPack::class, 2. 配置文件在 config/lang…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...