Redis中的主从复制

分布式系统中的几种Redis部署方式

为了解决一个程序只部署在一个服务器上的单点问题:

  1. 可用性问题,如果这个机器挂了,就意味着服务就中断了

  2. 一个程序只部署在一台机器上,它的性能/支持的并发量也是有限的

所以,就引入了分布式系统。在分布式系统中,往往希望有多个服务器来部署Redis服务,从而构成一个Redis集群,这样就可以让这个集群给整个分布式系统中的其他服务,提供更稳定/更高效的数据存储功能。

主从模式

在一个集群中,有的是主节点,有的是从节点。从节点的数据要跟随主节点变化,从节点的数据要和主节点保持一致。

本来,在主节点上保存的所有数据,在引入从节点之后,就要把主节点上的数据复制出来,放在从节点中,后续,主节点对于数据有任何的修改,都会把这样的修改同步到从节点上。

从节点就是主节点的副本。

Redis主从模式中,从节点上的数据,不允许修改,只能读取!

对于客户端发来的读取数据的操作,可以在主从节点中的任意一个节点中获取数据;对于写操作,则需要从主节点操作,或者从节点告知主节点进行操作,这样也就提高了性能和并发量。

对于之前的单个Redis服务器节点,如果机器挂了,整个Redis就挂了。但现在可以有多个节点,也可以把这些节点放在不同的机房中,这样就不会出现所有节点同时挂掉的情况。如果挂掉的是某一个从节点,不影响读写操作,如果挂掉的是主节点,则只能进行读操作。一定程度上提高了可用性。

更准确的说,主从模式,主要是针对读操作进行并发量和可用性的提高;对于写操作,无论是可用性还是并发,都非常依赖主节点,而且主节点只能有一个。好在实际业务场景中,读操作往往比写操作更频繁。

主节点上会收到源源不断的修改数据的请求,从节点需要从主节点这里同步这些修改请求。但是,从节点和主节点之间的数据同步,不是瞬间完成的。

每一个从节点中都会有一个offset字段,用来记录同步数据的进度

主从复制中的拓扑结构(若干节点之间,按照什么样的方式进行组织连接):

一主一从

一个主节点连接一个从节点,主节点和从节点都可以处理读数据请求,只有主节点可以处理写数据请求。

如果写数据请求太多,也会给主节点造成压力,这时可以关闭主节点的AOF,只在从节点上开启AOF,让主节点只操作内存中的数据,减少IO操作。

缺点在于,这种模式下,主节点一旦挂了,就不能让他自动重启,因为没有AOF文件,如果自动重启,就会丢失数据,进一步的主从同步,会把从节点的数据也删除掉。

改进办法:主节点挂了之后,让其从从节点获取到AOF文件,再启动。

一主多从

因为实际的开发中,读请求往往远远超过写请求,所以应该适量增加从节点的数量以提高效率

主节点上的数据发生改变,会把改变的数据同时同步给所有从节点。

但是,随着从节点的数量增多,主节点要同步一条数据就需要传输多次,所以往往需要增加主节点的网络带宽,增大了成本。

树形结构

这种结构,不要求主节点有太高的网络带宽,从节点也可以帮助数据同步,但是进行数据修改时,同步的延时更长了。

主从复制流程

数据同步的方法

Redis提供了psync命令,可以完成数据同步的过程。

这个命令不需要手动执行,Redis服务器会在建立好主从同步关系之后,自动执行psync(从节点执行psync,从节点从主节点拉取数据)。

进行数据复制,需要从节点在与主节点建立好复制关系之后,从主节点获取到replication id(复制ID)。这个ID是主节点启动时自动生成的,每个主节点每次重启得到的ID都是不同的。根据这个ID就可以知道当前从节点是从哪个主节点复制的数据(在集群中会有多个主节点)。

每一个节点中都还会有一个offset值,对于主节点,每次有新的修改数据的操作时,都会在这个值原来的基础上增加;对于从节点,每同步一部分主节点中的数据,这个值也会增加,当从节点中的offset值跟主节点中的offset值相等时,就证明数据同步完成。

replication id 和 offset 共同描述了一个“数据集合”

如果有两个机器,replication id 一样,offset 也一样,就可以认为这两个 redis 机器上存储的数据是完全一样的。

psync运行流程:

  1. 从节点发送 psync 命令给主节点,replid 和 offset 的默认值分别是?和-1.

  2. 主节点根据 psync 参数和自身数据情况决定响应结果:

  • 如果回复 +FULLRESYNC replid offset,则从节点需要进行全量复制流程

  • 如果回复 +CONTINUE,从节点进行部分复制流程

  • 如果回复 -ERR,说明Redis主节点版本过低,不支持 psync 命令,从节点可以使用 sync 命令进行全量复制

psync 可以从主节点获取全量数据,也可以获取一部分数据,具体区别于 offset 的进度。

如果 offset 为-1,则获取全量数据;如果是具体的整数,则从当前偏移量位置进行获取部分数据。

复制全量数据会有比较大的消耗,所以一般还是部分数据复制更好,但是如果主节点本身并不适合部分复制,就会仍然给从节点进行全量复制。

较老的版本的Redis不支持psync,可以用sync代替,不过后者会阻塞其他操作,所以不建议使用。

一般什么时候会进行部分复制?

从节点之前已经从主节点上复制过数据了,但因为网络抖动导致从节点重启了,这时需要重新行主节点同步数据,在大部分数据已经同步的情况下,希望只同步一小部分未复制的数据。

全量复制流程

  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 文件。

第四步中,使用 RDB 是因为二进制节省空间,不能使用已有的 RDB 文件,而要重新生成,是因为已有的文件和当前的最新数据可能存在较大差异。

上述由主节点向从节点传送数据使用的是 RDB 文件,要写入文件就要有IO操作,效率就会降低。所以,为了保证效率,Redis 主节点进行全量复制的时候,也支持“无硬盘模式”(diskless),也就是主节点生成的 RDB 的二进制数据,不再直接保存到文件中,而是直接进行网络传输。同样的,从节点也不需要先把接收到的数据写入硬盘,然后再加载,而是直接把收到的数据写入内存。

但是,即使引入了无硬盘模式,整个操作仍然是比较重量级的,比较耗时的,网络传输是无法省去的,所以效率也并没有提升很多。

关于 replication id 和 runid

具有主从关系的节点之间的 replication id 是相同的,但是每个节点的 runid 都是不同的。

runid 主要用于支撑实现 Redis 哨兵的功能,和主从复制没什么关系。而 replication id 在上文中也表明,它主要是用于主从复制。

部分复制流程

  1. 当主从节点之间出现网络中断时,如果超过 repl-timeout 时间,主节点会认为从节点故障并中断复制连接。

  2. 主从连接中断期间主节点依然响应命令,但这些复制命令都因网络中断无法及时发送给从节点,所以暂时将这些命令滞留在复制积压缓冲区(一个基于数组实现的环形队列)中。

  3. 当主从节点网络恢复后,从节点再次连接上主节点。

  4. 从节点将之前保存的 replication 和 offset 作为 psync 的参数发送给主节点,请求进行部分复制。

  5. 主节点接到 psync 请求后,进行必要的验证,随后根据 offset 去复制积压缓冲区查找合适的数据,并响应 +CONTINUE 给从节点。

  6. 主节点将需要从节点同步的数据发送给从节点,最终完成一致性。

上文中提到的“主节点有时候会判定适不适合进行部分复制,不适合的话就进行全量复制”,其实指的是,从节点虽然之前进行过数据复制,但是后续需要复制的数据已经超出积压缓冲区中的数据了,这时只把积压缓冲区中的数据发送给从节点是不够的,所以只能进行全量复制。

实时复制

  • 全量复制:从节点刚连上主节点之后,进行的数据初始化工作。

  • 部分复制:全量复制的特殊情况,优化手段,目的和全量复制一样。

  • 实时复制:从节点已经和主节点同步好了数据,但是之后主节点会源源不断地收到新的修改数据的请求,主节点上的数据就会随之改变,这些数据也同样需要同步给从节点。

实时复制需要主从节点之间建立 TCP 长连接,随后主节点把自己收到的修改数据的请求发送给从节点,从节点再根据这些修改请求修改内存中的数据。

在进行实时复制时,需要保证连接处于可用状态,所采用的是“心跳包”机制。

  • 主节点:默认每隔10秒给从节点发送一个 ping 命令,从节点收到就返回 pong

  • 从节点:默认每隔1秒给主节点发起一个特定的请求,上报当前从节点复制数据的进度(offset)

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

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

相关文章

力扣 240.搜素矩阵II

题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9…

openpose标定中棋盘格检测错误的解决方案

文章目录 1、openpose 棋盘格检测流程2、解决过程3、实测结果1、openpose 棋盘格检测流程 在opencv中通过调用cv::findChessboardCorners()函数,同时指定棋盘格内角点尺寸来检测画面中的棋盘格,结果将以一定顺序来保存结果。通常指定尺寸的两个纬度的值不能相同,例如当指定…

OpenCV 双目相机标定

文章目录 一、简介1.1单目相机标定1.2双目相机标定二、实现代码三、实现效果参考资料一、简介 1.1单目相机标定 与单目相机标定类似,双目标定的目的也是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要…

【STM32】ucOS-III多任务程序

【STM32】uc/OS-III多任务程序 文章目录 【STM32】uc/OS-III多任务程序STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程与相关实验实验任务实验过程一、 uC/OS-III源码下载二、 建立STM32CubeMX工程三、 复制uC/OS-III文件到工程文件夹四、 添加工程组件和头文件路径五、修…

数据结构之计数排序算法【图文详解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

通过网址下载静态网页的仿站工具

下载地址:通过网址下载静态网页的仿站工具 超级实用的一款工具

学习笔记——路由网络基础——直连路由(direct)

二、直连路由(direct) 直连路由(direct):直接相连,接口配置好ip地址并up后自动生成的路由。默认优先级为0 Destination:表示路由的目的地址。用来标识IP包的目的地址或目的网络。 Mask:表示目的地址的子网掩码长度。 与目的地址…

MyBatisPlus总结二

MybatisPlus总结一在这: MybatisPlus总结1/2-CSDN博客 六、分页查询: 6.1.介绍: MybatisPlus内置了分页插件,所以我们只需要配置一个分页拦截器就可以了,由于不同的数据库的分页的方式不一样,例如mysql和…

轻松连接远程服务器SecureCRT for Mac/Windows

SecureCRT是一款功能强大的终端仿真器和文件传输工具,专为网络管理员、开发人员和系统工程师设计。它支持SSH、Telnet、RDP和串口等多种协议,提供安全、高效的远程访问和管理体验。SecureCRT具有多窗口/多标签管理、自定义终端仿真、颜色方案优化等高级功…

Linux内核下网卡硬件 MAC 和PHY分析笔记

1 简介 通常CPU自带的以太网接口是MAC控制器,为了实现完整的功能,外围硬件还需要增加一个PHY芯片。 PHY芯片在建立网络连接时负责协商确定网速、全双工 或者 半双工等。在正常通讯时负责在MAC控制器的MII信号 与 网线中的信号之间做转换。 本文的内核代…

最快的开源UDP传输工具:Kcptun

Kcptun:极速网络隧道,让数据传输飞起来!- 精选真开源,释放新价值。 概览 kcptun 是一个轻量级、高性能的TCP/UDP网络加速工具,由xtaci开发并托管在GitHub上。它通过使用kcp协议,为网络数据传输提供了一个快…

[linux] makefilegdb理解

目录 Linux项目自动化构建工具-make/Makefile 背景 理解 依赖关系 依赖方法 原理 Linux调试器-gdb使用 背景 开始使用 Linux项目自动化构建工具-make/Makefile 背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工…

推荐一款AI音乐生成工具和一款浏览器

大家好,今天给大家带来2款软件,一款是移动浏览器,一款是AI音乐生成软件。 Alook Alook是一款移动端浏览器,它以其独特的无广告、无推送、无新闻的"三无"特性,为用户提供了一个清爽的上网环境。Alook不仅界…

【算法小记】深度学习——时间序列数据分析 Time series Data Analysis

在本篇博客中将简单介绍常见的几种循环神经网络和一维卷积神经网络,并使用一些简答的数据进行拟合分析。本文相对适合刚入门的同学,同时也作为自己过去一段时间学习的总结和记录,现在神经网络框架已经非常完善的支持了很多常见和有效的深度学…

【优选算法】BFS解决FloodFill算法

一、经验总结 什么是FloodFill算法? FloodFill算法是一种用于填充连通区域的算法,通常用于图像处理和计算机图形学中。它从给定的起始点开始,向周围相邻的像素进行扩散填充,直到遇到边界或者其他指定条件停止。 FloodFill算法还…

新买的移动硬盘无法识别

文章目录 背景解决方案 背景 同事新买的移动硬盘,插在电脑上识别不出来盘符,检查了一下,硬盘没问题应该,是ssk的硬盘盒M.2的SSD,硬盘驱动也是正常的,插拔了几次,都不识别,换了太电脑…

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

Mysql使用中的性能优化——批量插入的规模对比

在《Mysql使用中的性能优化——单次插入和批量插入的性能差异》中,我们观察到单次批量插入的数量和耗时呈指数型关系。 这个说明,不是单次批量插入的数量越多越好。本文我们将通过实验测试出本测试案例中最佳的单次批量插入数量。 结论 本案例中约每次…

【云岚到家】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

【YOLO系列】YOLOv1学习(PyTorch)原理加代码

论文网址:https://arxiv.org/pdf/1506.02640 训练集博客链接:目标检测实战篇1——数据集介绍(PASCAL VOC,MS COCO)-CSDN博客 代码文件:在我资源里,但是好像还在审核,大家可以先可以,如果没有的…