[Redis#17] 主从复制 | 拓扑结构 | 复制原理 | 数据同步 | psync

目录

主从模式

主从复制作用

建立主从复制

主节点信息

从节点信息

断开主从复制关系

主从拓扑结构

主从复制原理

1. 复制过程

2. 数据同步(PSYNC)

3. 三种复制方式

一、全量复制

二、部分复制

三、实时复制

四、主从复制模式存在的问题


在非分布式系统中,即仅有一个主机提供服务时,如果该主机发生故障,整个服务将会崩溃。这种情况被称为单点问题,它不仅影响了系统的可用性,还限制了系统的并发处理能力。

为了解决单点问题并提高服务的并发处理能力,可以引入分布式系统。通过多个主机共同完成一个服务:

  • 提升并发能力:多台服务器分担负载,支持更大数量的客户端请求。
  • 避免单点故障:即使一台服务器出现故障,其他服务器仍能继续提供服务,确保业务连续性。

主从模式

在分布式系统中,Redis通常采用以下三种部署模式之一:

  • 主从模式
    • 定义:包含一个主服务器(Master)和多个从服务器(Slave)。所有写操作都在主服务器上执行,而读操作可以在从服务器上分散进行。
    • 数据一致性:从服务器的数据是从主服务器复制而来,且不允许直接修改,以保证数据的一致性和完整性。
    • 工作原理写入操作集中在主节点,查询操作则被分配到从节点,确保主节点的数据是最新的,同时减轻其负载。
  • 主从 + 哨兵模式
    • 概述:在主从模式基础上加入了哨兵(Sentinel)组件,用于监控集群健康状况,并在主节点故障时自动选择一个新的主节点。
    • 功能:提供了自动化的故障检测与恢复机制,减少了人工干预的需求。
  • 集群模式
    • 特点:允许多个Redis实例协同工作,形成一个逻辑上的大型数据库,支持水平扩展。
    • 适用场景:适合需要 更大存储容量或更高性能的应用环境。

本博客将 重点讲解 Redis的主从模式,包括其工作原理、优势以及如何帮助解决单点问题,从而提高了服务的可靠性和性能。

  • 本章节相关操作不需要记忆,后续如果用到了能查到即可。
  • 重点是理解主从复制的流程和原理。
主从复制作用
  • 解决单点问题,通过数据复制多个副本部署到其他服务器,满足 故障恢复和负载均衡 等需求。
  • 复制功能 是高可用Redis的基础,哨兵和集群 都是在复制的基础上构建的。
  • 从节点上的数据要跟随主节点变化,从节点的数据要和主节点保持一致
    • 主从模式,从 要是针对"读操作",进行并发量和可用性的提高
    • 写操作,无论是可用性还是并发量,都非常依赖主节点,主节点不能搞多个
建立主从复制
  • 参与复制的Redis实例划分为主节点(master)和从节点(slave)
    • 每个从结点只能有⼀个主节点,⽽⼀个主节点可以同时具有多个从结点
    • 复制的数据流是单向的,只能由主节点到从节点。

配置:

大部分人手上都只有一台主机或者云服务器,此时想要打造一个分布式系统就需要用一些其他技巧,而不是真的在多个主机上部署分布式。

  • 其实在一台主机上,是可以允许多个redis-server进程的,只要保证 每个进程的端口号不同,那么就可以有多个redis-server存在。
  • 创建从节点的配置文件:

  • 找到port选项:默认的端口号是6379,此端口号修改为其它端口,不要与主节点冲突。
  • 找到daemon选项,保证该选项是yes,这样Redis才能在后台运行。

修改这两个配置文件后启动

启动后通过ps查看,可以看到同时有三个Redis在运行:

绑定的三个端口分别是:637963806381

启动不同的客户端

此时三个节点是单独的三个服务,还没有构成主从结构。

配置主从需要通过slaveof,有以下三种方式:

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

此处通过修改配置文件完成主从配置,因为其是持久的,后两种方式在每车次启动时都要输入额外的命令。

在两个slave.conf shift+g 到最末尾加上以下内容

kill -9 后,重启服务器,查看网络情况

可以发现,除了三个redis-server,还有很多其它的redis网络连接,这是因为主从之间,要进行数据传输,所以要创建额外的网络连接。

测试一下:

左侧端口为6379主节点,右侧为6380从节点,主节点设置key1 123,从节点可以get得到,但是当从节点试图写入数据,发生报错,表示不允许修改数据。

  • 只读模式:默认情况下,从节点配置为只读模式(slave-read-only=yes),以防止数据不一致。

在主节点和从节点之间的TCP网络连接中,默认启用了Nagle算法:旨在通过合并较小的TCP数据包来减少传输的数据包数量,从而节省带宽。然而,这可能会增加TCP的传输延迟。反之,关闭Nagle算法可以减少传输延迟但会增加网络带宽的使用。

  • 默认状态:Nagle算法默认是开启的(repl-disable-tcp-nodelay 设置为 no)。
  • 关闭Nagle算法:可以通过设置 repl-disable-tcp-nodelay yes关闭Nagle算法,以减少传输延迟。这种调整适用于主从节点间网络环境良好、低延迟的情况,例如同机房部署;而在跨机房等复杂网络环境中,则可能需要保持Nagle算法开启以优化带宽使用。

info replication可以查看主从相关的信息。

主节点信息

  • role:表示当前节点为主节点
  • connected_slaves:当前有两个从节点
  • slave0:第一个从节点的相关信息,
    • ip:地址
    • port:端口
    • state:状态
  • master_replid:标识主节点的身份ID。
  • master_replid2:用于在 网络抖动情况下 启用,记录 旧主节点的复制ID,以便后续重新连接。
  • offset=475:表示当前从节点复制到的位置,即 偏移量。
  • repl_backlog开头的字段:描述了 积压缓冲区 的状态,支持部分同步机制。
从节点信息

  • master_xxx:主节点的一些信息
  • slave_priority一个优先级,如果主节点崩溃了,会从新选主节点,与该优先级有关
  • master_replid:主节点的id
  • connected_slaves:表明当前节点下连接的从节点数量,若无则显示0。

这些内容也不需要记忆,可以去官网查询,官方文档有很详细的解释。

redis_info commands

断开主从复制关系
  • 指令:可以在从节点中输入 SLAVEOF NO ONE 指令用来断开现有的所有主从复制关系。
  • 效果:从节点断开主从关系后,不再隶属于其他节点,但内部已有的数据不会被抛弃。当前断开的从节点 会晋升为主节点

我们可以尝试来实现一下 这个“认贼作父”的过程

实现:

此处通过slaveof重新将6380设置为了6381的主节点。

不论是salveof,还是slaveof no one,都是临时修改主从关系,一旦服务重启,仍然依照配置文件设置主从关系。


主从拓扑结构

拓扑结构:若干个节点之间,按照什么样的方式来进行组织连接

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

1. 一主一从拓扑

  • 特点:最简单的拓扑结构。
  • 优化:可以通过 关闭主节点的AOF,只在从节点上开启AOF来减少主节点的压力。
  • 缺陷及改进:一旦主节点宕机,需要让主节点从从节点获取AOF文件再重启,以防止数据丢失和同步问题。

注意:这种方式要 关闭主节点的自动重启功能,因为主节点使用RDB持久化,此时数据往往不是最新的。一旦主节点重启,那么就会通过RDB恢复数据,导致主节点得到旧数据。而这个旧数据又会同步给从节点,此时从节点的AOF新数据就被旧数据覆盖了

2. 一主多从拓扑

  • 适用场景:适用于读数据比重较大的场景,可以将 读命令负载均衡 到不同的从节点上来分担压力。
  • 缺点:不适用于写数据比重较大的场景,因为随着从节点个数增加,主节点的网络传输压力也会增大。

3. 树形拓扑

  • 特点:从节点不仅可以复制主节点数据,还可以作为其他从节点的主节点继续向下层复制。
  • 优势:相比一主多从结构,可以减少主节点网络传输压力,不需要那么高的网卡带宽。
  • 缺点:数据修改后的 同步延时更长。


主从复制原理

1. 复制过程

  • 保存信息:首先保存主节点的信息,包括IP和端口。
  • 建立连接:之后 建立主从节点之间的TCP连接(经历三次握手)。
  • 验证连接:给主节点发送PING命令,验证其是否正常工作。
  • 数据同步:包括全量同步(首次连接时同步所有数据)和命令持续复制(增量同步,后续每一步操作都进行同步)。

在整个主从同步的过程中,最后两步分别是 同步数据集持续复制命令,是复制数据的关键步骤

和后面讲的 三种同步机制之间:

同步数据集:

  • 如果是第一次同步,触发 全量同步
  • 如果是断线重连,触发 部分同步

持续复制命令:

  • 进行 实时同步

2. 数据同步(PSYNC

Redis 提供了 PSYNC 命令来完成数据同步的过程。PSYNC 指令一般不需要我们手动执行,Redis 服务器会在建立好主从同步关系之后自动执行 PSYNC

其语法格式为 PSYNC replicationid offset

  • replicationid
    • 表示的是主节点的复制ID。这个ID是主节点启动时生成的,每次主节点重启后生成的 replicationid 都是不一样的。或者是在从节点和主节点断开之后,从节点晋升为主节点时也会生成新的 replicationid
    • 这个参数实际上就是我们之前通过 info replication 查询出来的 master_replid。一旦从节点与主节点建立了复制关系,它就会从主节点这边获取到 replicationid
  • offset
    • 这个参数是主节点和从节点上都会维护的数据偏移量,它是一个整数。
    • 主节点上会收到很多修改操作的命令,每个命令都要占据一定的字节数。主节点会把这些修改命令中的数据的字节数进行累加,得到主节点的 offset
    • 从节点的偏移量描述的是当前从节点在从主节点同步数据时同步到了哪里。从节点每秒钟都会上报自身的复制偏移量给主节点。

replidoffset 共同确定一个唯一的数据集

关于 PSYNC 的工作方式:

  • PSYNC 可以从主节点中获取全量数据,也可以获取一部分数据,这主要取决于 offset 的进度。如果 offset 设置为 -1,则表示获取全量数据;如果 offset 设置为具体的整数值,则表示从当前的偏移量开始进行获取。

当输入psync后,可能得到以下三种结果:

  1. +FULLRSYNC replid offset:进行全量复制
  2. +CONTINUE:进行部分复制
  3. -ERR:说明主节点不支持psync,此时可以使用sync

此处sync是在前台运行的命令,一旦执行sync,主节点的所有命令都会被阻塞。

注意:

在获取数据时,并不是从节点请求哪部分数据,主节点就提供哪部分数据。

  • 主节点会自行判定当前是否方便提供部分数据,若不方便,则只能提供全量数据。
  • 从节点申请进行全量复制,此时主节点无法承受这么多网络压力,那么可能就会变成部分复制。

3. 三种复制方式

一、全量复制

触发条件首次与主节点进行数据同步时,或在主节点不方便进行部分复制的情况下,从节点会进行全量复制。此时的 replicationidoffset 分别是未知和 -1

流程

  1. 发起同步:从节点发送 PSYNC 命令给主节点进行数据同步,由于初次复制,从节点没有主节点的运行ID和offset,因此默认执行全量复制。
  2. 响应确认:主节点根据命令解析出要进行全量复制,并回复 +FULLRESYNC 响应。
  3. 保存信息:从节点接收并 保存主节点的运行信息(eg. id...)
  4. 持久化快照:主节点执行 BGSAVE 进行 RDB 文件的持久化。
  5. 传输快照:主节点将生成的 RDB 文件发送给从节点,从节点保存该文件到本地磁盘。
  6. 补发增量:主节点将从生成 RDB 文件到接收完成期间执行的写命令的数据写入缓冲区,等从节点保存完 RDB 文件之后,再将缓冲区内的数据补发。
  7. 清理旧数据:从节点清空自身原有的旧数据。
  8. 加载新数据:从节点 加载 RDB 文件以获得与主节点一致的数据(5+6)
  9. 持久化操作:如果从节点开启了 AOF 持久化,则会进行重写操作;如果没有开启,则全量化复制完成。

无硬盘模式支持

  • 主节点在进行全量复制时也支持“无硬盘模式”,即主节点生成的 RDB 二进制数据直接通过网络传输给从节点,无需先保存到文件中。
  • 从节点也可以省略把收到的数据写入硬盘的过程,直接加载。这虽然节省了读写硬盘的操作,但网络传输消耗不可避免。
二、部分复制

适用场景:当从节点已经持有主节点绝大部分的数据时,为了减少开销,可以进行部分复制。例如在网络抖动后重新建立连接时,只需同步中断期间的数据变化即可。

流程

  1. 超时判定:当主节点和从节点出现网络中断超过 repl-timeout 时间,主节点会认为从节点故障。
  2. 命令滞留:中断期间,主节点继续响应命令,但由于网络问题无法及时发送给从节点,这些命令被暂时滞留在 积压缓冲区。
  3. 主节点与从结点网络恢复.
  4. 从节点将之前保存的 replicationid 和复制偏移量作为 PSYNC 参数发送给主节点,请求部分复制。
  5. 验证与查找:主节点接收到 PSYNC 请求后,进行必要的验证,随后根据offset区复制积压缓冲区查找合适的数据,并响应+CONTINUE给从节点.
  6. 数据同步:主节点将所需同步的数据发送给从节点,最终完成一致性。

在第5步的时候,验证的步骤具体是什么呢?

  • 首先验证 replicationid 是否一致。如果不一致,则进行全量复制;
  • 如果一致,则进一步判断 offset 是否存在于积压缓冲区中。若存在,则可以进行部分复制;否则需要全量复制。
  • [ 这里是一个非常经典的验证思想 ]
三、实时复制
  • 描述:主从节点在建立复制连接后,主节点会把自己收到的修改操作,通过 TCP 长连接的方式,源源不断的传输给从节点,从节点就会根据这些请求来同时修改自身的数据,保持从节点和主节点数据的一致性。
  • 机制:从节点和主节点之间维持一个TCP长连接,主节点通过此连接将收到的修改数据请求发送给从节点。为确保网络连接可用,引入了 心跳包机制——主节点 每隔10秒 给从节点发送一个 PING 命令,从节点接收到后返回 PONG;同时,从节点每秒向主节点上报当前复制进度(offset)。

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

四、主从复制模式存在的问题
  • 核心挑战:最大的问题在于主节点上。如果主节点意外宕机,从节点虽能继续提供读操作,但不会自动升级为主节点(除非通过 SLAVEOF NO ONE 断开)。这时就需要程序员手动恢复主节点,或者引入哨兵模式来实现自动故障转移。

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

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

相关文章

【Unity高级】如何动态调整物体透明度

本文介绍了如何设置及动态调整物体的透明度。 一、手动设置的方法 我们先来看下如何手动设置物体的透明度。 物体的透明与否是通过材质来设置的。只有我们把具有透明度的材质指给物体的渲染器(Render),物体就被设置成相应的透明度了。 看一…

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…

通俗易懂理解:网络安全恶意节点的检测与哨兵节点的激活【论文+代码】

以下资料参考来自本文末尾的参考资料与代码: 在网络安全中,恶意节点检测和哨兵节点激活是确保网络稳定性、可靠性和安全性的关键技术,尤其是在分布式系统、物联网 (IoT)、区块链网络等环境中。下面将详细介绍这两个概念及其应用。 一、恶意…

python作业

1.D 2.B 3.D 4.C 5.B 6.D 7.D 8.B 9.D 10. A 11.D 12.C 13.√ 14.√ 16.√ 17.√ 18.None 19.([1,3],[2]) 20. 列表思维导图

Redis(上)

Redis 基础 什么是 Redis? Redis (REmote DIctionary Server)是一个基于 C 语言开发的开源 NoSQL 数据库(BSD 许可)。与传统数据库不同的是,Redis 的数据是保存在内存中的(内存数据库&#xf…

LabVIEW气缸摩擦力测试系统

基于LabVIEW的气缸摩擦力测试系统实现了气缸在不同工作状态下摩擦力的快速、准确测试。系统由硬件平台和软件两大部分组成,具有高自动化、精确测量和用户友好等特点,可广泛应用于精密机械和自动化领域。 ​ 项目背景: 气缸作为舵机关键部件…

CentOS7.X 安装RustDesk自建服务器实现远程桌面控制

参照文章CentOS安装RustDesk自建服务器中间总有几个位置出错,经实践做个记录防止遗忘 一 环境&工具准备 1.1 阿里云轻量服务器、Centos7系统、目前最高1.1.11版本rustdesk-server-linux-amd64.zip 1.2 阿里云轻量服务器–安全组–开放端口:TCP(21…

工具篇:IDEA VFS 损害启动报错 com.intellij.util.io.CorruptedException 处理

文章目录 前言一、 idea 的 VFS是什么?二、解决方式:2.1 退出Idea 然后重新打开:2.2 手动清除Idea 缓存,让Idea 重新建立缓存:2.2.1 打开 Invalidate Caches / Restart 对话框:2.2.2 勾选要清除的缓存: 总结…

2.linux中调度kettle

一.准备转换,等会在linux中用 1.添加excel输入组件,并添加对应的文件 2.添加列拆分为多行组件 3.添加文本文件输出组件 4.保存转换 二.linux安装java 1.把jdk-8u144-linux-x64.tar.gz上传到linux的/lx目录下 2. 解压jdk包,然后配置环境变量…

第四节、电机定角度转动【51单片机-TB6600驱动器-步进电机教程】

摘要:本节介绍用电机转动角度计算步骤,从而控制步进电机转角 一、 计算过程 1.1 驱动器接收一个脉冲后,步进电机转动一步,根据驱动器设置的细分值 计算一个脉冲对应电机转动的角度step_x s t e p x s t e p X … … ① step_{x…

如何终身使用 100% 免费的服务器

作为开发人员,我们需要在云服务上运行和托管后端。有许多 BaaS(后端即服务)可用,但它们有一些限制。 如果我说我已经免费使用基于 Linux 的服务器超过 4-5 年了,那会怎样?是的,你没听错。我正在使用这台安装了 Ubuntu 20、24 GB RAM、4 个 CPU 和 200 GB 存储空间的 Lin…

【计算机组成原理】期末复习题库

5.主存储器和CPU之间增加cache的目的是 。 A.解决CPU和主存之间的速度匹配问题 B.扩大主存储器的容量 C.扩大CPU中通用寄存器的数量 D.既扩大主存容量又扩大CPU中通用寄存器的数量 在计算机系统中,CPU的速…

SAP中Smartforms 翻译越南语

点击打印预览 打印预览中确实是越南语 转出成PDF 成了乱码 SPAD中查询LP01其实是简体中文 换成LP02试试 显示看上去正常的 SPAD中的LP02 SU3可以设置自己的默认打印参数 查查Smartforms中的字体样式 是宋体,看上去不用为了越南文刻意改字体样式成TIMES 看这篇文章…

26.删除有序数组中的重复项 python

删除有序数组中的重复项 题目题目描述示例 1:示例 2:提示:题目链接 题解解题思路python实现代码解释提交结果 题目 题目描述 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现…

R语言 | 峰峦图 / 山脊图

目的:为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …

四川创新志成健康管理有限公司

四川创新志成健康管理有限公司 成都市青羊区广富路168号 公司简介 四川创新志成健康管理有限公司成立于2021年,公司专注体外诊断领域,致力为医学实验室、生产厂家、 经销商提供专业的学术、技术增值服务,涵盖免疫、生化、输血等检测领域&a…

系统级 I/O

Unix I/O **了解 Unix I/O 将帮助你理解其他的系统概念。**I/O 是系统操作不可或缺的一部分。我们经常遇到 I/O 和其他系统概念之间的循环依赖。例如,I/O 在进程的创建和执行中扮演着关键的角色。反过来,进程创建又在不同进程间的文件共享中扮演着关键角…

Elasticsearch:使用阿里 infererence API 及 semantic text 进行向量搜索

在之前的文章 “Elasticsearch 开放推理 API 新增阿里云 AI 搜索支持”,它详细描述了如何使用 Elastic inference API 来针对阿里的密集向量模型,稀疏向量模型, 重新排名及 completion 进行展示。在那篇文章里,它使用了很多的英文…

基于公网的无线全双工内部通话系统在演出行业可以用吗?

文旅名城再出发,更待“烟花”绽繁花 2024年4月将开业的扬州首个大型沉浸式剧场-《运河密城》 以运河为原点 追随河的记忆 从春秋时代的吴王夫差 到贯通南北的大运河成形 穿梭时空 探索扬州的前世今生 「运河第一锹」古运河旁 有一处新地标正在悄然兴起 如…

POSTGRESQL跟ORACLE语法区别和相同之处

跟ORACLE语法区别之处 1. Update和delete语法区别 Pg 和MySQL Update和delete的时候表名不能加别名 2. 插入数字类型不一样 ORACLE 对number类型的数据可以用’’ 字符串标记插入,但是PG不行,必须要进行正确的数据类型 3. SEQ使用不同 ORACEL的SEQ…