Redis主从库网络断连问题——repl_backlog_buffer

news/2024/4/30 13:31:30/文章来源:https://blog.csdn.net/qq_53578500/article/details/126632742

主从库间网络断了怎么办?

  • 在 Redis 2.8 之前,如果主从库在命令传播时出现了网络闪断,那么,从库就会和主库重新进行一次全量复制,开销非常大。

  • 从 Redis 2.8 开始,网络断了之后,主从库会采用增量复制的方式继续同步。

    增量复制只会把主从库网络断连期间主库收到的命令,同步给从库。

增量复制通过 repl_backlog_buffer 这个缓冲区实现。

  • repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置。
    -在这里插入图片描述

主库的所有写命令除了通过replication buffer传播给从库之外,都会在这个repl_backlog_buffer(只要有从库,这个缓冲区就一定会存在)中记录一份,缓存起来。通过repl_backlog_buffer预先缓存数据,在从库恢复时就能够通过这个缓存区进行数据恢复(具体原理下文会说)。

replication bufferrepl_backlog_buffer 的区别(后面会详细介绍):

  • replication buffer 对于一主多从来说是相互独立,即redis会为每一个redis client创建一个独立的replication buffer,通过该buffer传输数据,
  • repl_backlog_buffer则是多个从库共用一个,每一个redis client都会有一个offset,该offset除了在断开重连后会通过psync将自己的offset传递给master,主从还维护了一个心跳机制,从节点会向主节点发送REPLCONF ACK命令,频率是每秒1次,命令格式为:REPLCONF ACK {offset},其中offset指从节点保存的复制偏移量告知master,repl_backlog_buffer通过该offset进行移动

repl_backlog_buffer 工作原理:

  • 刚开始的时候,主库和从库的写读位置在一起,这算是它们的起始位置。随着主库不断接收新的写操作,它在缓冲区中的写位置会逐步偏离起始位置,我们通常用偏移量来衡量这个偏移距离的大小,对主库来说,对应的偏移量就是 master_repl_offset。主库接收的新写操作越多,这个值就会越大。

  • 同样,从库在复制完写操作命令后,它在缓冲区中的读位置也开始逐步偏移刚才的起始位置,此时,从库已复制的偏移量 slave_repl_offset 也在不断增加。正常情况下,这两个偏移量基本相等。(感觉和 mysql 的 redo log 的机制有点像)

在这里插入图片描述
主从库的连接恢复之后的数据同步:

主从库的连接恢复之后,从库首先会给主库发送 psync 命令,并把自己当前的 slave_repl_offset 发给主库,主库会判断自己的 master_repl_offset 和 slave_repl_offset 之间的差距。主库只用把 master_repl_offset 和 slave_repl_offset 之间的命令操作同步给从库就行。(通过replication buffer)

增量复制的流程:
在这里插入图片描述
此时,数据恢复的大致流程就完成啦!!!

下面是一些注意点和重点事项:

注意点:因为 repl_backlog_buffer 是环形缓冲区,如果主库写的速度大于从库的读取速度,那么会发生数据覆盖的情况。(如果发生覆盖后,就不得不进行全量复制)

一般而言,我们可以调整 repl_backlog_size 这个参数。

缓冲空间的计算公式是:缓冲空间大小 = 主库写入命令速度 * 操作大小 - 主从库间网络传输命令速度 * 操作大小

repl_backlog_size = 缓冲空间大小 * 2(一般会考虑并发情况)

重点:

  1. 一个从库如果和主库断连时间过长,造成它在主库repl_backlog_bufferslave_repl_offset位置上的数据已经被覆盖掉了,此时从库和主库间将进行全量复制。
  2. 每个从库会记录自己的slave_repl_offset,每个从库的复制进度也不一定相同。在和主库重连进行恢复时,从库会通过psync命令把自己记录的slave_repl_offset发给主库,主库会根据从库各自的复制进度,来决定这个从库可以进行增量复制,还是全量复制。

repl_backlog_buffer和replication buffer的详细区别:

  1. repl_backlog_buffer:是为了从库断开之后,如何找到主从差异数据而设计的环形缓冲区,从而避免全量同步带来的性能开销。如果从库断开时间太久,repl_backlog_buffer环形缓冲区被主库的写命令覆盖了,那么从库连上主库后只能乖乖地进行一次全量同步,所以repl_backlog_buffer配置尽量大一些,可以降低主从断开后全量同步的概率。而在repl_backlog_buffer中找主从差异的数据后,如何发给从库呢?这就用到了replication buffer。
  2. replication bufferRedis和客户端通信也好,和从库通信也好,Redis都需要给分配一个 内存buffer进行数据交互,客户端是一个client,从库也是一个client,我们每个client连上Redis后,Redis都会分配一个client buffer,所有数据交互都是通过这个buffer进行的:Redis先把数据写到这个buffer中,然后再把buffer中的数据发到client socket中再通过网络发送出去,这样就完成了数据交互。所以主从在增量同步时,从库作为一个client,也会分配一个buffer,只不过这个buffer专门用来传播用户的写命令到从库,保证主从数据一致,我们通常把它叫做replication buffer
  3. 再延伸一下,既然有这个内存buffer存在,那么这个buffer有没有限制呢?如果主从在传播命令时,因为某些原因从库处理得非常慢,那么主库上的这个buffer就会持续增长,消耗大量的内存资源,甚至OOM。所以Redis提供了client-output-buffer-limit参数限制这个buffer的大小,如果超过限制,主库会强制断开这个client的连接,也就是说从库处理慢导致主库内存buffer的积压达到限制后,主库会强制断开从库的连接,此时主从复制会中断,中断后如果从库再次发起复制请求,那么此时可能会导致恶性循环,引发复制风暴,这种情况需要格外注意。

参考资料:极客时间

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

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

相关文章

hashmap底层原理解析

底层数据结构,1.7与1.8有何不同? 为何要用红黑树,为何一上来不树化?树化阈值为何是8?何时会树化?何时会退化为链表? 链表比较短的时候,查询性能并没有那么低,不用费劲把它转成红黑树&#xff…

项目经理如何做好项目管理中的风险管理

项目中始终有些看不见的风险,这些风险可以成为威胁,也有可能会影响到项目的计划发生重大的变化。 一、项目目标不明确 确定项目目标是项目启动阶段重要的工作之一,要想项目在实施阶段少走弯路,在项目开工前,必须清晰…

信息系统项目管理师Part16-物联网

物联网 1.物联网的两项关键技术 传感器技术、嵌入式技术 2.传感器技术和嵌入式技术 RFID射频识别:可通过无线电信号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。 嵌入式技术:是综合了计算机硬件、传感器技…

猿创征文|OLAP之apache pinot初体验

目录 一、背景 二、介绍 三、特征 四、价值 五、参考组件 组件清单介绍: 1.Controller 2.Server 3.Broker 4.Minion (optional) 六、数据采集 批量数据流程 实时数据流程 查询处理流程 一、背景 最近在熟悉公司内部的埋点采集,发现数据架构…

NK-RTU980 CAP

BSP包中有两个CAP相关的例程,两个例程的区别为获取的图像数据的存储格式不同,planar例程是先存储所有像素点的Y,再存U,再存V。packed例程是每个像素的YVU连续存储。 一、硬件电路 处理器为NUC980DR61Y,封装为64pin&a…

python--转换wrf输出的风场数据为网页可视化的json格式

前言: 一般网页可视化风场中的数据都是json格式,而如果我们希望将wrf模式模拟输出的风场数据在网页中进行展示,这就需要先将wrfoutput数据转换为网页可以识别的json格式。 这里主要需要用到json库,主要的实现方式就是将读取的风场…

微信网课答案公众号题库接口使用

微信网课答案公众号题库接口使用 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台&…

亚马逊审核 美国站安全带ASTMF1772安全绳攀岩绳EN892认证流程

1 登山锁扣定义 登山用锁扣是一种带弹簧门的金属环状物,用于在攀岩和登山时快速可逆地连接各部件,是安全系统关键的一部分。 登山用锁扣可用于将绳索固定到设备上,或者将两件或多件设备连接在一起。它们通常由铝或钢制成。这种锁扣具有不同…

ps2021神经ai滤镜无法使用,ps2021没法用神经元滤镜

如何解决ps2021 新版 AI神经滤镜不能用? 网上买正版,更新下就好了,盗版的都会有各种这样的问题。ps2021神经AI滤镜是需简要上传云端,由Adobe官方服务器人工智能运算的。 Ps2021版本新增了Ai神经元滤镜,它不是与软件一起安装的&…

谣言粉碎机?Python验证股市操盘口诀

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 经常炒股的朋友,应该都听说过这段操盘口诀: 早上大跌要买,早上大涨要卖 下午大涨不追,下午大跌次日买 早上大跌不割,不涨不跌睡觉 我们随手百度,也能发现各大主流论坛,充斥着该口…

Spring入门——Eclipse实现HelloWorld程序

前言 疫情影响又延期开学,只能在家上上网课划划水,刚做完spring入门的一个小作业,来做个总结分享,我也是个刚入门的小白,还望大佬们指点。 步入主题 环境 eclipse/spring-tool-suite-3 jdk1.8.0_221 另外&#xff0…

Linux :mysql数据库自动备份

Linux :mysql数据库自动备份前言使用shell脚本进行数据库的定时备份确定备份数据库备份shell脚本定时shell脚本前言 当项目发布到服务器上后,接下来考虑到就是如何做好数据库的数据备份。为的就是防止服务器突然异常崩溃,而导致的数据丢失问…

使用上下游思维实现系统解耦

在软件开发领域,解耦这个词相信大家都不陌生。在面向对象的语境下,我们会应用SOLID原则来构建高内聚低耦合的应用,实现模块间的解耦;在复杂业务系统分析和建模时,会通过DDD的战略和战术设计帮助划分领域并实现分布式系…

Java毕业设计-校园活动赞助与宣传管理系统

🔥作者主页:疯狂行者🔥 💖✌java领域优质创作者,专注于Java技术领域技术交流✌💖 💖文末获取源码💖 精彩专栏推荐订阅:在 下方专栏👇🏻👇&#x1…

(分布式缓存)Redis持久化

一、RDB持久化 首先需要在Linux系统中安装一个Redis,如果尚未安装的同学,可以参考下面链接教程安装先: (73条消息) 单机安装Redis_其然乐衣的博客-CSDN博客 修改配置文件 创建一个数据 因为设置了只要5秒内有一次修改就会触发一次备份数据&am…

最全 Burp Suite 最新付费稳定版安装教程

介绍 Burp Suite是web应用程序渗透测试集成平台。从应用程序攻击表面的最初映射和分析,到寻找和利用安全漏洞等过程,所有工具为支持整体测试程序而无缝地在一起工作。 平台中所有工具共享同一robust框架,以便统一处理HTTP请求、持久性、认证、上游代理、日志记录、报警和可扩…

《QDebug 2022年8月》

一、Qt Widgets 问题交流 1.QWidget鼠标事件穿透 对于一些透明或者半透明的QWidget,可能需要点击其下方的按钮或其他组件,但是QWidget本身是会接收这些鼠标事件的,需要一些额外的处理。下面是百度到的一些方法: 方式A.设置setA…

Nacos下载和安装-windows

Nacos官网:https://nacos.io/zh-cn/ Nacos官方文档:https://nacos.io/zh-cn/docs/quick-start.html 一、下载 进入nacos官网,选择相应版本下载 github上nacos的zip资源,下载速度奇慢问题。 百度网盘:https://pan.b…

云原生游戏第 2 讲:OpenKruiseGame 设计理念详解

后疫情时代,游戏行业步入高质量发展期,游戏云原生化势在必行。不久前,针对游戏行业云原生落地的难点、游戏玩家服容器化的困境等问题,阿里云容器服务团队通过直播课程《云原生游戏第1讲:游戏玩家服容器化的困境与解法》…

PMP每日一练 | 考试不迷路-9.1(包含敏捷+多选)

!PMP最新考试通知 ! ​2022年6-8月落考考生可免费重考一次! 11月考试可以报名 ​(9月考试改到11月) 每日5道PMP习题助大家上岸PMP!!! ​1.项目经理接到一个开发新产品的项目,这…