Redis主从复制数据同步实现原理详细介绍

文章目录

  • 一、主从复制的概念
  • 二、全量复制(完整重同步)
  • 三、增量复制(部分重同步)
    • 1. 增量复制的核心思想
    • 2. 增量复制的实现
    • 3. 复制偏移量(replicationoffset)
    • 4. 复制积压缓冲区(replicationbacklog)
      • 4.1 缓冲区队列内容
      • 4.2 缓冲区队列更新
      • 4.3 同步方式判断
      • 4.4 缓冲区配置优化
    • 5. 服务器的运行ID(runID)
  • 四、心跳检测
  • 五、关键配置参数
  • 总结

Redis 为保证高可用,提供了主从服务器、集群搭建的方案。这样即使某一个服务器宕机了,Redis 还可以对外提供服务。一般主服务器提供读写功能,从服务器只提供读功能,为保证主从服务器的读一致性,需要将主服务器的数据同步到从服务器。以下是关于主从服务器实现数据同步的详细介绍:

一、主从复制的概念

Redis从2.8版本开始,使用PSYNC命令代替SYNC命令来执行复制时的同步操作。PSYNC指令分两种同步模式:全量复制(完整重同步)增量复制(部分重同步)

Redis 主从服务器在初次连接的时候,会进行一次全量复制,当全量复制完成后会进行增量复制。slave 服务器在数据同步过程中会优先尝试增量复制,如果不满足增量复制条件,则发起全量复制。

以下是Redis 在主从复制时选择两种模式执行的流程:

在这里插入图片描述


二、全量复制(完整重同步)

Redis 全量复制使用PSYNC命令,通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。

以下是Redis全量复制的执行步骤:

  1. 从服务器先判断是否为初次复制:
    • 如果是初次复制,则通知主服务器进行全量复制;
    • 如果不是初次复制,则通知主服务器进行部分复制,但是主服务器判断无法进行部分复制,最后主服务器会自己选择执行全量复制。
  2. 主服务器收到全量复制命令后,执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
  3. 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
  4. 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
  5. 如果从服务器开启了AOF,则会触发bgrewriteaof的执行,从而保证AOF文件更新至主服务器数据库的最新状态。

在这里插入图片描述


三、增量复制(部分重同步)

Redis 增量复制主要目的是解决主从服务器断线重连后的 增量数据,避免全量复制的开销。

1. 增量复制的核心思想

当从服务器在断线后重新连接主服务器时,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。

在这里插入图片描述

2. 增量复制的实现

增量复制同步功能的实现由以下三个部分构成:

  • 主服务器的复制偏移量(replicationoffset)和从服务器的复制偏移量。
  • 主服务器的复制积压缓冲区(replicationbacklog)。
  • 服务器的运行ID(runID)。

3. 复制偏移量(replicationoffset)

执行复制的主服务器和从服务器会分别维护一个复制偏移量:

  • 主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N。
  • 从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量的值加上N。

假设当前主从服务器的复制偏移量的值都为10086,如果这时主服务器向三个从服务器传播长度为33字节的数据,那么主服务器的复制偏移量将更新为10086+33=10119,而三个从服务器在接收到主服务器传播的数据之后,也会将复制偏移量更新为10119。
在这里插入图片描述

主从服务器通过维护复制偏移量,比较复制偏移量的大小,就可以判断主从服务器是否处于一致状态:

  • 如果主从服务器处于一致状态,那么主从服务器两者的偏移量总是相同的。
  • 相反,如果主从服务器两者的偏移量并不相同,那么说明主从服务器并未处于一致状态。

4. 复制积压缓冲区(replicationbacklog)

复制积压缓冲区是由主服务器维护的一个固定长度(fixed-size)先进先出(FIFO)队列,默认大小为1MB。

4.1 缓冲区队列内容

主服务器的复制积压缓冲区里面会保存着一部分最近传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量。
在这里插入图片描述

4.2 缓冲区队列更新

当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区里面。由于队列是固定长度,所以队列内保存的命令在不断的更新。

如果主从服务器断开时间很久,主从服务器的复制偏移量可能会相差很大,从服务器的复制偏移量可能已经不再缓冲区了。

在这里插入图片描述

4.3 同步方式判断

当从服务器重新连上主服务器时,从服务器会通过PSYNC命令将自己的复制偏移量offset发送给主服务器,主服务器会根据这个复制偏移量来决定对从服务器执行何种同步操作:

  • 如果offset偏移量之后的数据(也即是偏移量offset+1开始的数据)仍然存在于复制积压缓冲区里面,那么主服务器将对从服务器执行增量复制操作。
  • 相反,如果offset偏移量之后的数据已经不存在于复制积压缓冲区,那么主服务器将对从服务器执行全量复制操作。

4.4 缓冲区配置优化

Redis为复制积压缓冲区设置的默认大小为1MB,如果主服务器需要执行大量写命令,又或者主从服务器断线后重连接所需的时间比较长,那么这个大小也许并不合适。如果复制积压缓冲区的大小设置得不恰当,那么PSYNC命令的复制重同步模式就不能正常发挥作用,因此,正确估算和设置复制积压缓冲区的大小非常重要。

优化配置复制积压缓冲区大小repl-backlog-size的值,该值最小大小可以根据公式 2*second*writesizeper_second 来计算:

  • second为从服务器断线后重新连接上主服务器所需的平均时间(以秒计算)。
  • write_size_per_second则是主服务器平均每秒产生的写命令数据量(协议格式的写命令的长度总和)。

5. 服务器的运行ID(runID)

除了复制偏移量和复制积压缓冲区之外,实现增量复制还需要用到服务器运行ID(runID):

  • 每个Redis服务器,不论主服务器还是从服务,都会有自己的运行ID。
  • 运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成,例如53b9b28df8042fdc9ab5e3fcbbbabff1d5dce2b3。
  • 当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。
  • 当从服务器断线并重新连上一个主服务器时,从服务器将向当前连接的主服务器发送之前保存的运行ID:
    • 如果从服务器保存的运行ID和当前连接的主服务器的运行ID相同,那么说明从服务器断线之前复制的就是当前连接的这个主服务器,主服务器可以继续尝试执行增量复制操作。
    • 相反地,如果从服务器保存的运行ID和当前连接的主服务器的运行ID并不相同,那么说明从服务器断线之前复制的主服务器并不是当前连接的这个主服务器,主服务器将对从服务器执行全量复制操作。

四、心跳检测

在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:

# replication_offset是从服务器当前的复制偏移量。
REPLCONF ACK <replication_offset>

从服务器发送REPLCONF ACK命令对于主从服务器有三个作用:

  • 检测主从服务器的网络连接状态
    • 如果主服务器超过一秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道主从服务器之间的连接出现问题了。
    • 通过向主服务器发送INFO replication命令,在列出的从服务器列表的lag一栏中,我们可以看到相应从服务器最后一次向主服务器发送REPLCONF ACK命令距离现在过了多少秒。
  • 辅助实现min-slaves选项
    • Redis的min-slaves-to-write和min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令。
    • 比如我们向主服务器设置min-slaves-to-write=3和min-slaves-max-lag=10,那么在从服务器的数量少于3个,或者三个从服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令,这里的延迟值就是上面提到的INFO replication命令的lag值。
  • 检测命令丢失
    • 如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。
    • 注意,主服务器向从服务器补发缺失数据这一操作的原理和增量复制操作的原理非常相似,这两个操作的区别在于,补发缺失数据操作在主从服务器没有断线的情况下执行,而部分重同步操作则在主从服务器断线并重连之后执行。

五、关键配置参数

参数作用推荐值
repl-backlog-size调整复制积压缓冲区大小2 * 网络延迟 * 每秒写入量
repl-diskless-sync启用无盘复制,减少磁盘 I/Oyes(网络良好时)
repl-diskless-sync-delay无盘复制延迟时间(秒)5
client-output-buffer-limit slave限制复制缓冲区大小,防止OOM512mb 128mb 60
repl-timeout复制超时时间60s(需大于repl-ping-replica-period
replica-serve-stale-data断线时是否允许从节点响应读请求no
replicaof <master_ip> <master_port>指定主节点地址

总结

Redis主从复制通过全量复制确保初始一致性,增量复制优化持续同步效率,结合复制积压缓冲区偏移量跟踪机制,实现了高效且可靠的数据同步。合理配置参数和监控网络状态是优化复制性能的关键。

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

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

相关文章

docker 软件bug 误导他人 笔记

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方随便修改安装命令&#xff0c;这个在4.4一下是无法使用的&#xff0c;存在误导他人

Python 进阶(六): Word 基本操作

目录 1. 概述2. 写入 2.1 标题2.2 段落2.3 表格2.4 图片2.5 样式 3. 读取 1. 概述 Word 是一个十分常用的文字处理工具&#xff0c;通常我们都是手动来操作它&#xff0c;本节我们来看一下如何通过 Python 来操作。 Python 提供了 python-docx 库&#xff0c;该库就是为 Wo…

OpenLayers 入门指南【三】:API概要

目录一、官方文档二、核心类三、总结一、官方文档 首页右侧有四个栏目分别是 Docs(文档):也可以理解为使用指南&#xff0c;涵盖一下四个模块 Quick Start(快速入门)&#xff1a;介绍如何快速引入并使用OpenLayers快速构建一个地图应用FAQ(问答)&#xff1a;介绍一些常见问题的…

JAVA面试宝典 -《Kafka 高吞吐量架构实战:原理解析与性能优化全攻略》

&#x1f680; Kafka 高吞吐量架构实战&#xff1a;原理解析与性能优化全攻略 随着大数据技术在日志收集、埋点监控、订单流处理等场景的普及&#xff0c;Kafka 已成为流处理架构中的核心组件。它之所以能在海量数据场景下保持高吞吐、低延迟&#xff0c;源于其在架构层面和底…

把sudo搞坏了怎么修复:报错sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的时候一不小心给/etc目录下所有的文件都所有者给改了&#xff0c;然后使用sudo的时候就出现了下面的问题&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端项目开发1.0.1版本

项目包含用户权限管理、表单提交、数据上传下载、仪表盘可视化等功能&#xff0c;非常适合新手从零开始学习Vue3前端开发&#xff0c;下述包含所有开发源代码&#xff0c;敬请食用 废话少说先上图: 登陆界面: 仪表盘管理系统: 用户管理: 对于普通用户只有仪表盘和个人信息界…

低代码平台能否完全取代传统前端开发

低代码平台不能完全取代传统前端开发&#xff0c;主要原因包括灵活性有限、性能优化能力不足、复杂定制需求难以实现。 低代码平台尽管能快速开发出相对标准化的应用&#xff0c;但在处理复杂、个性化的业务需求时&#xff0c;明显表现出不足。尤其在需要精细化控制UI界面、高性…

Git 中如何比较不同版本之间的差异?常用命令有哪些?

回答重点1&#xff09; git diff <commit1> <commit2> &#xff1a;比较两个指定的提交之间的差异。2&#xff09; git diff <branch1> <branch2> &#xff1a;比较两个分支之间的差异。3&#xff09; git diff <path> &#xff1a;比较工作目录…

MySQL 8.0 OCP 1Z0-908 题目解析(32)

题目125 Choose three. Identify three functions of MySQL Enterprise Monitor. □ A) Analyze query performance. □ B) Start a logical backup. □ C) Determine the availability of monitored MySQL servers. □ D) Centrally manage users. □ E) Start a MySQL Enterp…

Spring处理器和Bean的生命周期

Spring处理器和Bean的生命周期Spring处理器是对Bean对象的的开发可以对BeanDifinition进行操作&#xff0c;例如动态添加、修改BeanDefinition、动态修改Bean。&#xff0c;也可以在Bean对象创建后对Bean对象进行代理增强。注意&#xff1a;对于处理器要又一个正确的认知&#…

Spring Framework源码解析——BeanFactory

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl1. BeanFactory 概述 BeanFactory 是 Spring IoC 容器的最基础接口&#xff0c;它定义了获取、配置和管理 Bean 的核心方法。它是 Spring 框架中容器体系的顶层接口之一&#…

C# 计算梯形面积和周长的程序(Program to calculate area and perimeter of Trapezium)

梯形是至少有一对边平行&#xff0c;其他两条边可以不平行的四边形。平行边称为梯形的底&#xff0c;其他两条边称为梯形的腿。平行边之间的垂直距离称为梯形的高。公式 &#xff1a; 梯形面积&#xff1a; 0.5 * (a b) * h梯形周长&#xff1a; a b c d例子&#xff1a; 输…

【计算机考研(408)- 数据结构】数组和特殊矩阵

数组和特殊矩阵 数组 数组的定义 数组是由n(n>1)个相同类型的数据元素构成的有限序列。每个数据元素称为一个数组元素&#xff0c;每个元素在n个线性关系中的序号称之为该元素的下标&#xff0c;下标的取值范围称为数组的维界。 数组是[[线性表]]的推广&#xff0c;一维数组…

Agent架构与工作原理:理解智能体的核心机制

Agent架构与工作原理&#xff1a;深入理解智能体的核心机制 AI Agent的核心组成部分 一个完整的AI Agent通常由以下几个核心模块组成&#xff1a; 1. 规划模块&#xff08;Planning Module&#xff09; 规划模块是Agent的"大脑"&#xff0c;负责制定行动策略。它接收…

解决vscode中vue格式化后缩进太小的问题,并去除分号 - 设置Vetur tabSize从2到4,设置prettier取消分号semi

效果图 左边原来的&#xff0c;右边是设置后的效果 实现步骤 安装插件 Vetur 安装插件 prettier Vscode > 文件 > 首选项 > 设置 搜索vetur > 找到比较下面的“Vetur > Format > Options: Tab Size” > 设置缩进为4 在附近找到“Vetur > Format: De…

计算机发展史:电子管时代的辉煌与局限

在计算机的发展历程中&#xff0c;电子管时代犹如一颗璀璨的流星&#xff0c;短暂却耀眼。它接过了机械计算装置的接力棒&#xff0c;以电子管为核心元件&#xff0c;开启了计算机的电子化征程&#xff0c;为后续的计算机发展奠定了坚实的基础。这段从 20 世纪 40 年代到 50 年…

div和span区别

区别1区别2App.vue代码 <template><div class"container"><h1>&#x1f3af; DIV 和 SPAN 标签的区别演示</h1><!-- 第一部分&#xff1a;基本区别演示 --><section class"demo-section"><h2>&#x1f4e6; 1. …

channel_up和lane_up

一、channel_up 1.当aurora通道完成初始化&#xff0c;channel准备发送或者接收数据的时候拉高 2.channel_up属于协议的链路层 3.当所有的通道的lane_up都成功拉高&#xff0c;并且完成通道绑定channel bonding,就拉高channel_up二、lane_up 1.lane初始化成功后拉高&#xff1b…

GDPR合规团队协作软件:保障企业数据安全的关键

随着数据隐私问题日益成为全球关注的焦点&#xff0c;GDPR&#xff08;General Data Protection Regulation&#xff0c;通用数据保护条例&#xff09; 的实施成为企业在数据管理中的一项重要法律要求。特别是对于需要在团队之间协作并共享信息的企业来说&#xff0c;选择合规的…

【图像质量评价指标】信噪比(Signal-to-Noise Ratio,SNR)

文章目录一、基本定义二、判断图像信噪比是否过低&#xff08;经验值&#xff0c;仅供参考&#xff09;三、SNR与图像质量指标关系四、评估方法 代码复现 —— 评估一张图像的信噪比&#xff08;1&#xff09;有参考图像&#xff08;推荐&#xff09;&#xff08;2&#xff09…