Redis进阶底层原理-主从复制

news2024/11/23 22:14:01
Redis的主从节点都会记录对方的信息,核心还包括ReplicationID 和 offset ,

ReplicationID : 主从节点实例的ID ,redis内部就是通过这个id去识别主从节点。
offset数据同步偏移量,也就是从节点每次从主节点同步数据后记录的数值,用来标记已经同步到哪个地方了。一般offset是从小到大增长的,增长的大小就是获取数据的字节数。比如从A首次同步主B的数据,则一开始offset为-1,表示未同步数据。在一次同步完后,同数据未1000字节,则主节点和从节点都会记录当前偏移量,作用:实现部分数据同步,以后作为后续集群中选举过程中一个门槛。

Redis数据同步是一个异步的过程,所以不能保证数据强一致性。
在老版本中,主从复制在第一次或者断线重连后,只能进程全量数据同步SYNC,但是在新版本中,从节点断线重连后可以进行增量数据同步(这个指的是断线重连之后)

主从复制数据同步原理-全量复制

全量复制指主服务器将全量的RBD数据复制给从的过程。

什么情况下会进行全量复制?
1、从首次进行数据同步过程,在老版本中因为不支持部分复制,所以一旦从机启动就会进行全量同步。
2、在新版本中支持了部分同步,所以在从机断线从重启后会根据offset偏移量来判断是否全量同步。

全量复制原理以及怎么保证新增数据的一致性?

 当从节点与主节点建立关系后,
1、从节点会发送psync要求数据复制同步,此时传输过去的offset为-1,代表全量复制。
2、主节点会接受同步请求,并同步给从ID和offset
3、主中主线程会fork一个子进程开始RDB操作,并通过管道技术,将RBD传输给主线程。
4、主线程将RBD文件传输给子进程。
5、在同步过程中,如果有新的数据产生,则主节点会将数据写入 复制缓冲区(输出缓冲区的一种),在完成RBD传输后,会将缓冲区中的数据同步给从,来保证数据一致性

注意:复制缓冲区是针对客户端的缓冲区,也就是每有一个客户端连接就会有这样的一个缓冲区。用来接受客户端输出数据,如果超过缓冲区,就会断开客户端连接(后面详细说)通过 client-output-buffer-limit replica 256mb 64mb 60

 主从复制数据同步原理-增量复制(部分数据同步)

      这里的增量复制指的是从节点发生断线重连后,进行的增量数据同步,在老版本因为不支持增量数据同步,所以从节点重连后,依然会进行全量数据的同步,如果RBD很大的情况下,需要更多的开销,比如fork开销更大。所以在后续版本中redis支持从节点断线重连后进行增量数据复制过程。
一般从节点断线场景:
1、比如主从同步超时:repl-timeout
2、输出缓冲区溢出 output-limit : 1、当存在非常大的key 。2、读取频率非常高时。
3、输入缓冲区溢出 :  1、当存在非常大的key 。2、写入频率非常高时。

增量复制原理

在开启主从复制后,在进行全量数据同步的过程中,同时也会将数据写入到复制积压缓冲区(主从都是会维护自身的一个offset的)
1、当从节点重连后,会发送psync并带上id和offset给主,此时offset就是上次断线前同步的偏移量。
2、主节点会通过这个偏移量判断是否在复制积压缓冲区中,
     如果存在:则将缓冲区中剩余的内容同步给从,
     如果没有:则表示当前偏移量已经很老了,则需要全量同步。


ps:复制积压缓冲区是一个环形缓冲区,大小为1mb,它是所有slave共享的缓冲区,所以如果一个从断线后,在此过程中发生了数据同步,则新的数据可能会覆盖环形缓冲区的数据,导致断线的slave偏移量在缓冲区没有,此时就需要全量复制。通过:repl-backlog-size配置缓冲区大小,默认是1m

 原图下载:

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

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

相关文章

3.6 Bootstrap 导航元素

文章目录 Bootstrap 导航元素表格导航或标签胶囊式的导航菜单基本的胶囊式导航菜单垂直的胶囊式导航菜单 两端对齐的导航禁用链接下拉菜单带有下拉菜单的标签带有下拉菜单的胶囊标签页与胶囊式标签页 Bootstrap 导航元素 本文将讲解 Bootstrap 提供的用于定义导航元素的一些选项…

使用thrift编写C++服务器、客户端

在上一节《Linux 下编译 thrift》中,我们成功编译出了thrift的库文件,本节我们来编写thrift的C服务器,客户端。 官网 https://thrift.apache.org/tutorial/cpp.html 有thrift的C例子。在我们之前下载下来的thrift 源码根目录的tutorial/cpp目…

MySQL高级管理

目录 一、指定主键的一种方式 1.1高级操作 1.2数据表高级操作,克隆表 1.2.1 克隆表名 1.2.2备份表内容 1.3复制表 1.4删除指令 方法一: 方法二: 删除速度 二、创建临时表 三、MySQL中6种常见的约束 3.1创建主表 3.2创建从表 3.3为主表test01添加…

[Docker异常篇]解决Linux[文件异常]导致开机Docker服务无法启动

文章目录 一:场景复现二:解决思路2.1: 对比其他节点docker配置2.2:试着修改为正常节点配置2.2:根据上面异常显示,不一定是配置不对,可能是文件系统有损坏 三:解决 -> 执行命令 mo…

【机器学习算法】奇异值分解(SVD)

文章目录 奇异值分解(SVD)1.理论部分1.1特征分解(ED)1.2 奇异值分解(SVD)求解U和V求解Σ 2.应用部分2.1图像压缩2.2图像数据集成分分析2.3 数据降维(PCA的一种解法) Reference 奇异值分解(SVD) 奇异值分解(Singular Value Decomposition) 是矩阵低秩分解的一种方法,…

太猛了!Web安全漏洞批量扫描框架

关注【Hack分享吧】公众号,回复关键字【230528】获取下载链接 工具介绍 一个应用于web安全领域的漏洞批量扫描框架,可被应用于但不限于如下场景: 0Day/1Day全网概念验证(在没有测试环境(各种商业、闭源软件)或懒得搭建测试环境的情况下&…

D. Binary String Sorting

Problem - 1809D - Codeforces 思路:最后得到的结果就是前面是一串0后面是一串1,那么我们可以枚举分界点,如果枚举到i,那么就将1~i变为0,将i1变为1,我们发现如果一个1在1~i中,如果他是第i-1个,那…

Redis进阶底层原理-Cluster集群底层

Redis实现高可用的方案有很多中,先了解下高可用和分区的概念: 高可用是指系统在面对硬件故障、网络故障、软件错误等意外问题时,仍能给客户端提供正常的服务,尽量的减少服务的阻塞、终端现象。在高可用的方案中一般会采用冗余备份…

《洛谷深浅》第五章---数组与数据批量存储

文章目录 前言一、小鱼比可爱二、小鱼的数字游戏三、冰雹猜想四、校门外的树五、旗鼓相当的对手六、旗鼓相当的对手总结 前言 本节主要学习一维数组 和 多维数组 后边的知识我觉得 可以试着了解并不要求你掌握这么难的题目 因为ACM更多都是思维题目 所以这里把重要的题目掌握就…

【多线程系列-03】深入理解java中线程的生命周期,任务调度

多线程系列整体栏目 内容链接地址【一】深入理解进程、线程和CPU之间的关系https://blog.csdn.net/zhenghuishengq/article/details/131714191【二】java创建线程的方式到底有几种?(详解)https://blog.csdn.net/zhenghuishengq/article/details/127968166【三】深入…

基于树莓派实现的IO-Link 项目

IO-Link 协议 (IEC 61131-9) 是从传感器或执行器到 IO-Link 主站的串行半双工点对点连接。目前IO-Link 的硬应已经越来越普及。国外产品以巴鲁夫为代表。如何开发IO-link 产品?可以参考国外的一些开源项目。 国外有人开发了开发一个IO-Link主…

soundfile torchaudio 读取音频文件

soundfile 和 torchaudio 读取音频文件后的数据格式不同,前者是numpy,后者是tensor。前者读取后可以直接用于一些python的基础函数输入,后者用于pytorch的一些函数的应用。两者互换用途时候需要进行格式转换。 import soundfile as sf impor…

智能指针使用及详细解析

文章目录 智能指针概念为什么使用智能指针智能指针使用智能指针的常用函数get() 获取智能指针托管的指针地址.reset() 重置智能指针托管的内存地址,如果地址不一致,原来的会被析构掉 auto_ptrunique_ptrshared_ptr**shared_ptr的原理**引用计数的使用构造…

Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。 Gradle 作为官方主推的构建系统,目前已经深度应用于 Android 的多个技术体系中,例如组件化开发、产物构建、单元测试等…

STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库…

Spring Batch之读数据库——JdbcCursorItemReader之自定义RowMapper(三十七)

一、自定义RowMapper 详情参考我的另一篇博客: Spring Batch之读数据库——JdbcCursorItemReader(三十五)_人……杰的博客-CSDN博客 二、项目实例 1.项目框架 2.代码实现 BatchMain.java: package com.xj.demo28;import org.springfram…

代码随想录第27天 | 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

455.分发饼干 /*** param {number[]} g* param {number[]} s* return {number}*/ var findContentChildren function(g, s) {let a0let b0let count0g.sort((a,b)>a-b)s.sort((a,b)>a-b)while(a<g.length&&b<s.length){if(s[b]>g[a]){countba}else{b}…

STM32(HAL库)软件IIC驱动OLED

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 项目生成 3、KEIL端程序整合 3.1 OLED驱动添加 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机&#xff08;HAL库&#xff09;通过软件IIC方式…

java linux服务器环境搭建

安装 jdk 下载jdk: wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24http%3A%2F%2Fwww.oracle.com%2F; oraclelicenseaccept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f…

Kubespray v2.22.1 在线部署 kubernetes v1.26.5 集群

文章目录 1. 介绍2. 预备条件3. 配置 hostname4. yum5. 下载介质5.1 git 下载5.2 下载 kubespray v2.22.1 6. 编写 inventory.ini7. 配置互信8. 安装 ansible9. 关闭防火墙10. 安装 docker11. 配置内核参数12. 启动容器 kubespray13. 部署14. 配置连接集群 1. 介绍 kubespray​…