[Redis][主从复制][下]详细讲解

news2024/12/23 8:39:51

目录

  • 1.复制
    • 1.全量复制
    • 2.1部分复制
    • 2.2复制积压缓冲区
    • 3.实时复制
  • 2.总结


1.复制

1.全量复制

  • 什么时候进行全量复制?

    • 首次和主节点进行数据同步
    • 主节点不方便进行部分复制的时候
  • 全量复制流程

    1. 从节点发送psync命令给主节点进⾏数据同步,由于是第⼀次进⾏复制,从节点没有主节点的运⾏ID和复制偏移量,所以发送psync ? -1
    2. 主节点根据命令,解析出要进⾏全量复制,回复+FULLRESYNC响应
    3. 从节点接收主节点的运⾏信息进⾏保存
    4. 主节点执⾏bgsave进⾏RDB⽂件的持久化
    5. 主节点发送RDB⽂件给从节点,从节点保存RDB数据到本地硬盘
    6. 主节点将从⽣成RDB到接收完成期间执⾏的写命令,写⼊缓冲区中,等从节点保存完RDB⽂件后,主节点再将缓冲区内的数据补发给从节点,补发的数据仍然按照RDB的⼆进制格式追加写⼊到收到的rdb⽂件中,保持主从⼀致性
    7. 从节点清空⾃⾝原有旧数据
    8. 从节点加载RDB⽂件得到与主节点⼀致的数据
    9. 如果从节点加载RDB完成之后,并且开启了AOF持久化功能,它会进⾏bgrewrite操作,得到最近的AOF⽂件
      请添加图片描述
  • 注意:全量复制是⼀件⾼成本的操作

    • 主节点bgsave的时间, RDB在⽹络传输的时间,从节点清空旧数据的时间,从节点加载RDB的时间等
    • 所以⼀般应该尽可能避免对已经有⼤量数据集的Redis进⾏全量复制
  • 有磁盘复制 VS 无磁盘复制

    • 默认情况下,进⾏全量复制需要主节点⽣成RDB⽂件到主节点的磁盘中,再把磁盘上的RDB ⽂件通过发送给从节点
    • Redi 从2.8.18版本开始⽀持⽆磁盘复制,主节点在执⾏RDB⽣成流程时,不会⽣成RDB⽂件到磁盘中了,⽽是直接把⽣成的RDB数据通过⽹络发送给从节点,这样就节省了⼀系列的写硬盘和读硬盘的操作开销

2.1部分复制

  • 部分复制主要是Redis针对全量复制的过⾼开销做出的⼀种优化措施
    • 使⽤psync replicationId offset命令实现
  • 什么时候进行部分复制?
    • 当从节点正在复制主节点时,如果出现⽹络闪断或者命令丢失等异常情况时,从节点会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区存在数据则直接发送给从节点, 这样就可以保持主从节点复制的⼀致性
    • 补发的这部分数据⼀般远远⼩于全量数据,所以开销很⼩
  • 部分复制流程
    1. 当主从节点之间出现⽹络中断时,如果超过repl-timeout时间,主节点会认为从节点故障并中断复制连接
    2. 主从连接中断期间主节点依然响应命令,但这些复制命令都因⽹络中断⽆法及时发送给从节点,所以暂时将这些命令滞留在复制积压缓冲区中
    3. 当主从节点⽹络恢复后,从节点再次连上主节点
    4. 从节点将之前保存的replicationId和复制偏移量作为psync的参数发送给主节点,请求进⾏部分复制
    5. 主节点接到psync请求后,进⾏必要的验证,随后根据offset去复制积压缓冲区查找合适的数据, 并响应+CONTINUE给从节点
    6. 主节点将需要从节点同步的数据发送给从节点,最终完成⼀致性
      请添加图片描述

2.2复制积压缓冲区

  • 复制积压缓冲区是保存在主节点上的⼀个固定⻓度的队列,默认⼤⼩为1MB

    • 会记录最近一段时间修改的数据
    • 总量有限,随着时间的推移,就会把之前的旧的数据逐渐删掉
  • 当主节点有连接的从节点(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写⼊复制积压缓冲区
    请添加图片描述

  • 由于缓冲区本质上是先进先出的定⻓队列,所以能实现保存最近已复制数据的功能,⽤于部分复制和复制命令丢失的数据补救

  • 复制缓冲区相关统计信息可以通过主节点的info replication

    127.0.0.1:6379> info replication
    # Replication
    role:master
    ...
    repl_backlog_active:1                // 开启复制缓冲区
    repl_backlog_size:1048576            // 缓冲区最⼤⻓度
    repl_backlog_first_byte_offset:7479  // 起始偏移量,计算当前缓冲区可⽤范围
    repl_backlog_histlen:1048576         // 已保存数据的有效⻓度
    
  • 根据统计指标,可算出复制积压缓冲区内的可⽤偏移量范围[repl_backlog_first_byte_offset, repl_backlog_first_byte_offset + repl_backlog_histlen]

  • 如果当前从节点需要的数据,已经超出了主节点的积压缓冲区的范围,则⽆法进⾏部分复制,只能全量复制了


3.实时复制

  • 主从节点在建⽴复制连接后,主节点会把⾃⼰收到的修改操作,通过TCP⻓连接的⽅式,源源不断的传输给从节点,从节点就会根据这些请求来同时修改⾃⾝的数据,从⽽保持和主节点数据的⼀致性
  • 这样的⻓连接,需要通过⼼跳包的⽅式来维护连接状态(这⾥的⼼跳是指应⽤层⾃⼰实现的⼼跳,⽽不是TCP⾃带的⼼跳)
    • 主从节点彼此都有⼼跳检测机制,各⾃模拟成对⽅的客⼾端进⾏通信
    • 主节点默认每隔10秒对从节点发送ping命令,判断从节点的存活性和连接状态
    • 从节点默认每隔1秒向主节点发送replconf ack {offset}命令,给主节点上报⾃⾝当前的复制偏移量
  • 如果主节点发现从节点通信延迟超过repl-timeout配置的值(默认60秒),则判定从节点下线,断开复制客⼾端连接
    • 从节点恢复连接后,⼼跳机制继续进⾏

2.总结

  • 单点问题
    • 单个Redis节点,可用性不高
    • 单个Redis节点,性能有限
  • 主从复制的特点
    • Redis通过复制功能实现主节点的多个副本
    • 主节点⽤来写,从节点⽤来读,这样做可以降低主节点的访问压⼒
    • 复制⽀持多种拓扑结构,可以在适当的场景选择合适的拓扑结构
    • 复制分为全量复制,部分复制和实时复制
    • 主从节点之间通过⼼跳机制保证主从节点通信正常和数据⼀致性
  • 主从复制配置的过程
    • 主节点配置不需要改动
    • 从节点在配置⽂件中加⼊slaveof 主节点ip 主节点端口的形式即可
  • 主从复制的缺点
    • 从机多了,复制数据的延时⾮常明显
    • 主机挂了,从机不会升级成主机,只能通过⼈⼯⼲预的⽅式恢复

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

①EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 型号: 1路总线EC网关 MS-A2-1011 2路总线EC网关 MS-A2-1021 4路总线EC网关 MS-A2-1041 技…

arcgis for js实现阴影立体效果

效果 实现 主要通过effect属性实现 代码: (这里以GeoJSON图层为例, 代码复制即可用) <!DOCTYPE html> <html lang"zn"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge&quo…

PHP 于小项目:从鉴权说起

PHP 于小项目&#xff1a;从鉴权说起 在当今这个开发技术多样化的时代&#xff0c;选择合适的开发语言和框架常常决定了项目的效率与成败。对于个人开发者&#xff0c;特别是那些进行小型、短期项目的人来说&#xff0c;PHP 是一种特别友好的选择。本文将通过介绍 PHP 实现鉴权…

YOLOv9改进,YOLOv9主干网络替换为GhostNetV3(2024年华为提出的轻量化架构,全网首发),助力涨点

摘要 GhostNetV3 是由华为诺亚方舟实验室的团队发布的,于2024年4月发布。 摘要:紧凑型神经网络专为边缘设备上的应用设计,具备更快的推理速度,但性能相对适中。然而,紧凑型模型的训练策略目前借鉴自传统模型,这忽略了它们在模型容量上的差异,可能阻碍紧凑型模型的性能…

仓库场景物品检测分类系统源码分享

仓库场景物品检测分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

显示adb报错,uniapp安装自定义基座

uni-app,uniCloud,serverless,真机运行常见问题,第1步 HX中没有运行到手机的菜单,第2步 电脑是否能检测到手机,第3步 电脑与手机是否建立信任调试关系,3.1 Android设备信任,3.2 iOS设备信任,第4步 HBuilderX检测手机,4.1 检测Android手https://uniapp.dcloud.net.cn/tutorial/r…

PHP爬虫APP程序:打造智能化数据抓取工具

在信息爆炸的时代&#xff0c;数据的重要性日益凸显。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;因其强大的功能和灵活性&#xff0c;成为开发爬虫程序的理想选择。本文将探讨如何使用PHP构建一个爬虫APP程序&#xff0c;以及其背后的思维逻辑和实现步骤。 什么是PHP爬…

【高分系列卫星简介——高分七号卫星(GF-7)】

高分七号卫星&#xff08;GF-7&#xff09; 高分七号&#xff08;GF-7&#xff09;卫星是中国高分辨率对地观测系统&#xff08;高分专项&#xff09;的重要组成部分&#xff0c;具有显著的技术突破和广泛的应用价值。以下是对高分七号卫星的详细介绍&#xff1a; 一、基本信息…

word2vector训练代码详解

目录 1.代码实现 2.知识点 1.代码实现 #导包 import math import torch from torch import nn import dltools #加载PTB数据集 &#xff0c;需要把PTB数据集的文件夹放在代码上一级目录的data文件中&#xff0c;不用解压 #批次大小、窗口大小、噪声词大小 batch_size, ma…

堆的数组实现

目录 一、堆 二叉树的顺序结构 堆的概念及结构 1.概念 2.堆的分类 (1)大堆 (2)小堆 二、利用数组(顺序结构)实现堆的过程 1.利用数组实现堆的思路 2.堆是用数组实现的&#xff0c;在数组中通过双亲找自己左右孩子、通过左右孩子找自己双亲的思路 2.1.思路 2.2.孩子与…

认知杂谈84《菜鸟的自我修炼:知易行难与行难知易》

内容摘要&#xff1a; 理解与行动之间的差距是日常生活的常见挑战。"知易行难"体现在理解简单但执行困难&#xff0c;例如知道蔬菜有益但难以坚持食用。而"行难知易"则是开始时困难但后来容易的任务&#xff0c;如学习骑自行车。 这种差异源于心理惰性和习…

使用 Llama-index 实现的 Agentic RAG-Router Query Engine

前言 你是否也厌倦了我在博文中经常提到的老式 RAG(Retrieval Augmented Generation | 检索增强生成) 系统&#xff1f;反正我是对此感到厌倦了。但我们可以做一些有趣的事情&#xff0c;让它更上一层楼。接下来就跟我一起将 agents 概念引入传统的 RAG 工作流&#xff0c;重新…

OnlyOffice 打开文档时提示下载失败

OnlyOffice 下载失败问题 问题概述 OnlyOffice前端界面出现“下载失败” 问题定位&#xff08;0&#xff1a;docker内不能够访问&#xff09; 很常见的一种情况是后端服务地址错误&#xff0c;在docker内无法访问。 请在docker容器中确定这个地址是可以访问的&#xff0c;鉴…

electron 设置界面右下角打开

功能需求场景 写一个可以下载各种平台的小工具&#xff0c;需要右下角打开方便做其它事情 实现基础 要在屏幕的右下角设置窗口&#xff0c;可以调整mainWindow的创建参数&#xff0c;特别是通过使用x和y坐标来定位窗口 &#xff1b; 需要获取屏幕的尺寸&#xff0c;并据此计算…

不透明物体的投射和接收阴影

1、Fallback的作用 新建一个材质球&#xff0c;将其的Shader设置为之前编写的多种光源综合实现Shader 并将该材质球赋值给较大的立方体使用&#xff0c;我们会发现该立方体不再投射阴影也不再接受阴影 &#xff08;1&#xff09;不投射阴影的原因 该Shader中没有LightMo…

Rust编程的if选择语句

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 Rust语言实现选择结构时&#xff0c;根据某种条件的成立与否而采用不同的程序段进行…

【Kubernetes】日志平台EFK+Logstash+Kafka【实战】

一&#xff0c;环境准备 &#xff08;1&#xff09;下载镜像包&#xff08;共3个&#xff09;&#xff1a; elasticsearch-7-12-1.tar.gz fluentd-containerd.tar.gz kibana-7-12-1.tar.gz &#xff08;2&#xff09;在node节点导入镜像&#xff1a; ctr -nk8s.io images i…

解决sortablejs+el-table表格内限制回撤和拖拽回撤失败问题

应用场景&#xff1a; table内同一类型可拖拽&#xff0c;不支持不同类型拖拽&#xff08;主演可拖拽交换位置&#xff0c;非主演和主演不可交换位置&#xff09;,类型不同拖拽效果需还原&#xff0c;试了好几次el-table数据更新了&#xff0c;但是表格样式和数据不能及时保持…

Java面试题之JVM面试题

JVM 的主要作用是什么&#xff1f; JVM 就是 Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM 屏蔽了与具体操作系统平台相关的信息&#xff0c;使 Java 程序只需生成在 Java 虚拟机上运行的目标代码 &#xff08;字节码&#xff09;&#xff0…

uniapp 常用高度状态栏,导航栏,tab栏,底部安全高度

实际效果 使用 //使用 let posConfig this.getPosConfig(); // 传false返回值为 px大小 console.log(posConfig.safeBottomH) // 入参 是否转换为rpxgetPosConfig(toRpx true) {const systemInfo uni.getSystemInfoSync();// #ifdef MPconst menuButtonInfo uni.getMenuBu…