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.rhkb.cn/news/344249.html

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

相关文章

型号FM152A,FM148R和利时

型号FM152A,FM148R和利时。控制系统的仿真,综合考虑多方面的因素,本文将用MCGS组态软件设计一个仿真实验监控平台来对其进行实时控制.,完成仿真实验监控平台的设计,型号FM152A,FM148R和利时。最终达到对水箱液位实时监控,实验数据采集,报表的输出和数据的同步显示MC…

PDF分页处理:技术与实践

引言 在数字化办公和学习中,PDF文件因其便携性和格式稳定性而广受欢迎。然而,处理大型PDF文件时,我们经常需要将其拆分成单独的页面,以便于管理和分享。本文将探讨如何使用Python编程语言和一些流行的库来实现PDF文件的分页处理。…

设置电脑定时关机

1.使用快捷键winR 打开运行界面 2.输入cmd ,点击确认,打开命令行窗口,输入 shutdown -s -t 100,回车执行命令,自动关机设置成功 shutdown: 这是主命令,用于执行关闭或重启操作。-s: 这个参数用于指定执行关…

C++ DFS

子集 78. 子集 法一:思路对每个元素进行选与不选的 选择,这样正好到最后一层 就是2的size()次方个,叶子就是节点,通过pos来控制深度 法二:通过for循环实现,且下一个栈帧的i是上一个栈帧当前元素的下一个位…

【上篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。 在本文中,我将与大家分享我在阅读一篇长达 30 页的综合性论文时获得的见解,该论文深入探讨了 YOLO 模型的进步。 这篇评论全面概述了 YOLO 框架的演变过程,…

PDF转图片工具

背景: 今天有个朋友找我:“我有个文件需要更改,但是文档是PDF的,需要你帮我改下内容,你是搞软件的,这个对你应该是轻车熟路了吧,帮我弄弄吧”,听到这话我本想反驳,我是开…

PVE管理虚拟机节点

今天使用PVE命令安装虚拟机。 ‍ 查看所有虚拟机 qm list 查看所有虚拟机 ​​ 创建虚拟机 qm create 创建虚拟机 qm create 106 --name vm-test --memory 2048 --net0 virtio,bridgevmbr0基础配置 这条命令会创建一个 VM,ID 为 106​,名称为 myvm​…

Huawei 大型 WLAN 组网 AC 间漫游

AC1配置命令 <AC6005>display current-configuration # vlan batch 100 # interface Vlanif100description to_S3_CAPWAPip address 10.0.100.254 255.255.255.0 # interface GigabitEthernet0/0/1port link-type trunkport trunk allow-pass vlan 100# ip route-stati…

前端开发高频面试题

好的&#xff0c;以下是对您提出的问题的详细回答&#xff1a; 说说vue动态权限绑定渲染列表&#xff08;权限列表渲染&#xff09; Vue中动态权限绑定渲染列表通常涉及以下步骤&#xff1a; 首先&#xff0c;通过API请求从服务器获取当前用户的权限数据。在Vue组件中&#xff…

UR机器人通信汇总

文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口&#xff08;502端口&#xff09;3.2 Dashboard端口&#xff08;29999端口&#xff09;3.3 上位机编程端口&#xff08;30001/30002/30003端口&#xff09;3.3.1 URS…

vivado HW_BITSTREAM、HW_CFGMEM

HW_比特流 描述 从比特流文件创建的硬件比特流对象hw_bitstream&#xff0c;用于关联 在Vivado的硬件管理器功能中使用硬件设备对象hw_device 设计套件。 比特流文件是从具有write_bitstream的放置和路由设计创建的 命令硬件位流对象是使用 create_hw_bitstream命令&#xff0c…

概率论与数理统计,重要知识点——全部公式总结

二、一维随机变量及其分布 五个分布参考另外一篇文章 四、随机变量的数字特征 大数定理以及中心极限定理 六、数理统计

【iOS】UI——关于UIAlertController类(警告对话框)

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI的警告对话框的学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记…

【数据结构】六种排序实现方法及区分比较

文章目录 前言插入排序希尔排序选择排序堆排序快速排序冒泡排序总结 前言 众所周知&#xff0c;存在许多种排序方法&#xff0c;作为新手&#xff0c;最新接触到的就是冒泡排序&#xff0c;这种排序方法具有较好的教学意义&#xff0c;但是实用意义不高&#xff0c;原因就在于…

用互斥锁解决缓存击穿

我先说一下正常的业务流程&#xff1a;需要查询店铺数据&#xff0c;我们会先从redis中查询&#xff0c;判断是否能命中&#xff0c;若命中说明redis中有需要的数据就直接返回&#xff1b;没有命中就需要去mysql数据库查询&#xff0c;在数据库中查到了就返回数据并把该数据存入…

【Ardiuno】实验使用ESP32连接Wifi(图文)

ESP32最为精华和有特色的地方当然是wifi连接&#xff0c;这里我们就写程序实验一下适使用ESP32主板连接wifi&#xff0c;为了简化实验我们这里只做了连接部分&#xff0c;其他实验在后续再继续。 由于本实验只要在串口监视器中查看结果状态即可&#xff0c;因此电路板上无需连…

FFmpeg播放器的相关概念【1】

播放器框架 相关术语 •容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如mp4、flv、mkv等。 • 媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一段声音数据、一段…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP

【数据结构】初识数据结构之复杂度与链表

【数据结构】初识数据结构之复杂度与链表 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【数据结构】初识数据结构之复杂度与链表前言一.数据结构和算法1.1数据结构1.2算法1.3数据结构和算法的重要性 二.时间与空间…

【计算机毕业设计】基于SSM++jsp的在线医疗服务系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…