redis主从复制策略的原理:主从节点间如何同步数据?

news2025/1/11 20:50:03

redis的主从复制原理经历了多个版本的更新。

redis2.8之前的SYNC方案

命令:

SYNC

https://www.yuque.com/snailclimb/mf2z3k/ks9olb19hc9wse5k#5935f46a

存在的问题:

  • slave加载RDB的过程中不能对外提供读服务
  • slave和master断开连接后,slave重新连上master需要进行全量同步

redis2.8的PSYNC方案

命令:

PSYNC replicationid offset

PSYNC 解决了 slave 和 master 断开连接(如网络波动)之后需要重新进行全量同步的问题。不过,部分情况(比如 slave 突然宕机或者被重启)重连之后依然需要进行全量同步。(如果首次连接,也要全量同步)

怎么解决的?

slave 会记录 master 的运行 id (也就是 runid)和自己的复制进度/偏移量(slave_repl_offset)。master 也会记录自己写入缓冲区的偏移量(master_repl_offset),如果 runid 匹配的话,通过 slave_repl_offset 和 master_repl_offset 就可以确认 slave 缺少的数据是否在缓冲区中以及缺少的具体是哪一部分的数据。
注意:首次连接时slave还不知道master的runid

总结一下PSYNC有哪些情况还是需要进行全量同步?

  • slave首次与master连接
  • slave突然宕机或重启,runid和offset都丢失了
  • master突然宕机或重启,新选出来的master的runid和offset都会变化。

run_id是啥

每个redis节点启动时会有个运行id,可以通过info server查看
在这里插入图片描述

redis4.0的PSYNC 2.0方案

优化了【主从切换后runid和offset变化】导致需要全量同步的问题,在主从切换后,仍可以与新的master进行增量同步而不用全量同步。

如何实现?

舍弃了runid,使用replid和replid2

  • 对于master来说,replid就是自己的复制id。没有发生主从切换前,replid2为空。发生主从切换之后,新的 master 的 replid2是旧 master (前一个自己同步的 master) 的 replid,在主从角色切换的时候会用到。
  • 对于slave来说,replid 保存的是自己当前正在同步的 master 的 replid。replid2保存的是旧 master 的 replid,在主从角色切换的时候会用到。
    还有两个偏移量相关的字段:
  • master_repl_offset:当前的复制偏移量
  • second_replid_offset:没有发生主从切换前,second_replid_offset的值为-1;发生主从切换之后,新的master的second_replid_offset为旧master的复制偏移量。

replid和replid2用于判断发生主从切换之后,新的 master 和 slave 曾经属于同一个主库。如果属于同一个主库,可以进行增量同步的尝试。

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

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

相关文章

HCIA-VLAN间通信之路由器

目录 路由信息获取方式: 最佳路由条目选择(根据路由的优先级和开销选择): VLAN间通信 方案1,使用路由器的物理接口来实现不同vlan间的通信 方案2:使用路由器的子接口来实现 路由:指导报文转…

【Vue】二:Vue核心处理---计算属性 监视属性

文章目录 1.计算属性示例2. 监听属性3.补充 1.计算属性示例 实际上计算属性与methods中定义方法基本上没有什么区别,只是计算属性基于响应式依赖缓存,只要数据没有发生改变,计算属性从缓存中取值,只有当数据发送改变,才…

Linux 用户与组群管理

1 用户账户与群组概念 Linux操作系统是多用户多任务的操作系统,允许多个用户同时登录到系统,使 用系统资源。用户账户是用户的身份标识。用户通过用户账户可以登录到系统, 并且访问已经被授权的资源。系统依据账户来区分属于每个用户的文件…

Flutter 笔记 | Flutter 动画

Flutter中的动画抽象 为了方便开发者创建动画,不同的UI系统对动画都进行了一些抽象, Flutter中也对动画进行了抽象,主要涉及 Animation、Curve、Controller、Tween这四个角色,它们一起配合来完成一个完整动画,下面我们…

整数在内存中原来是这样存储的,看完表示头好痒,感觉要长脑子了!

本篇文章来介绍一下整形在内存中的存储,内容丰富,干货慢慢。 目录 1.整形家族 2.整形在内存中的存储 3.大端小端存储 4.练习 1.整形家族 在开始之前,我们先来简单回顾一下整形家族: char unsigned char signed char short u…

chatgpt赋能python:Python补0——让你的数字更规整

Python 补0——让你的数字更规整 在编写代码的过程中,我们经常需要将数字格式化,以便更好地呈现给用户。例如,一个价格可能需要显示为“$100.00”而不是“$100”或“$100.0”。这时候,我们就需要使用 Python 的补0功能。本文将为…

【015】C++的函数详解

C的函数详解 引言一、函数介绍1.1、函数的概述1.2、函数的分类 二、函数定义、声明、调用等2.1、定义函数2.2、函数声明2.3、调用函数2.4、默认参数2.5、函数重载2.6、函数的调用过程 三、函数的传参3.1、普通变量作为函数的参数3.2、数组作为函数的参数 总结 引言 &#x1f4a…

浅浅入门SpringCloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有…

如何在Linux机器中测试存储/磁盘I/O性能?

在Linux环境中,了解存储/磁盘I/O性能对于评估系统性能和优化存储子系统非常重要。通过测试存储/磁盘I/O性能,我们可以确定磁盘的读写速度、延迟和吞吐量等指标。本文将介绍几种常用的方法来测试Linux机器中的存储/磁盘I/O性能。 方法一:使用d…

测试开发工程师必问面试题

1.对测试开发的理解 测试开发首先离不开测试,而软件测试是指,在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 而且,现在不仅仅是通过手工测试来发…

【C++】容器篇(四)—— queue的基本介绍以及模拟实现

前言: 在上期博文中我带大家对stack进行深入的学习,本期我将带领学习的是关于 queue的基本知识,并且还将给大家介绍并实现 priority_queue。接下来,让我们正式本期的内容。 目录 (一)queue的基本介绍 &…

83.响应式设计原则

什么是响应式设计? ● 使网页根据任何可能的屏幕尺寸(窗口或视口尺寸)调整其布局和视觉风格的设计技术。 ● 在实践中,这意味着响应式设计使网站可以在所有设备上使用,如台式电脑、平板电脑和手机。 ● 这是一套做法&…

window安装docker Desktop和wsl2

目录 一、先到微软商店下载terminal (也就是power shell,后续命令都在这个里面执行) 二、安装docker Destop 1.打开控制面板 2.勾选Hyper-V服务 3、根据提示重启电脑,等待更新即可 二.启动Docker Desktop 2.1 报错,提示需要最新的WSL 方式一&#…

阿里云服务器CPU内存怎么选?几核几G合适?

阿里云服务器配置怎么选择?CPU内存、公网带宽和系统盘怎么选择?个人用户选择轻量应用服务器或ECS通用算力型u1云服务器,企业用户选择ECS计算型c7、通用型g7云服务器,阿里云服务器网分享阿里云服务器配置选择方法: 目录…

Day4 计算糖果、进制转换

✨个人主页: 北 海 🎉所属专栏: C/C相关题解 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 选择题1、C函数 编程题1、计算糖果2、进制转换 选择题 1、C函数 题目:下列程序执行后,输出的结果为…

maven依赖选择策略(依赖调解)

这里先抛出结论 最短路径原则: 不同级依赖, 选择路径最短(对于传递性依赖和一级依赖)声明优先原则 : 同级依赖,先声明的覆盖后声明的(对于传递性依赖)同级依赖后加载覆盖先加载原则(不属于传递性依赖的情况&#xff0…

Collections提供的同步包装方法

Java同步容器类是通过synchronized(内置锁)来实现同步的容器,比如Vector、 HashTable以及SynchronizedList等容器。 线程安全的同步容器类主要有: Vector、 Stack、 HashTable等。 Collections提供的同步包装方法 Java提供一组包…

VTK Java项目构建和运行

date: 2019-04-02 10:24:00 VTK Java项目构建和运行 准备工作 本文的运行环境是Ubuntu。在自己建立的VTK build的文件夹(这里名称为VTK-bin,见前文),找到vtk.jar,这里在VTK-bin/lib下。 新建工程 使用JetBrains的I…

【图】概念、存储结构、广度优先遍历遍历、深度优先遍历 - 详解

目录 前言 一、图 1.1、基本概念 二、图的存储结构 2.1、存储结构 2.1、邻接矩阵(考察重点) 2.1.1、代码实现 2.2、邻接表 2.3.1、无向邻接表存储 2.3.2、有向图邻接表存储 3.1、图的广度优先遍历(层序遍历) 3.2、图的…

Wails + Go 实现图形化桌面应用

效果展示 编写一个热点查看程序,包含百度热搜、微博热搜、头条、知乎等,废话不说上效果图: 效果图1: 效果图2 打包大小 涉及技术点 Golang 使用golang 1.9 编写代码 Wails vue3 使用Wails技术实现GUI渲染,页…