Redis - 主从复制

news2024/11/15 20:44:05

文章目录

目录

文章目录

前言 

1. 配置

建立复制

断开复制

传输延时

2. 主从拓扑结构

一主一从

一主多从

树状

三. 原理

数据同步 psync

replicationid/replid(复制id)

master_replid 和 master_replid2

offset (偏移量)

psync 运行流程

全量复制

部分复制

实时复制

总结


前言 

在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满足故障恢 复和负载均衡等需求。Redis 也是如此,它为我们提供了复制的功能,实现了相同数据的多个 Redis 副本。复制功能是高可用 Redis 的基础,哨兵和集群都是在复制的基础上构建的。

1. 配置

建立复制

参与复制的 Redis 实例划分为主节点(master)和从节点(slave)。每个从结点只能有⼀个主节点, 而一个主节点可以同时具有多个从结点。复制的数据流是单向的,只能由主节点到从节点。配置复制 的方式有以下三种:

  • 1. 在配置文件中加入 slaveof {masterHost} {masterPort} 随 Redis 启动生效。
  • 2. 在 redis-server 启动命令时加入 --slaveof {masterHost} {masterPort} 生效。
  • 3. 直接使用 redis 命令:slaveof {masterHost} {masterPort}生效

修改配置主要是修改从机的配置. 主机配置不变 

第一步: 拷贝一份主节点配置文件给从节点, 并命名为 redis-slave.conf

第二步: 编辑配置文件,修改其 daemonize 为 yes。 

第三步: 通过redis-server指定配置文件 启动redis主节点和从节点  通过参数slaveof 配置该从节点归属的主节点

第四步: 启动redis客户端,观察主从关系

从运行结果中看到复制已经工作了,针对主节点 6379 的任何修改都可以同步到从节点 6380 中,复制 过程如图所示。

 

可以通过 info replication 命令查看复制相关状态。

主节点

role:master  #当前节点
connected_slaves:1 #从节点个数
slave0:ip=127.0.0.1,port=6380,state=online,offset=856,lag=0 #具体的一个从节点信息
master_replid:bdbc3e2ea45bb93bae7a5062892e3018b3e1d7dc #标识当前节点的id
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:856
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:856

从节点

role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:898
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:bdbc3e2ea45bb93bae7a5062892e3018b3e1d7dc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:898
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:898

断开复制

slaveof 命令不但可以建立复制,还可以在从节点执行 slaveof no one 来断开与主节点复制关系。 例如在 6380 节点上执行 slaveof no one 来断开复制。

断开复制主要流程:

1)断开与主节点复制关系。

2)从节点晋升为主节点。

从节点断开复制后并不会抛弃原有数据,只是无法再获取主节点上的数据变化。

传输延时

主从节点一般部署在不同机器上,复制时的网络延迟就成为需要考虑的问题,Redis 为我们提供 了 repl-disable-tcp-nodelay 参数用于控制是否关闭 TCP_NODELAY,默认为 no,即开启 tcpnodelay 功能,说明如下: 

  • 当关闭时,主节点产生的命令数据无论大小都会及时地发送给从节点,这样主从之间延迟会变小, 但增加了网络带宽的消耗。适用于主从之间的网络环境良好的场景,如同机房部署。
  • 当开启时,主节点会合并较小的 TCP 数据包从而节省带宽。默认发送时间间隔取决于 Linux 的内 核,一般默认为 40 毫秒。这种配置节省了带宽但增大主从之间的延迟。适用于主从网络环境复杂 的场景,如跨机房部署

2. 主从拓扑结构

Redis 的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性可以分为以下三种:一主一 从、一主多从、树状主从结构。

一主一从

一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持。当应用写命令并发量较高且需要持久化时,可以只在从节点上开启 AOF,这样既可以保证数据 安全性同时也避免了持久化对主节点的性能⼲扰。但需要注意的是,当主节点关闭持久化功能时,如果主节点宕机要避免自动重启操作。

一主多从

一主多从结构(星形结构)使得应用端可以利用多个从节点实现读写分离。对于 读比重较大的场景,可以把读命令负载均衡到不同的从节点上来分担压力。同时一些耗时的读命令可以指定一台专门的从节点执行,避免破坏整体的稳定性。对于写并发量较高的场景,多个从节点会导致主节点写命令的多次发送从而加重主节点的负载

树状

树形主从结构(分层结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主 节点继续向下层复制。通过引入复制中间层,可以有效降低住系统按负载和需要传送给从节点的数据量。数据写入节点 A 之后会同步给 B 和 C 节点,B 节点进一步把数据同步给 D 和 E 节 点。当主节点需要挂载等多个从节点时为了避免对主节点的性能干扰,可以采用这种拓扑结构。

三. 原理

 复制过程流程图

数据同步 psync

Redis 使用 psync 命令完成主从数据同步,同步过程分为:全量复制和部分复制。

  • 全量复制:一般用于初次复制场景,Redis 早期支持的复制功能只有全量复制,它会把主节点全部 数据一次性发送给从节点,当数据量较大时,会对主从节点和网络造成很大的开销。
  • 部分复制:用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发数据给从节点。因为补发的数据远小于全量数据,可以有效避 免全量复制的过高开销。

PSYNC 的语法格式

PSYNC replicationid offset
# 如果 replicationid 设为 ? 并且 offset 设为 -1 此时就是在尝试进⾏全量复制.
# 如果 replicationid offset 设为了具体的数值, 则是尝试进⾏部分复制.

replicationid/replid(复制id)

主节点的复制 id. 主节点重新启动, 或者从节点晋级成主节点, 都会生成一个 replicationid. (同一个节点, 每次重启生成的 replicationid 也会变化). 从节点在和主节点建立连接之后, 就会获取到主节点的 replicationid.

master_replid 和 master_replid2

master_replid2保留上一个主节点的id(如果有的话),可以根据这个id找回上一个主节点

offset (偏移量)

参与复制的主从节点都会维护自身复制偏移量。主节点(master)在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info replication 中的 master_repl_offset 指标中。

psync 运行流程

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

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

  • 如果回复 +FULLRESYNC replid offset,则从节点需要进行全量复制流程。
  • 如果回复 +CONTINEU,从节点进行部分复制流程。
  • 如果回复 -ERR,说明 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 文件。

我们会发现全量复制是一件高成本的操作:主节点 bgsave 的时间, RDB 在网络传输的时间,从节点清空旧数据的时间,从节点加载 RDB 的时间等。所以一般应该尽可能 避免对已经有大量数据集的 Redis 进行全量复制。

部分复制

部分复制主要是 Redis 针对全量复制的过高开销做出的⼀种优化措施,使用psync replicationId offset 命令实现。当从节点正在复制主节点时,如果出现网络闪断或者命令丢失等异常情况时,从节点 会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区存在数据则直接发送给从节点, 这样就可以保持主从节点复制的一致性。补发的这部分数据⼀般远远小于全量数据,所以开销很小。 整体流程如图所示。

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

2)主从连接中断期间主节点依然响应命令,但这些复制命令都因网络中断无法及时发送给从节点,所以暂时将这些命令滞留在复制积压缓冲区中。

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

4)从节点将之前保存的 replicationId 和 复制偏移量作为 psync 的参数发送给主节点,请求进行部分复制。

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

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

复制积压缓冲区

复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为 1MB,当主节点有连接的从节点(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区中。

实时复制

主从节点在建立复制连接后,主节点会把自己收到的修改操作 , 通过 tcp 长连接的方式, 源源不断的传输给从节点. 从节点就会根据这些请求来同时修改自身的数据. 从而保持和主节点数据的一致性。

另外, 这样的长连接, 需要通过心跳包的方式来维护连接状态. (这里的心跳是指应用层自己实现的心跳, 而不是 TCP 自带的心跳)

1)主从节点彼此都有心跳检测机制,各自模拟成对方的客户端进行通信。

2)主节点默认每隔 10 秒对从节点发送 ping 命令,判断从节点的存活性和连接状态。

3)从节点默认每隔 1 秒向主节点发送 replconf ack {offset} 命令,给主节点上报自身当前的复制偏移量。

如果主节点发现从节点通信延迟超过 repl-timeout 配置的值(默认 60 秒),则判定从节点下线,断 开复制客户端连接。从节点恢复连接后,心跳机制继续进行。


总结

以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

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

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

相关文章

算法进阶 | 必知!5大深度生成模型!

本文来源公众号“算法进阶”,仅用于学术分享,侵权删,干货满满。 原文链接:必知!5大深度生成模型! 随着Sora、diffusion、GPT等模型的大火,深度生成模型又成为了大家的焦点。 深度生成模型是一…

【简历】25届南京某一本JAVA简历:简历通过率还好,但是拿不到OFFER

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 今天看一份25届南京某一本大学的Java简历。 这个简历呢,学校是一本。我们说上来先要定校招层次,这个层次就按照…

D35XT120-ASEMI新能源专用D35XT120

编辑:ll D35XT120-ASEMI新能源专用D35XT120 型号:D35XT120 品牌:ASEMI 封装:DXT-5 批号:2024 现货:50000 正向电流(Id):35A 反向耐压(VRRM&#xff0…

dubbo是什么?,能做什么?以及其工作流程

1.Dubbo是什么?能做什么? Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式服务框架,现已成为Apache基金会孵化项目,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 简单来说,dubbo…

通义灵码怎么样?分为哪些版本,看看基础能力多少分?

通义灵码,是一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云的云服务使用场景调优,助力开发者高…

【计算机组成原理】计算机系统层次结构

计算机系统层次结构 计算机系统是一个层次结构系统,每一层都通过向上层用户提供一个抽象的简洁接口而将低层的实现细节隐藏起来。计算机解决应用问题的过程就是不同抽象层进行转换的过程 计算机系统抽象层的转换 下图描述了从最终用户希望计算机完成的应用(问题)…

Java重修笔记 第四十九天 Collections 工具类

Collections 工具类 1. public static void reverse(List<?> list) 反转集合中元素的顺序 2. public static void shuffle(List<?> list) 将集合里的元素顺序打乱 3. public static <T extends Comparable<? super T>> void sort(List<T>…

Java项目: 基于SpringBoot+mysql企业客户管理系统(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql企业客户管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

工业相机飞拍的原理及工作原理

工业相机飞拍&#xff08;或称为工业高速相机飞行拍摄&#xff09;是一种利用高速图像捕捉技术和精密运动控制系统进行高效图像采集的先进技术。它广泛应用于工业检测、质量控制和自动化生产等领域。本文将详细探讨工业相机飞拍的原理及其工作方式。 一、工业相机飞拍的基本概…

【深度学习】卷积神经网络与 LeNet

在 softmax 回归中&#xff0c;我们使用的数据集是图像数据。这种数据的每个样本都是由一个二维像素网格组成&#xff0c;每个像素可能是一个或多个数值&#xff0c;取决于是黑白还是彩色图像。 我们之前的处理方式是通过“展平”&#xff0c;用一个标量表示一个像素&#xff…

electron 客户端 windows linux(麒麟V10)多系统离线打包 最新版 <一>

electron客户端下载、构建、打包在国内网络情况下&#xff0c;绝对不是什么易事。更不要说离线干活&#xff0c;更是难上加难。 这一篇主要讲下windows离线环境下&#xff0c;如何完成electron的下载打包。咱废话不多说&#xff0c;直接上干货。注意&#xff0c;我的大前提是完…

Nacos部分漏洞2 附POC

@[toc] Nacos部分漏洞2 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Nacos简介 微信公…

蓝牙耳机性价比高的有哪些?年度4大高性价比热款推荐

在过去的一年里&#xff0c;市场上涌现了许多具有出色性能且价格相对亲民的蓝牙耳机&#xff0c;它们在音质、稳定性、续航能力等核心性能上表现出色&#xff0c;同时在用户最关心的价格上也展现出了极大的吸引力&#xff0c;蓝牙耳机性价比高的有哪些&#xff1f;为了帮助大家…

并发工具类(三):Semaphore

1、Semaphore介绍 Semaphore&#xff08;信号量&#xff09;也是juc包下一个线程同步工具&#xff0c;主要用于 在一个时刻允许多个线程 对共享资源进行并行操作的场景。通常情况下&#xff0c;使用 Semaphore 的过程实际上是多个线程 访问共享资源获取许可证的过程。 Semaphor…

SpringBoot中使用log遇到的一些问题

1、springboot logger.level与<logger>优先级&#xff1f; 百度结果如下&#xff1a; 所以得出结论&#xff0c;如果在yml种配置&#xff1a; logging:level:com.ruoyi: debugorg.springframework: warn 同时在logback-spring.xml中配置了 <!-- 系统模块日志级别控…

【无损检测】基于用深度学习的工业超声B-Scan 图像中的焊缝缺陷

Automated Weld Defect Detection in Industrial Ultrasonic B-Scan Images Using Deep Learning Abstract: 自动超声波检测&#xff08;AUT&#xff09;是一种无损检测&#xff08;NDT&#xff09;方法&#xff0c;广泛应用于具有重要经济意义的行业。为了确保对独有的 AUT 数…

数据结构与算法(3)栈和队列

1.前言 哈喽大家好啊&#xff0c;今天博主继续为大家带来数据结构与算法的学习笔记&#xff0c;今天是关于栈和队列&#xff0c;未来博主会将上一章《顺序表与链表》以及本章《栈与队列》做专门的习题应用专题讲解&#xff0c;都会很有内容含量 &#xff0c;欢迎大家多多支持&…

Facebook 小店:不出单?没流量?如何解决?

Facebook Marketplace为用户提供一个在本地交易商品的平台&#xff0c;包括二手商品、房屋出租和家政服务等都可以在上面检索到相关信息。据数据统计&#xff0c;每月约有4亿人使用Facebook Marketplace功能&#xff0c;潜力巨大&#xff0c;为商家提供了广阔的商机。然而&…

笔记 14 : 彭老师课本第 8 章, UART : 寄存器介绍 ,

&#xff08;99&#xff09; 继续介绍 uart 的关于通道的 一整套 寄存器&#xff0c; UCON 等&#xff1a; 接着介绍寄存器 UTRSTAT &#xff1a; 接着介绍读写数据的寄存器&#xff1a; 设置 uart 的波特率&#xff0c;有关的寄存器&#xff1a; &#xff08;100&#xf…

【Linux】进程优先级|进程切换

目录 进程优先级 1️⃣ 进程优先级 1.什么是进程优先级&#xff1f; 2.进程优先级的类型 3.进程优先级的作用 4.进程优先级的实现 5.进程优先级的重要性 6.查看系统进程 7.修改进程优先级 top命令进行修改 renice命令 8.优先级调度原理​编辑 进程切换 进程优先级…