当前位置: 首页 > news >正文

【Redis进阶】主从复制

1. 主从结构引入

在分布式系统中,涉及到一个严重问题:单点问题
即如果某个服务器程序只有一个节点(单台机器提供服务),就会出现以下两个问题:

  1. 可用性问题,如果这台机器挂了,意味着服务中断
  2. 并发性能问题,单台机器承受的并发量是有上限的

引入分布式系统,也就是为了能解决上述的单点问题,因此往往在redis中会部署多台redis服务器构建redis集群,此时就可以通过这个集群提供更高性能/更稳定的服务,主要的部署结构有以下几种:

  1. 主从模式
  2. 主从+哨兵模式
  3. 集群模式

主从模式:
在若干个redis节点中,有的是"主节点",有的是"从节点",假设有三台物理服务器,分别部署了一个redis-server进程,此时就可以把其中一个节点作为"主节点",另外两个节点作为"从节点",此时引入从节点后主节点上保存的数据就需要同步给从节点,后续主节点进行的数据修改也要同步给从节点

💡 注意:在redis主从模式中,不允许从节点修改数据!

配置主从模式后,就可以实现 “读写分离” ,即通过主节点来处理写操作,从节点处理读操作,这样的结构就可以完美的解决上述出现的"单点问题":

  1. 在可用性方面:如果有一个从节点挂了,那么问题不大,可以继续从其他从节点上读取数据,但是如果挂的是主节点,在当前结构来看还是有一定影响的,但是也可以通过哨兵机制来解决(此处先不介绍),总之相比于单点服务器程序提升了可用性
  2. 在性能方面:实际业务场景读操作频率 >> 写操作频率,因此配置一主多从节点,每个从节点都能分摊请求压力,引入了更多的硬件资源,因此性能也就提高了

2. 主从结构搭建

当前为了简化部署流程,我们使用单台物理服务器,启动多个redis-server进程来模拟多个物理服务器

💡 提示:此处需要保证redis-server进程启动的端口号各不相同!可以在启动时用选项配置或者在配置文件中进行配置

我们需要保存三份redis.conf配置,设置daemonize为yes以后台方式启动,port必须不同

# 绑定ip
bind=0.0.0.0
# 启动端口号
port=6379
# 关闭保护模式
protect-mode=no
# 以后台方式运行
daemonize=yes

image.png
但是当前几个redis服务还是各自为政的,我们还需要进一步通过以下方式配置成主从结构:

  1. 方式一:在配置文件中配置slaveof [masterIP] [masterPort]
  2. 方式二:在redis-server启动命令后使用--slaveof [masterIP] [masterPort]
  3. 方式三:在redis客户端中使用slaveof [masterIP] [masterPort]

此处我们希望能够使配置永久生效,因此选择在配置文件中修改,比如此处将6379端口进程作为主节点,6380和6181端口进程作为从节点,因此需要在从节点的配置文件中配置slaveof [127.0.0.1] [6379]并重启redis服务!

💡 注意:此处如果是使用redis-server方式启动进程,需要搭配kill -9杀死进程,但是如果是使用service redis-server start方式启动,使用kill -9杀死后仍会自动重启,此时必须要搭配service redis-server stop停止

image.png
此时下面几个进程就是redis主节点和从节点之间建立的TCP连接,后续同步机制就是通过这些TCP连接进行通信的,我们可以尝试登陆主节点使用info replication查看主从配置信息:
image.png

3. 主从复制过程

3.1 replid和offset字段含义

redis提供了psync命令用于完成数据同步(psync命令不需要手动执行,redis服务器会在建立好主从关系后,自动执行psync命令),比如从节点就会执行psync replicationid offset从主节点拉取数据
replicationid:当主节点启动时生成 / 从节点晋升成为主节点的时候生成(注意:就算是同一个主节点,每次启动生成的replicationid也是不重复的)我们可以通过info replication进行查看:
image.png

💡 注意:此处replid2在一般情况下是用不到的,但是可能存在以下场景:比如主节点A与从节点B之间配置主从关系,但是由于网络抖动导致B节点认为A主节点挂了,此时B自动晋升为主节点,给自己生成一个replid,同时还会记录之前的主节点信息保存在replid2上,后续如果主节点A恢复就可以手动配置恢复

offset:偏移量,用来记录从节点和主节点之间的数据同步进度,此处主节点和从节点都需要维护双方的偏移量,主节点会收到很多的修改命令,每一个命令都占据相应字节数,主节点就会把这些命令字节数累加作为偏移量,而从节点的偏移量就描述了从节点当前的同步进度,同时从节点每秒都需要上报给主节点当前的复制偏移量
此时replicationid和offset就构成了一组"数据集合",如果说某两台机器上的replid和offset都相同那就说明两者的数据是完全一致的!

3.2 主从数据复制

在redis中使用psync replicationid offset进行数据同步,但是数据同步有两种方式:1、全量同步,2、增量同步主要就是根据offset这个字段值进行区分:

  1. 如果是全量复制,就将offset值置为-1
  2. 如果offset值为正整数,则从当前偏移量开始进行部分复制

3.2.1 全量复制过程

  1. 从节点发送psync命令给主节点进行数据同步,由于是第一次通信不知道主节点replid因此发送psync ? -1
  2. 主节点根据命令判定为全量同步,返回FULLRESYNC响应
  3. 从节点将主节点的replid进行保存
  4. 主节点使用bgsave命令生成rdb持久化文件,同时在这期间接收到的修改命令保存到缓冲区
  5. 主节点生成完毕rdb文件后发送给从节点
  6. 发送完rdb文件后将缓冲区中的数据也以rdb文件格式追加写入,保证主从一致
  7. 从节点清空自身数据信息
  8. 重放rdb文件中的内容复制数据
  9. 如果还开启了AOF持久化功能,则会执行bgrewriteaof重写,得到最近的AOF文件

🍬 提示:主节点进行全量复制的过程也支持无硬盘模式(diskless),即主节点生成rdb文件的过程可以不保存在硬盘上,而是直接将数据进行网络传输(省去了多次硬盘IO操作)同理从节点加载数据也可以直接进行加载,但是网络传输的开销仍然很大,因此全量复制的开销也是比较大的!

runid和replicationid的区别:
在一个redis服务器上会出现replid和runid两个概念,但是这两个是不一样的,我们可以通过info replication查看replid,可以通过info server查看runid:

  • slave1:

    image.png
    image.png

  • slave2:

    image.png image.png

他们之间的区别概括如下:

  1. 在应用场景上:replid主要作用于主从复制的场景,runid则主要作用于哨兵模式中
  2. 在产生方式上:replid是在主从结构中由主节点启动的时候分配的(主从结构中replid相同),而runid则是每一个节点启动后系统分配的(每个节点均不同)

3.2.2 部分复制过程

在全量复制过程中,开销是比较大的,有些情况下从节点已经复制了主节点上的大部分数据,此时就需要"部分复制"了:比如说出现了网络抖动,此时主节点上最新的修改内容就无法及时同步给从节点,当从节点恢复之后就需要重新建立连接并进行部分同步
部分复制

  1. 当出现网络抖动时,主从节点之间超过repl-timeout时间,主节点就会认为从节点故障并中断连接
  2. 在这期间主节点依旧响应客户端命令,暂时将这些内容写入复制积压缓冲区(repl-backlog-buffer)中
  3. 当从节点恢复后就会重新建立与主节点之间的连接
  4. 从节点将之前保存的replicationidoffset作为psync参数发送给主节点,请求部分复制
  5. 主节点接收到psync请求后解析出部分复制,就会尝试在复制积压缓冲区查找合适数据,并响应continue给从节点
  6. 主节点将同步的数据发送给从节点,保证数据一致性

repl-backlog-buffer:
就是内存中类似于一个环形队列这样的数据结构,会保存最近的一些修改操作,但是总量毕竟还是有上限的,随着时间推移,会逐步删除最早的一些数据
image.png
当主节点接收到从节点的psync replid offset的时候就会先根据offset的值去repl-backlog-buffer查找有无这部分数据,如果有就会从该偏移量开始将后续的数据返回给从节点,如果没有那就只能进行全量复制了

3.2.3 实时复制过程

实时复制:描述的是主从已经完成数据同步之后,主节点这边不断地接收到数据修改操作,就需要实时同步给从节点
从节点和主节点之间会建立TCP的长连接,然后主节点就可以将自己收到的修改数据的请求发送给从节点,从节点再根据这些请求修改内存中的数据,同时为了实时复制能够处于可用状态,还需要借助 心跳包 机制:
主节点:默认每隔10s给从节点发送一个ping命令,从节点收到返回poing
从节点:默认每隔1s给主节点发送特定的请求,就会上报当前的节点同步数据的进度(offset)

4. 主从故障处理

当前配置的主从结构还需要考虑故障处理的问题:

  • 如果挂了的是从节点,那问题不大
  • 如果挂了的是主节点,此时就需要进行处理

当前主从断开连接有两种情况:

  1. 从节点和主节点之间断开连接:比如执行slaveof no one命令,这个时候从节点就会晋升成为主节点
  2. 主节点挂了:此时不会自动将从节点晋升成为主节点,于是引入了哨兵机制的概念(下次讲)

相关文章:

【Redis进阶】主从复制

1. 主从结构引入 在分布式系统中,涉及到一个严重问题:单点问题 即如果某个服务器程序只有一个节点(单台机器提供服务),就会出现以下两个问题: 可用性问题,如果这台机器挂了,意味着…...

编程类精品GPTs

文章目录 编程类精品GPTs前言种类ChatGPT - GrimoireProfessional-coder-auto-programming 总结 编程类精品GPTs 前言 代码类的AI, 主要看以下要点: 面对含糊不清的需求是否能引导出完整的需求面对完整的需求是否能分步编写代码完成需求编写的代码是否具有可读性和可扩展性 …...

ubuntu在命令行输出里查找内容,dmesg

直接执行查看日志指令会出来很多页。dmesg为开机日志信息。记录了开机时硬件的过程 sudo dmesg 执行结果: 可以用竖号“|”,在前一条命令返回的内容进行查找。下图为查找bluetooth sudo dmesg |grep -i bluetooth...

图片url处理(带http和不带http)方法

后端返回的接口数据,图片路径,有的是相对路径,有的是带http的路径 得处理一下,如果是相对路径就拼上服务器的地址(xxx),如果是带http的路径就正常显示 方法: imageUrl(url){let str RegExp(http);let ne…...

Git(分布式版本控制系统)、Gitlab、分支、分支冲突

目录 1.Git概述 2.Git的功能特性 3.Github社区和Gitlab 1.Github社区 2.Gitlab 4.Git的安装及配置 1.Git安装 2.配置Git环境 3.常用指令 4. 建立git仓库 1.创建一个目录 2.初始化当前目录仓库 3.查看隐藏文件 4.新建文件并添加到缓存 5.提交文件到仓库 6.查看历…...

dockerfile部署镜像 ->push仓库 ->虚拟机安装建木 ->自动部署化 (详细步骤)

目录 创建私服仓库 vi /etc/docker/daemon.json vim deploy.sh判断脚本内容 创建 建木 后端部署 命名空间 设置密码用户名 创建git仓库 gitignore文件内容 图形项目操作 git maven docker镜像 点击流程日志 vim /etc/docker/daemon.json 执行部署脚本 ip 开发…...

Android串口开发及读取完整数据的解决方法

串口发送实质就是向串口设备写入、读取字节流,和文件的操作很相似,安卓官方已经提供了android-serialport-api,在开源社区上也有很多衍生项目可以借鉴,本文介绍其中一种用法。 添加依赖 在Module下的 build.gradle 中添加: implementation com.aill:A…...

java之对象向下转型

java中,向下转型是为了重新获得因为向上转型而丢失的子类特性。在先下转型前,必须先进行向上转型。 语法格式如下 父类类型 父类对象子类实例 子类类型 子类对象(子类)父类对象 示例代码如下 class Animal01 {public void sh…...

ElasticSearch核心之DSL查询语句实战

什么是DSL? Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的,所以你必…...

Axure中继器:数据动态展示的强大工具

在Axure RP这一强大的原型设计工具中,中继器(Repeater)无疑是一颗璀璨的明珠。它以其独特的功能和广泛的应用场景,成为设计师在创建数据密集型原型时的首选。本文将深入探讨Axure中继器的特点、使用方式及其在数据动态展示中的重要…...

QT--聊天室

一、设计要求 用QT做一个聊天室, 制作一个服务器和客户端。可以进行注册、登录, 登陆成功后可以使用昵称进行发送、接收消息。 能根据昵称、聊天内容查询历史记录,也可以查询全部聊天记录。 。 二、客户端三级ui界面 三、项目代码 //在…...

Javascript前端面试基础4【每日学习并更新10】

同步和异步的区别 同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等…...

社区团购系统搭建开发,前端uniapp。社区团购搭建开发定制

目录 前言: 一、社区团购系统有哪些功能? 二、社区团购管理端 三、社区团购的基本流程如下: 总结 : 前言: 社区团购是一种以社区为单位进行的集体购物模式。这种模式利用了互联网平台来组织同一社区内的居民一起购…...

node+mysql+layui+ejs实现左侧导航栏菜单动态显示

nodemysqllayuiejs实现左侧导航菜单动态显示 实现思路效果图数据库技术栈代码实现main.html(前端首页页面)查询资源菜单方法 jsapp.js配置ejs模板 node入门到入土项目实战开始,前端篇项目适合node小白入门,因为我也是小白来学习no…...

FRP配置内网穿透52版本以上适用

简述 适用frp配置内网穿透来说我们需要进行简单的区分,具有公网IP的服务器我们简称为服务端,内网的服务器我们可以简称为客户端,frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…...

IFM易福门LR3000LR3300液位传感器操作说明

IFM易福门LR3000LR3300液位传感器操作说明...

【Python大语言模型系列】基于阿里云人工智能平台采用P-Tuning v2微调ChatGLM2-6B大模型(完整教程)

这是我的第331篇原创文章。 一、引言 P-Tuning 是一种对预训练语言模型进行少量参数微调的技术。所谓预训练语言模型,就是指在大规模的语言数据集上训练好的、能够理解自然语言表达并从中学习语言知识的模型。P-Tuning 所做的就是根据具体的任务,对预训练…...

基于Spring boot + Vue的加油站系统

项目名称:加油站系统 作者的B站地址:程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址:程序员云翼-CSDN博客 1.项目技术栈: 前后端分离的项目 后端:Springboot MybatisPlus 前端:Vue…...

️RPC协议 --基于TCP实现RPC通信

RPC 协议介绍 RPC(Remote Procedure Call,远程过程调用)协议是一种通信协议,允许一个程序调用另一个地址空间(通常是在网络上)的过程或函数,而不需要显式地处理细节如数据序列化和网络通信。它允许开发人员编写分布式应用程序,就像编写本地应用程序一样。 关键特点和组…...

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 (1)平台版本(Android SDK版本号) 平台版本也就是我们平时说的安卓8、安卓9、安卓10 (2)API级别(API Level) Android 平台提供的框架 API 被称作“API 级别” …...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Python如何给视频添加音频和字幕

在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

Map相关知识

数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...