Redis的主从复制

news/2024/9/23 6:25:06/

文章目录

  • 前言
  • 主从结构解决的问题
  • redis主从配置
    • redis 建立复制
    • 断开连接
  • 主从复制的拓扑结构
    • 一主一从结构
    • 一主多从结构
    • 树状主从结构
  • 主从复制的原理
    • 数据同步 psync
      • 全量复制
      • 部分复制
    • 从节点如何竞争主节点的问题。
    • redis主节点无法重启的问题

前言

在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础,后面章节的哨兵和集群都是在复制的基础上实现高可用的。复制也是Redis日常运维的常见维护点。因此深刻理解复制的工作原理与使用技巧对我们日常开发运维非常有帮助。

主从结构解决的问题

主从复制是一种常见的数据备份和读写分离技术。主节点可读可写,而从节点只能读取数据,无法进行写入操作。

redis_6">redis主从配置

redis__7">redis 建立复制

配置方法

  1. 准备Redis实例:至少需要两台机器或容器,一台作为主节点(master),一台作为从节点(slave)。

  2. 配置主节点:在主节点上,需要编辑redis.conf配置文件,确保允许外部访问(修改bind配置为0.0.0.0),并关闭保护模式(设置protected-mode no)。
    在这里插入图片描述

  3. 配置从节点:在从节点上,同样需要编辑redis.conf配置文件,设置从节点的slaveof配置项,指向主节点的IP地址和端口。

在这里插入图片描述
4. 启动Redis服务:在主从节点上分别启动Redis服务。

在这里插入图片描述

  1. 验证配置:使用redis-cli工具连接到主节点或从节点,并使用INFO replication命令来验证主从配置是否成功。
    在这里插入图片描述

断开连接

slaveof命令不但可以建立复制,还可以在从节点执行slaveof no one来断
开与主节点复制关系。
在这里插入图片描述

主从复制的拓扑结构

一主一从结构

一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持(。当应用写命令并发量较高且需要持久化时,可以只在从节点上开启AOF,这样既保证数据安全性同时也避免了持久化对主节点的性能干扰。但需要注意的是,当主节点关闭持久化功能时,
如果主节点脱机要避免自动重启操作。因为主节点之前没有开启持久化功能自动重启后数据集空,这时从节点如果继续复制主节点会导致从节点数据也被清空的情况,丧失了持久化的意义。安全的做法是在从节点上执行slaveof no one断开与主节点的复制关系,再重启主节点从而避免这一问题。
在这里插入图片描述

一主多从结构

一主多从结构(又称为星形拓扑结构)使得应用端可以利用多个从节点实现读写分离,对于读占比较大的场景,可以把读命令发送到从节点来分担主节点压力。同时在日常开发中如果需要执行一些比较耗时的读命令,如:keys、sort等,可以在其中一台从节点上执行,防止慢查询对主节点造成阻塞从而影响线上服务的稳定性。对于写并发量较高的场景,多个从节点会导致主节点写命令的多次发送从而过度消耗网络带宽,同时也加重了主节点的负载影响服务稳定性。
在这里插入图片描述

树状主从结构

树状主从结构(又称为树状拓扑结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入复制中间层,可以有效降低主节点负载和需要传送给从节点的数据量。,数据写入节点A后会同步到B和C节点,B节点再把数据同步到D和E节点,数据实现了一层一层的向下复制。当主节点需要挂载多个从节点时为了避免对主节点的性能干扰,可以采用树状主从结构降低主节点压力。
在这里插入图片描述

主从复制的原理

1)保存主节点(master)的信息。
2)从节点(slave)内部通过每秒运⾏的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与主节点建⽴基于 TCP 的⽹络连接。如果从节点⽆法建⽴连接,定时任务会⽆限重试直到连接成功或者⽤⼾停⽌主从复制。
3)发送 ping 命令。连接建⽴成功之后,从节点通过 ping 命令确认主节点在应⽤层上是⼯作良好的。如果 ping 命令的结果 pong 回复超时,从节点会断开 TCP 连接,等待定时任务下次重新建⽴连接。
4)权限验证。如果主节点设置了 requirepass 参数,则需要密码验证,从节点通过配置 masterauth
参数来设置密码。如果验证失败,则从节点的复制将会停⽌。

5)同步数据集。对于⾸次建⽴复制的场景,主节点会把当前持有的所有数据全部发送给从节点,这步操作基本是耗时最⻓的,所以⼜划分称两种情况:全量同步和部分同步,下⼀节重点介绍。
6)命令持续复制。当从节点复制了主节点的所有数据之后,针对之后的修改命令,主节点会持续的命令发送给从节点,从节点执⾏修改命令,保证主从数据的⼀致性。
在这里插入图片描述

数据同步 psync

有两种方式
Redis 使⽤ psync 命令完成主从数据同步,同步过程分为:全量复制和部分复制。

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

说了这么多,还是来回顾一下,我们一开始的时候,我们用info replication

  • repliId的意义

在这里插入图片描述

每个节点需要记录两组 master_replid . 这个设定解决的问题场景是这样的:比如如当前有两个节点 A 和 B, A 为 master, B 为 slave.
此时 B 就会记录 A 的 master_replid.
如果⽹络出现抖动, B 以为 A 挂了, B ⾃⼰就会成为主节点. 于是 B 给⾃⼰分配了新的 master_replid.
此时就会使⽤ master_replid2 来保存之前 A 的 master_replid.
后续如果⽹络恢复了, B 就可以根据 master_replid2 找回之前的主节点.
后续如果⽹络没有恢复, B 就按照新的 master_replid ⾃成⼀派, 继续处理后续的数据.

  • offeset偏移量
    参与复制的主从节点都会维护⾃⾝复制偏移量。主节点(master)在处理完写⼊命令后,会把命令的字节⻓度做累加记录,统计信息在 info replication 中的 master_repl_offset 指标中。
    简单来说,就是主节点会收到很多修改操作的命令,主节点在接受到命令之后,就会发送给从节点,才能够几点在接受到主节点的命令后,会增加自己的偏移量。所以我们一般可以通过计算主从节点偏移量差,来判断是否出现故障。

因此replication id和offeset共同描述了一个数据集合,如果发现这两个内容是一样的,那么这两个机器上储存的数据是一样的。

  • psync的流程说明
    这个时候我们再来看一下psync的执行流程
    在这里插入图片描述

1)从节点发送 psync 命令给主节点,replid 和 offset 的默认值分别是 ? 和 -1.
2)主节点根据 psync 参数和⾃⾝数据情况决定响应结果:
• 如果回复 +FULLRESYNC replid offset,则从节点需要进⾏全量复制流程。
• 如果回复 +CONTINEU,从节点进⾏部分复制流程。
• 如果回复 -ERR,说明 Redis 主节点版本过低,不⽀持 psync 命令。从节点可以使⽤ sync 命令进⾏全量复制

全量复制

全量复制是Redis最早支持的复制方式,也是主从第一次建立复制时必
须经历的阶段。触发全量复制的命令是sync和psync.
具体流程如下:
在这里插入图片描述
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 ⽂件

部分复制

部分复制主要是Redis针对全量复制的过高开销做出的一种优化措施,
使用psync{runId}{offset}命令实现。
部分复制的流程如下
在这里插入图片描述
1)当主从节点之间出现⽹络中断时,如果超过 repl-timeout 时间,主节点会认为从节点故障并终端复制连接。
2)主从连接中断期间主节点依然响应命令,但这些复制命令都因⽹络中断⽆法及时发送给从节点,所以暂时将这些命令滞留在复制积压缓冲区中。
3)当主从节点⽹络恢复后,从节点再次连上主节点。
4)从节点将之前保存的 replicationId 和 复制偏移量作为 psync 的参数发送给主节点,请求进⾏部分复制。
5)主节点接到 psync 请求后,进⾏必要的验证。随后根据 offset 去复制积压缓冲区查找合适的数据,
并响应 +CONTINUE 给从节点。
6)主节点将需要从节点同步的数据发送给从节点,最终完成⼀致性。

从节点如何竞争主节点的问题。

从节点和主节点之间断开连接有两种情况。

  1. 从节点主动和主节点断开连接
    这个时候需要我们手动修改redis的组成部分,从节点就能主动晋升为主节点、
  2. 主节点已经挂载了。
    从节点不会晋升成主节点,因为会涉及到高可用的问题。

redis_133">redis主节点无法重启的问题

我们使用的redis主从复制过程,我们是在同一份主机上,启用不同的端口号,来模拟的主从复制的过程。
实际上共用的是一个appendonly.aof文件,实际上是不科学的。
于是我们要解决这个问题
解决方案:
把三个服务器生效的文件分区。
具体步骤
1、停止之前的服务器
2、删除之前工作目录下已经生成的aof文件
3、给从节点创建的新目录,设置新的工作目录
4、启动redis


http://www.ppmy.cn/news/1452427.html

相关文章

【Python从入门到进阶】53、Scrapy日志信息及日志级别

接上篇《52、CrawlSpider链接提取器的使用》 上一篇我们学习了基于规则进行跟踪和自动爬取网页数据的“特殊爬虫”CrawlSpider。本篇我们来学习Scrapy的日志信息及日志级别。 一、引言 1、日志在Scrapy中的重要性 在Scrapy框架中,日志扮演着至关重要的角色。日志…

Stable Diffusion基础:ControlNet之线稿成图

今天继续给大家分享Stable Diffusiion的基础能力:ControlNet之线稿成图。 所谓线稿就是由一条条的线段组成的图形,主要用于绘画和设计领域的打底稿、表达构想和预见最终效果。 所谓线稿成图就是利用 Stable Diffusion ControlNet 的能力,依…

四:物联网ARM开发

软件安装 keil5软件的安装包(软件开发)-> Keil.STM32F0XX_DFP.1.4.0.pack (这是STM32F0设备安装包)-> KEIL_Lic(破解keil的安装包) -> 安装 ST_LINK 烧写工具 -> 安装Java运行环境 -> 选择STM32CubeMX(微控制器图…

Windows 系统中常用的命令提示符(CMD)命令

一、文件和目录操作: dir:列出当前目录中的文件和子目录。 cd 目录路径:更改当前目录。 mkdir 目录名:创建新目录。 del 文件名:删除文件。 rmdir 目录名:删除目录。 Mstsc 打开远程连接命令 二、系统信…

Tomcat启动闪退怎么解决(文末附终极解决方案)

AI是这么告诉我的 Tomcat启动时出现闪退问题可能由多种原因引起,以下是解决此类问题的一些通用方法: 检查环境变量: 确保已经正确设置了JAVA_HOME和JRE_HOME环境变量,并指向正确的Java安装路径。将Java的bin目录添加到系统的PATH…

【SSM进阶学习系列丨分页篇】PageHelper 分页插件导入集成实践

文章目录 一、说明什么是分页PageHelper介绍 二、导入依赖三、集成Spring框架中四、编写Service五、编写Controller六、编写queryAllByPage页面展示数据 一、说明 什么是分页 ​ 针对分页,使用的是PageHelper分页插件,版本使用的是5.1.8 。 ​ 参考文档…

痉挛性斜颈患者改掉这些不良习惯,康复就不远了!

痉挛性斜颈,一种不容忽视的神经系统疾病,正在影响着全球数百万人的生活。它不仅仅是一种身体上的病痛,更是一种精神上的折磨。对于患者而言,除了寻求专业的医学治疗外,日常生活中的一些不良习惯也可能成为他们康复道路…

python在Django中,模板加载器(Template Loaders)是负责查找和加载模板文件的组件

在Django中,模板加载器(Template Loaders)是负责查找和加载模板文件的组件。Django默认使用django.template.loaders.filesystem.Loader和django.template.loaders.app_directories.Loader这两个加载器,它们分别用于从文件系统和Django应用目录下的templates子目录中加载模…