简单来说:

增量同步就是Master 只把比 Slave 新的数据发给 Slave,而不是发送全部数据。它像一个持续更新的直播流,或者我之前比喻的“每日更新期刊”。Slave 不用重新加载所有数据,只需要接收和应用这些新的更新。

这就像,你作家写的书,读者已经拿到了完整的最新版。你以后每天写点新东西,只需要把写的新章节发给他,他就能把新的章节加到书的后面,就不用我把整本书再重新打印一遍然后麻烦他再读一遍了。

为什么需要增量同步?

想象一下,你写一部百万字的小说,每天写几百字。如果每次粉丝(Slave)断线(比如手机信号不好,或者中途APP闪退了一下),然后他再连回来,你都得把这几百万字的完整小说重新给他背一遍,那得多麻烦?流量、时间和资源都会大量浪费。

增量同步就是为了解决这个问题:减少全量同步的次数,提高复制效率。

增量同步的核心部件:

在 Redis 中,实现增量同步有两个关键的协同工作部分:

  1. Master 的 Replication Backlog (复制积压缓冲区):

    • 这是一个特殊的“草稿箱”。你(作家 Master)每写好一句(执行一条写命令),除了发送给粉丝(如果有粉丝连接着),你还会把它暂时副本放在这个“草稿箱”里。
    • 这个草稿箱是环形的,就像一个循环录像带。它有一个固定的大小(可以配置,默认是 1MB),当写的内容越来越多时,最老的内容就会被新内容覆盖掉
    • 这个草稿箱就是为了当你和粉丝(Master 和 Slave)的直播连接意外断开后,再重新连接时,可以方便地找到“从哪个位置(offset)开始发送新的更新”。
  2. Replication Offset (复制偏移量):

    • 这是一个“阅读进度条”。你把写好的内容一句一句地发出去了,你会记录你已经发了多少字(Master 的最新偏移量)。
    • 你的每个粉丝(Slave)也会记录自己已经收到了多少字
    • 这个偏移量是一个单调递增的数字。它精确标识了主服务器数据流中某个点。Master 知道自己发到了哪里,Slave 知道自己收到了哪里。
  3. Master Replication ID (replid/runid):

    • 你的“作家笔名 ID”(或者你的身份证号)。在你没换笔名(Master 非重启,或者故障转移)的情况下,即使你暂停写作(数据有一段时间没更新),在“笔名”不变的前提下,你上次的写作“风格”(数据特征)也还在。
    • 这是判断 Master 身份唯一性的关键。只有 Master ID 没变动,增量同步才有基础。
增量同步是如何进行的?
  1. Slave 断线重连时(比如因网络波动):

    • 粉丝(Slave)与你(Master)的电话断了。但是,他知道自己上次是“鬼才金庸”(Master replid)的读者,而且已经看完了第 130 章(offset)。
    • 当连接恢复后,粉丝立即打电话(发送 PSYNC <replid> <offset> 命令)给你,并说:“我是老粉丝,笔名是‘鬼才金庸’,我上次看到第 130 章了。”
  2. Master 的判断:

    • 第一步:检查笔名 ID(replid)。你(Master)发现电话里说的笔名 ID 和你当前使用的笔名 ID 是一模一样的。
      • “嗯,没换笔名,还是我的老读者!”
    • 第二步:检查阅读进度 (offset) 是否在草稿箱 (Backlog) 里。 你(Master)马上去检查你的“草稿箱”(Replication Backlog)。
      • 你发现你的草稿箱里保存了从第 120 章到当前你最新写的第 140 章的所有内容。
      • 而粉丝小明说他看到第 130 章了。
      • “太好了!你说的 130 章后面的那点更新(第 131 章到第 140 章我最新写的部分),都在我的草稿箱里呢,没被新的内容挤出去!”
  3. 增量发送:

    • 你(Master)立刻告诉粉丝:“好啦,第 131 章到第 140 章的更新,我现在就报给你听!” (Master 回复 +CONTINUE,然后直接从 Replication Backlog 中提取offset 130之后的数据,以 AOF 命令流的形式发送给 Slave。)
    • 粉丝(Slave)收到后,将其追加到自己的小说集后面,并更新自己的阅读进度(offset)。
动图模拟增量同步:

假设 offset 代表数据写入进程,Master 从 0 开始不断增加。
Replication Backlog 是一个固定大小的窗口,里面保存了最近的历史数据。

时间轴 -->Master 数据写入: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...]
Master 当前 Offset: 11Replication Backlog (假设大小为 5): [ 7, 8, 9, 10, 11 ] ^ 最老  ^ 最新Slave A (上次收到 9): 连接 - PSYNC <replid> 9Master 检查: replid 匹配,9 在 Backlog 内。✓Master 回复: +CONTINUEMaster 发送增量: [10, 11]
Slave A 更新到 11。成功增量同步!Slave B (上次收到 5):连接 - PSYNC <replid> 5Master 检查: replid 匹配,但 5 不在 Backlog 内 [7, 8, 9, 10, 11]。✗Master 回复: +FULLRESYNC ...Master 执行: 全量同步 (生成 RDB, 再发送从新 RDB 点开始的 AOF)
Slave B 更新到 11。被迫全量同步!
需要注意:
  • Replication Backlog 的大小配置很关键。 如果这个缓冲区太小,Slave 稍微掉队一点(断线时间稍长一点),其 offset 就会超出缓冲区范围,导致增量同步失败,仍然退化为全量同步。所以需要根据网络情况和应用的写入 QPS(每秒查询率)来合理估算和设置这个积压缓冲区的大小。通常建议设置为 Slave 在断线重连前可能积累的最大写命令量。
  • 如果 Master 本身发生了重启(导致 runid 改变),或者发生了故障转移(Failover),新的 Master 会有新的 runid,即使它们的 offset 看起来一致,Slave 也会被判断为需要进行全量同步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88143.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88143.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88143.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 安全优化指南:保护你的数据库免受攻击

在当今高度互联的数字世界中,数据是企业的核心资产,而数据库则是存储这些资产的堡垒。作为最流行的开源关系型数据库之一,MySQL 被广泛应用于各种业务场景。然而,其普及性也使其成为网络攻击者青睐的目标。一旦数据库被攻破,可能导致敏感数据泄露、业务中断、声誉受损,甚…

界面控件Telerik UI for WinForms 2025 Q2亮点 - 支持.NET 10 Preview

随着2025年第二季度新版本的发布&#xff0c;Progress Telerik通过流行的集成IDE的AI编码助手&#xff0c;基于提示的样式和基于GenAI的报表见解重新定义了开发人员的工作效率&#xff01; Telerik和Kendo UI在构建尖端应用程序时继续推动开发人员工作效率提升&#xff0c;202…

DVWA靶场通关笔记-验证码绕过reCAPTCHA(Medium级别)

目录 一、reCAPTCHA 二、代码审计&#xff08;Medium级别&#xff09; 1、渗透准备 &#xff08;1&#xff09;配置security为Medium级别。 &#xff08;2&#xff09;配置RECAPTCHA参数 &#xff08;3&#xff09;再次打开靶场 2、源码分析 &#xff08;1&#xff09;…

人工智能安全基础复习用:对抗样本检测与防御

一、对抗样本&#xff08;Adversarial Examples&#xff09;定义&#xff1a;对输入样本添加人眼无法察觉的细微干扰&#xff0c;导致模型以高置信度输出错误结果。对抗样本的分布通常偏离自然数据分布&#xff0c;与正常样本在模型中间层/输出层的分布存在差异。核心目标&…

[数学基础] 矩阵的秩及其应用

深入浅出&#xff1a;矩阵的秩及其应用 文章目录深入浅出&#xff1a;矩阵的秩及其应用一、数学定义二、核心作用三、计算方法与步骤方法1&#xff1a;高斯消元法&#xff08;最常用&#xff09;方法2&#xff1a;奇异值分解&#xff08;SVD&#xff09;方法3&#xff1a;行列式…

LKH-3算法求解TSP问题基本原理与应用

通俗理解LKH-3算法 LKH-3&#xff08;Lin-Kernighan-Helsgaun&#xff09;是求解**旅行商问题&#xff08;TSP&#xff09;**的最强启发式算法之一&#xff0c;由丹麦计算机科学家Keld Helsgaun在LKH-2基础上改进而来。它的核心思想是&#xff1a;通过智能的“局部破坏与修复”…

游戏开发学习记录

初始化只是第一次实例化的时候调用&#xff0c;show和unshow是打开界面和关闭界面的时候&#xff0c;会多次调用 在一个脚本里面show是每一次打开界面的时候需要做的事情&#xff0c;而Init是初始化。UIMgr里面的数据结构&#xff1a;为什么我要先从数据结构入手呢&#xff1f;…

一级缓存与二级缓存深度剖析:作用域、配置与同步方案全解析

引言 在分布式系统与高并发场景下&#xff0c;缓存机制已成为提升系统性能的关键技术。本文从作用域、失效机制、配置实践到同步方案&#xff0c;系统化解析一级缓存与二级缓存的核心差异与工程实践。 一、一级缓存&#xff1a;会话级数据加速器 1.1 作用域与生命周期 作用域&a…

OneCode MQTT插件开发实战:基于Paho.Client的物联网通信解决方案

引言 在物联网应用开发中&#xff0c;MQTT协议因其轻量、低带宽占用的特性被广泛采用。OneCode平台提供的xui.MQTT插件基于Eclipse Paho.Client实现了完整的MQTT通信能力&#xff0c;本文将从插件用途、核心实现、开发要点和功能扩展四个维度&#xff0c;详解如何基于该插件构建…

1.1_5_1 计算机网络的性能指标(上)

在这个小节中我们要学习计算机网络的性能指标&#xff0c;我们在考研当中主要掌握这样的七个性能指标&#xff0c;分别是速率、带宽、吞吐量、时延、时延带宽积、往返时延和信道利用率。我会把相关性比较紧密的性能指标放在一起讲解。在这个视频中&#xff0c;我们先来学习前三…

Python 性能优化指南:深入剖析代码分析与优化工具

Python 性能优化指南:深入剖析代码分析与优化工具 在 Python 的广泛应用场景中,性能优化既是挑战,也是机遇。无论是构建 Web 应用还是处理数据分析,理解代码性能瓶颈并有效优化至关重要。本文将探讨 Python 代码性能分析的核心方法,并逐步解析关键工具的使用技巧,带您从…

力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…

Notepad++正则表达全解

摘要:Notepad正则表达式符号大全包含11类常用语法&#xff1a;基础符号&#xff08;.^$?等&#xff09;、预定义字符类&#xff08;\d\w\s等&#xff09;、锚点&#xff08;\b\B&#xff09;、量词&#xff08;{n,m}&#xff09;、分组引用&#xff08;()$1&#xff09;、字符…

前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)

一、准备工作 服务器环境要求 银河麒麟 V10 操作系统 开放端口&#xff1a;MinIO (9000、9001)、 Redis (6379)、应用服务 jar包(18888)、前端服务(8080) 系统用户&#xff1a;具有 sudo 权限的用户 操作&#xff1a;需要先有必备的工具前端的vsCode,webStrom、后台的idea&…

贪心算法:简单而高效的求解策略C++

贪心算法详解及C实现 1. 什么是贪心算法 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法策略。 贪心算法与动态规划不同在于它…

IDEA 中使用 <jsp:useBean>动作指令时,class属性引用无效

问题&#xff1a;在 IDEA 中创建 Java Web项目&#xff0c;在src/model包下存在一个Student类该类中包含&#xff1a;全参构造器、私有属性的get/set方法。然后在 jsp 页面中使用 <jsp:useBean>创建Student类的对象&#xff1a;访问页面时报错&#xff1a;原因&#xff1…

【网络】Linux 内核优化实战 - net.core.flow_limit_table_len

目录参数作用查看与修改调优建议相关警告net.core.flow_limit_table_len 是 Linux 内核中的一个网络参数&#xff0c;用于控制**流限制表&#xff08;Flow Limit Table&#xff09;**的大小。这个表主要用于限制网络流量中单个"流"&#xff08;通常指来自同一源IP、端…

前端开发常见问题技术文章大纲

前端开发常见问题技术文章大纲 常见性能优化问题 页面加载速度慢的原因及解决方案渲染阻塞资源的优化方法内存泄漏的检测与修复 跨浏览器兼容性问题 不同浏览器对CSS和JavaScript的支持差异Polyfill和Shim的使用场景如何利用工具检测兼容性问题 响应式设计挑战 媒体查询的最佳实…

Redis常见性能问题和解决方案有哪些?

Redis 作为高性能的内存数据库&#xff0c;在实际使用中可能会遇到性能问题。以下是常见的性能问题及其解决方案&#xff0c;用中文总结如下&#xff1a; 1. 高延迟问题 问题描述&#xff1a;客户端请求响应时间过长&#xff0c;可能由于网络、命令复杂度或服务器负载导致。 解…

闪测仪应用案例丨手机中框如何突破「尺寸检测」瓶颈?

越来越多的手机中框&#xff0c;正改为更复杂的镂空设计&#xff0c;这种设计不仅保持了手机中框的结构强度&#xff0c;还进一步减轻了机身重量&#xff0c;同时提升了散热性能。这让手机中框的自动化生产增加了很多难点&#xff0c;其中的尺寸检测就遇到了许多瓶颈。▪ 尺寸精…