常见面试题-Redis 主从复制原理以及痛点

news2025/1/16 5:55:04

Redis 主从复制如何同步数据呢?

参考文章:https://blog.csdn.net/Seky_fei/article/details/106877329

https://zhuanlan.zhihu.com/p/55532249

https://cloud.tencent.com/developer/article/2063597

https://xie.infoq.cn/article/4cffee02a2a12c2450412fa21

在 Redis2.8 之后,进行主从同步使用 psync 命令,在 2.8 之前使用 sync 命令,sync 在断线情况下会进行全量复制,效率很低,因此使用 psync 命令进行改进,具备了 全量同步部分同步 的功能

psync 命令格式如下:

# runid 为 master 的身份 id
# offset 是从节点同步命令的偏移量
psync [runid] [offset]

那么在从节点第一次同步主节点数据时,会向主节点发送 psync ? -1 命令,那么 master 收到命令后,匹配 runid,如果匹配成功,会使用 bgsave 生成 RDB 文件快照,并将 RDB 文件发送给 slave,slave 在收到 RDB 快照后将数据载入

如果从节点是断线之后重新连接上主节点,那么在同步数据时,会向主节点发送 psync runid offset ,那么 master 在收到命令之后,如果 runid 匹配成功,会判断 offset 这个偏移量与 master 本机的数据缓存的偏移量相差是否超过了 复制积压缓冲区 的大小,如果超过了,说明 slave 断线时间太长了,master 的 复制积压缓冲区 中的数据已经和 slave 的数据不连续了,因此进行全量复制;否则,就进行增量复制,将 slave 断线期间没有收到的数据给发送一下就可以了

主节点在接收到命令时,如何保存命令并将命令增量复制给从节点?

master 在接收命令时,将命令传递给 slave 的同时,也会将命令存放到 复制积压缓冲区,并且记录当前积压队列中存放命令的偏移量 offset,当 slave 重连时,master 会根据 slave 传的 offset 和自己最新命令的 offset 进行比较,如果相差的大小超过 复制积压缓冲区 的大小,就直接进行全量复制;否则,就增量复制

复制积压缓冲区 其实就是一个环形的循环队列,默认大小为 1MB,该缓冲区大小越大,允许 slave 断线的时间就越长

#设置复制积压缓冲区大小
repl-backlog-size 1mb

Redis 4.0 PSYNC2.0

在 Redis2.8 之后,使用 psync runid offset 来实现增量同步,但是如果发生了主从切换,那么新的 master 的 runid 和 offset 都会发生变化,因此还是需要全量复制

在 Redis4.0 的 PSYNC2.0 中优化了这个问题,即使发生了主从切换,如果条件允许,也可以进行增量同步

那么在 PSYNC2.0 中,舍弃了 runid 的概念,使用 replidreplid2 来代替,并且 replid2 和 second_replid_offset 是一对:

  • 对 master 来说,replid 就是自己的复制 id,没有发生主从切换之前,replid2 为空,发生主从切换之后,新的 master 的 replid2 是旧 master 的 replid
  • 对 slave 来说,replid 保存的是自己当前正在同步的 master 的 replidreplid2 保存的旧 master 的 replid

second_replid_offset 记录了上一次复制的主库的 offset

psync2.0中如何判断增量复制?

从节点向主节点发送同步请求,那么主节点需要判断两个东西:

  1. 从节点的 offset 是否在 复制积压缓冲区

  2. 判断复制历史是否一样

    判断复制历史首先 master 要判断 replid 是否一致,也就是从节点的 replid 和 master 的 replid2 相同,如果一致(表明新的主节点和从节点之前都是复制的同一个主节点),再来判断这个 offset 是否在上一次的 second_replid_offset,如果也在的话,就可以进行增量同步

下边这个例子说明一下为什么 offset 要在上一次的 second_replid_offset 中:

在这里插入图片描述

比如一主一从机器来说,master1 和 slave1,master1 中写入两条数据:

# master1  
lpush A B
lpush A C

我们假设一条数据偏移量为 10,那么在 master1 中插入两条数据,master1 的 offset = 20,此时 master1 和 slave1 主从复制,slave1 在复制完第一条数据之后,也就是 lpush A B 之后,failover 后 slave1 变为新的 master,我们先称原 slave1 为 master2,原 master1 为 slave2

那么 master2 又会接收新的请求,假如在 master2 中写入如下数据:

# master2
lpush A D

那么此时 master2 中也有两条数据了,如上图,在发生主从切换之后,master2 和 slave2 的 offset 都是 20,是相同的,但是他们两个能进行增量复制吗?

肯定不可以,虽然他们的 offset 是相同的,但是他的复制上下文已经变了,原来的 slave 进行主从复制是基于

lpush A B
lpush A C

这个上下文来进行复制的,那么在主从切换之后,新的主库写入了新的数据,新主库的上下文已经变为了:

lpush A B
lpush A D

和原来主库的上下文都不同了,那么只单纯比较 offset 是没有意义的,所以需要拿 offset 和 second_replid_offset 进行比较

PSYNC-AOF【扩展内容】

详细参考:Redis 主从复制演进历程与百度智能云的实践

百度智能云提出了 - PSYNC-AOF 方案

在 Redis 的主从复制中存在的问题,首先就是内存,Redis 的数据都存储在内存中,Backlog(复制积压缓冲区) 也在内存中,那么内存容量是有限的,当主从连接断开重连后,从库在主库的 Backlog 中查找数据,因为 Backlog 容量是有限的,所以查找数据也有限,那么如果主从断连时间过长的话,就在 Backlog 中找不到对应的数据,就需要进行全量复制了

那么 PSYNC-AOF 方案中,将 AOF 的内容和 Backlog 内容保持一致,主从断连后,从库去主库的 Backlog 中查找数据,那么如果没有找到的话,尝试从 AOF 里找,那么通过 RDB 文件作为基准,AOF 作为增量,就可以实现一个更大的 复制积压缓冲区 ,从而可以应对更长的网络延迟以及网络断开。

总结:总之,主从复制的痛点在于如果主从连接断开时间过长,或者发生主从切换,会导致全量复制,全量复制很伤,所以优化主从数据同步的目的就是尽可能地避免全量复制

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

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

相关文章

【Linux】-进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

Nuxt3使用

1.官网下载 npx nuxilatest init nuxt(有墙)&#xff0c;也可以到这个地方下载&#xff1a;git clone https://gitee.com/pmx600/nuxt3.git。 2.找到app.vue文件 将里面的代码修改为&#xff1a;<template><NuxtPage /></template>&#xff0c;NuxtPage 的…

【JavaScript】2.3 数据处理和函数式编程

文章目录 数组操作mapfilterreduce 函数式编程纯函数高阶函数闭包 总结 JavaScript提供了丰富的数据处理方法&#xff0c;特别是在数组操作和函数式编程方面。在这一章节中&#xff0c;我们将学习一些JavaScript中的数据处理技巧和函数式编程的基本概念。 数组操作 JavaScript…

替换的DLL用户电脑报错加载失败

编译后混淆加签名的dll 远程下载下来有个选项&#xff1a; 在某用户电脑上出现加载失败的报错 右键dll 属性里勾选解除锁定后 加载运行正常 跟用户电脑安全策略有关系 有的会出现 大部分不会

函数式编程-Stream流笔记-三更草堂

函数式编程-Stream流 1. 概述 1.1 为什么学&#xff1f; 能够看懂公司里的代码 大数量下处理集合效率高 代码可读性高 消灭嵌套地狱 //查询未成年作家的评分在70以上的书籍 由于数据中作家和书籍可能出现重复&#xff0c;需要进行去重 List<Book> bookList new Ar…

有用!2023汉字小达人市级比赛填空题专项训练,在线模拟题来了

只剩下一周了&#xff0c;2023年第十届汉字小达人市级比赛就要正式开始了。 敲黑板&#xff01;汉字小达人区级比赛时间为2023年11月30日&#xff08;星期四&#xff09;下午16&#xff1a;00-18&#xff1a;00&#xff0c;记得设置闹钟。提前和老师确认学校统一组织比赛&…

uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址

前言 最近在开发中需要根据经纬度获取当前位置信息&#xff0c;传递给后端&#xff0c;用来回显显示当前位置 查阅uni-app文档&#xff0c;发现uni.getLocation () 可以获取到经纬度&#xff0c;但是在小程序环境没有地址信息 思考怎么把经纬度换成地址&#xff0c;如果经纬度…

d3dx9_43.dll缺失怎么办?教你一分钟修复d3dx9_43.dll丢失问题

今天&#xff0c;与大家分享关于“d3dx9_43.dll丢失的5个解决方法”的主题。在我们的日常生活和工作中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;而d3dx9_43.dll丢失就是其中之一。那么&#xff0c;什么是d3dx9_43.dll呢&#xff1f;它为什么会丢失&#xff1f;又该…

pikachu靶场PHP反序列化漏洞

pikachu靶场PHP反序列化漏洞 源码分析 查看源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }// O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_PO…

深度学习之基于YoloV5车辆和行人目标检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介YOLOv5 简介YOLOv5 特点 车辆和行人目标检测系统 二、功能三、系统四. 总结 一项目简介 # 深度学习之基于 YOLOv5 车辆和行人目标检测系统介绍 深度学习在…

帝国cms开发一个泛知识类的小程序的历程记录

#帝国cms小程序# 要开发一个泛知识类的小程序&#xff0c;要解决以下几个问题。 1。知识内容的分类。 2。知识内容的内容展示。 3。知识内容的价格设置。 4。用户体系&#xff0c;为简化用户的操作&#xff0c;在用户进行下载的时候&#xff0c;请用户输入手机号&#xff…

二、类与对象(二)

8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date&#xff1a; #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…

【Java 进阶篇】Redis:打开缓存之门

介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值对存储系统&#xff0c;被广泛用作缓存、消息中间件和数据库。它以其快速的读写能力、支持多种数据结构和丰富的功能而闻名。在这篇博客中&#xff0c;我们将深入了解Redis的概念、安装以及基本…

【LeetCode刷题】--43.字符串相乘

43.字符串相乘 方法一&#xff1a;做加法&#xff0c;模拟竖式乘法的方法计算乘积 class Solution {public String multiply(String num1, String num2) {if(num1.equals("0") || num2.equals("0")){return "0";}String res "0";//nu…

什么是开关电源测试系统?如何用它进行测试?

开关电源测试系统是针对开关电源测试而开发的一种智能自动化测试系统&#xff0c;打破传统测试程序与缺陷&#xff0c;满足客户新的测试需求&#xff0c;助力客户解决测试难点&#xff0c;顺利完成开关电源测试&#xff0c;提高测试效能。那么开关电源自动化测试方案的流程是什…

设备状态监测与故障诊断系统的作用

随着工业生产的发展和技术的进步&#xff0c;设备状态监测与故障诊断系统在工业领域中扮演着越来越重要的角色。这一系统通过实时监测设备的状态和参数&#xff0c;及时发现潜在的故障&#xff0c;并提供预警信号&#xff0c;以降低生产中断、提高安全性和维护效率。以下将详细…

【Java 进阶篇】从Java对象到JSON:Jackson的魔法之旅

在现代的软件开发中&#xff0c;处理数据的能力是至关重要的。而当我们谈及数据格式时&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;通常是首选。为了在Java中轻松地将对象转换为JSON&#xff0c;我们需要一种强大而灵活的工具。这时&#xff0c;Jackso…

HTML玩转超链接a标签

大家应该都知道&#xff0c;a标签主要是转跳链接&#xff0c;接下来&#xff0c;让我为大家介绍一下a标签的使用&#xff01; 主要的作用&#xff1a;从当前页面进行跳转 标签名标签语义常用属性单/双标签a超链接href&#xff1a;要跳转的具体位置 target&#xff1a;跳转时如…

2023年【安全生产监管人员】考试题及安全生产监管人员找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题参考答案及安全生产监管人员考试试题解析是安全生产模拟考试一点通题库老师及安全生产监管人员操作证已考过的学员汇总&#xff0c;相对有效帮助安全生产监管人员找解析学员顺利通过考试。 1、…

HTTPS协议的加密流程

目录 一&#xff0c;HTTPS是什么 二&#xff0c;两种加密方式 三&#xff0c;HTTPS的加密过程 3.1 引入对称加密 3.2 引入非对称加密 3.3 引入证书 一&#xff0c;HTTPS是什么 HTTPS也是一个应用层协议&#xff0c;它是在HTTP协议的基础上引入了一个加密层。因为HTTP协议…