Redis-持久化+主从架构

news2025/1/20 22:04:15

文章目录

  • Redis的持久化
    • RDB模式
    • 异步持久化的实现
    • AOF模式
    • 总结
  • Redis的主从架构
    • 1.端口以及文件调试测试
    • 2.主从配置
    • 3.数据同步原理(第一次同步为全局同步)
    • 4.增量同步
    • 5.主从配置优化
    • 6.问:master主机怎么判断从机slave是不是第一次同步数据?

Redis的持久化

Redis服务的前言:
在这里插入图片描述
在这里插入图片描述

数据丢失问题:实现Redis持久化,用备份
并发能力问题:单节并发度较低,搭建主从集群,实现读写分离
储存能力问题:搭建分片集群,利用插槽机制实现动态扩容
故障恢复问题:redis宕机,服务不可用,会出现很多状况,需要自动故障恢复手段,哨兵,实现健康监测和自动恢复

RDB模式

RDB被称为Redis数据快照, 记录内存数据到磁盘中,当Redis实例故障重启后,会从磁盘读取快照文件恢复数据

快照文件为RDB文件,默认保存在当前运行目录,有两种保存方式:savebgsave,Redis挂了也会执行一次RDB;

bgsave:创建一个子进程——>通过fork主进程得到,子进程共享主进程内存数据,然后将fork完的内存数据写入redis中;

save是由Redis主进程来执行save,回阻塞所有命令,所以一般都使用bgsave

在这里插入图片描述
在这里插入图片描述

也可以自动触发RDB
在redis.conf下有Redis触发RDB的机制

在这里插入图片描述

RDB其他配置

压缩rdb文件到磁盘:rdbcompression yes
文件保存路径目录:dir ./
rdb文件改了名称后会丢失数据

在这里插入图片描述

时间不能太长也不能太短,因为太短,如果数据量很大比如1g,你1s一次来不赢,压力很大;
时间太长,你写入数据比较快,然后挂了,那么数据就会丢失保存不了

所以一般用默认的RDB触发时间就行了

异步持久化的实现

我们主进程用的是虚拟内存,其实也就是本机内存的一部分,然后其他物理内存中的数据的调用,是由于页表的作用——>操作系统会维护页表,主进程通过页表中的映射关系得到物理内存中的数据;

而我们这里的的异步持久化——>作用就是主进程fork了一个子进程,因为子进程此时与主进程的作用是一样的,所以也可以对物理内存的数据进行读写;

fork子过程拷贝页表是阻塞的;

从而达到内存共享,子进程对内存数据进行读写,实现异步持久化

在这里插入图片描述

copy-on-wirte技术:

当出现读写操作时,一个进行读:读取共享内存;一个进行写,当执行写操作时,内存中的数据(read-only)会被拷贝一份数据放在内存中给其他线程进行读取;

每更新一次,或者说更新的时候每有进程来读取都会有一个新的数据副本

在这里插入图片描述

在这里插入图片描述

AOF模式

在这里插入图片描述

appendfsync always:表示执行一次命令,主进程接收到命令,分配内存进行执行,然后持久化到硬盘——>安全;

appendfsync everysec:将命令执行放入缓冲区中,然后每秒将缓冲区中的数据写入AOF文件,如果途中宕机,有丢掉数据的风险;

appendsync no:这个的话,写命令完成后,它会被放到AOF缓冲区,但是缓冲区的数据什么时候写回给磁盘是由操作系统决定的

在这里插入图片描述
进行配置

save " ":禁用rdb

开启AOF:appendonly yes

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

重启后也会数据持久化到硬盘

注意:AOF记录的操作的命令数,只要你是个命令都会被记录到AOF配置文件中,而rdb文件,记录的是值,只有不同的值才会被记录到其中,有对象treeset和hashset

所以说,AOF文件会比RDB文件大的多,会记录对同一个key的多次写操作

在这里插入图片描述
执行BGREWRITEAOF命令

重写AOF

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结

RDB宕机恢复速度>AOF宕机恢复速度,因为RDB里面放的是数据,AOF放的是命令还需要执行,所以肯定慢些赛;

RDB数据恢复优先级<AOF,因为数据完整性较低,rdb可以充当一个备份的作用,比如主从集群时,rdb文件能够帮助恢复数据;

RDB系统资源占用较高,容易丢数据,备份时间较长,save xxx xxx,需要考虑时间长短一次备份,而AOF主要磁盘IO资源,因为其他线程需要重写命令;

在这里插入图片描述

Redis的主从架构

像我们redis的话,其实大部分都是用在读上面;

我们单节点的并发能力是有限的,可以试想一下,把读写操作进行分离,主节点进行写操作,从节点进行读操作;

从节点是主节点fork得到的,主从数据同步

在这里插入图片描述

1.端口以及文件调试测试

创建三个文件7001,7002,7003
1.首先开启3个节点,需要准备三份不同的配置文件和目录,配置文件所在的目录就是工作目录

将配置文件分别拷贝到文件目录中
在这里插入图片描述

  1. 修改工作目录以及port

在这里插入图片描述

 sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/etc\/7001\//g' 7001/redis.conf

发现以及配置成功,工作目录以及端口成功被修改

3.还需要修改每个节点声明的IP,因为虚拟机本身有多个IP,为了避免混乱,需要再redis.conf中指定每一个实例的绑定IP信息
在这里插入图片描述

声明IP地址成功

在这里插入图片描述

2.主从配置

redis-cli -p 端口号:当前节点连接端口

然后slaveof设置主从

在这里插入图片描述

在这里插入图片描述

数据同步完成

3.数据同步原理(第一次同步为全局同步)

1.其实就是rdb文件,从机调用slaveof命令后——>从机请求master,master判断从机是不是第一次数据同步,是的话就将rdb文件发送给从机(主机执行bgsave命令生成并发送rdb),从而实现数据同步(第一次是从机主动请求的)
2.然后从机先清空本地数据,然后加载rdb文件
3.后面主机再对数据更新,主机会自动给从机主动发送repl_baklog命令,从机接收到命令后执行

repl_baklog:

它是针对部分复制,储存未来新增的命令,里面有偏移量offset,就是增量同步

在这里插入图片描述

4.增量同步

增量同步就是全量同步后,主从同步数据而方式;

流程:

1.slave进行重启后,因为从机宕机了,所以主机的写数据从机是不知道的;
2.从机醒来后,会向主机发送请求,然后请求判断id固然是一样的,然后从repl_baklog中获取从机offset后的数据;
3.然后从机执行

在这里插入图片描述

注意:如果欠的数据>一圈了,因为repl_baklog大小是有上限的,写满后会覆盖最早的数据,而从机slave断开的时间又很久——>导致数据被覆盖,无法增量同步,只能全量同步;(可以将repl_baklog 文件大小设置大一点 或者 尽量不要让从机长时间宕机)

5.主从配置优化

1.在master中的配置文件配置repl-diskless-sync yes:启用无磁盘复制,这样我们的数据不会经过磁盘读写,而是直接将数据放到网络中,通过网络进行传输; 如果网络非常之慢的话就还是用磁盘复制

在这里插入图片描述

2.可以适当提高repl_baklog的大小,因为我们出现全量同步的原因就是repl_baklog小了,数据量大过了这个圈从而导致覆盖;
3.限制master上slave节点的数量,当从节点过多,可以采用主-从链式结构,减轻主机压力

在这里插入图片描述

6.问:master主机怎么判断从机slave是不是第一次同步数据?

Replication id数据集的标记,id一致则是同一数据集,每一个master都有唯一Replication id,slave从机会继承主机master的Replication id;第一次主机和从机标记中的偏移量是一样的,也就是数据是一致的

offset偏移量,当主机数据写入,那么repl——baklog中的数据会越来越多。而从机完成同步时也会记录同步的offset,如果从机salve的offset<master主机的offset,就说明从机的数据落后于主机,需要更新;

主机首先会根据Replication id进行判断,因为从机一开始也是自己的主机,所以id肯定是不一样的,如果是第一次,那么将主机id给到从机,并将offset传入,然后从机保存版本信息,那么就表示了从机与主机数据一致

在这里插入图片描述

1.主从机先进行连接,然后从机发送增量同步请求
2.主机说你的id与我的不匹配,你是第一次来,不能给你增量同步,只能全量同步

在这里插入图片描述

3.从机开始全量同步 ,然后接收主机的数据并将自己之前数据清空进行同步

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Modelsim 使用教程(4)—— Working With Multiple Libraries

一、概述 在文中&#xff0c;我们将练习使用多个库。在实际的项目开发过程中&#xff0c;我们可能有多个库来组织设计&#xff0c;从第三方源代码访问IP&#xff0c;或者在仿真之间共享公共部分。我们将通过创建一个包含计数器设计单元的资源库来开始本文。接下来&#xff0c;我…

美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?

这是一道面试中常见的 Redis 基础面试题,主要考察求职者对于 Redis 应用场景的了解。 即使不准备面试也建议看看,实际开发中也能够用到。 内容概览: Redis 除了做缓存,还能做什么? 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Re…

VBA之正则表达式(44)-- 拆分商品和规格

实例需求&#xff1a;商品组清单保存在A列中&#xff0c;现需要将其拆分为商品名称&#xff0c;保存在从B列开始的后续单元格中&#xff0c;部分商品包含规格&#xff0c;并且多种规格属性使用了逗号分隔&#xff0c;因此无法直接使用Excel分列功能完成数据拆分。 示例代码如下…

BUUCTF 数据包中的线索 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 公安机关近期截获到某网络犯罪团伙在线交流的数据包&#xff0c;但无法分析出具体的交流内容&#xff0c;聪明的你能帮公安机关找到线索吗&#xff1f; 密文&#xff1a; 下载附件&#xff0c;解压得到一个.pcapng文…

基于SSM的同学录网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【星海出品】VUE(一)

Windows安装nvm控制器 Windows里找都PowerShell。右击点击管理员运行。 1.安装choco Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(https://chocolatey.org/install.ps1))2.安装NVM choco install nvm 3.查看可…

【HTML】播放器如何自动播放【已解决】

自动播放器策略 先了解浏览器的自动播放器策略 始终允许静音自动播放在以下情况&#xff0c;带声音的自动播放才会被允许 2.1 用户已经与当前域进行交互 2.2 在桌面上&#xff0c;用户的媒体参与指数阈值(MEI)已被越过&#xff0c;这意味着用户以前播放带有声音的视频。 2.3 …

一座 “数智桥梁”,华为助力“天堑变通途”

《水调歌头游泳》中的一句话&#xff0c;“一桥飞架南北&#xff0c;天堑变通途”&#xff0c;广为人们所熟知&#xff0c;其中展现出的&#xff0c;是中国人对美好出行的无限向往。 天堑变通途从来不易。 中国是当今世界上交通运输最繁忙、最快捷的国家之一&#xff0c;交通行…

Linux的常见指令(一)

目录 一、文件 二、常见指令 1、pwd 2、ls 1、ls -a 2、ls -l 3、ls -i ​编辑 3、touch 4、mkdir 5、cd 6、rmdir 和 rm 7、man 8、cp 一、文件 目录和文件是在磁盘上建立的&#xff0c;空文件是在磁盘上占用空间的&#xff08;文件包括文件内容和文件的各种属…

学习 SpringMVC 必备的 4 大知识点

一、什么是 SpringMVC 前面我们了解了Spring、SpringBoot&#xff0c;那么 Spring MVC 又是什么呢&#xff1f;关于三者&#xff0c;我们可以这样理解&#xff1a;Spring MVC 是 Spring 框架的核心模块&#xff0c;而 Spring Boot 是 Spring 的脚手架。 Spring MVC 又称作 Sp…

Java多条件排序使用Comparator和thenComparing【包含排序List<Map<String, String>>】

Java多条件排序使用Comparator和thenComparing Comparator接口简介使用Comparator排序使用thenComparing实现多条件排序使用thenComparing排序Map 在Java中&#xff0c;对一个列表或集合进行排序时&#xff0c;经常需要基于多个条件来排序。幸运的是&#xff0c;Java提供了强大…

Rust 语言常见的一些概念(下)

目录 1、函数 参数 语句和表达式 具有返回值的函数 2、注释 文档注释 多行注释 3、控制流 3.1 if 表达式 3.2 使用esle if 处理多重条件 3.3 在 let 语句中使用 if 3.4 使用循环重复执行 使用 loop 重复执行代码 从循环中返回值 循环标签&#xff1a;在多个循环…

机器学习中的嵌入:释放表征的威力

简介 机器学习通过使计算机能够从数据学习和做出预测来彻底改变了人工智能领域。机器学习的一个关键方面是数据的表示&#xff0c;因为表示形式的选择极大地影响了算法的性能和有效性。嵌入已成为机器学习中的一种强大技术&#xff0c;提供了一种捕获和编码数据点之间复杂关系的…

LeetCode1518 换水问题

题目描述 超市正在促销&#xff0c;你可以用 numExchange 个空水瓶从超市兑换一瓶水。最开始&#xff0c;你一共购入了 numBottles 瓶水。 如果喝掉了水瓶中的水&#xff0c;那么水瓶就会变成空的。 给你两个整数 numBottles 和 numExchange &#xff0c;返回你 最多 可以喝…

人工智能基础_机器学习015_BGD批量梯度下降代码演示_在批量梯度下降中使用逆时衰减---人工智能工作笔记0055

然后我们用代码来演示一下BGD批量梯度下降,首先启动jupyter notebook 然后我们新建一个文件 新建文件夹,然后新建一个python文件 然后我们这里用一元一次方程进行批量梯度下降. import numpy as np 导入数学计算包 X = np.random.rand(100,1) `np.random.rand(100, 1)` 是…

【每日一题】2103. 环和杆-2023.11.2

题目&#xff1a; 2103. 环和杆 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 &#xff0c…

【AUTOSAR】【以太网】DoIp

AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读217次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、功能描述 2.1 Do

06_es分布式搜索引擎2

一、DSL查询文档 1.DSL查询分类 ①查询所有&#xff1a;match_all ②全文检索&#xff1a;利用分词器对用户输入的内容分词&#xff0c;倒排索引去匹配 match_query multi_match_query ③精确查询&#xff1a;根据精确词条查找数据&#xff0c;查找的是keyword,数值,日期,b…

BUCK、BOOST、BUCK-BOOST电路原理分析

一、前导 DC-DC DC-DC电源&#xff0c;即直流-直流变换器&#xff0c;是指将一个固定的直流电压变换为可变的直流电压&#xff0c;也称为直流斩波器。DC-DC有多种拓扑结构&#xff0c;如BUCK&#xff08;降压&#xff09;、BOOST&#xff08;升压&#xff09;、BUCK-BOOST&…

基于EPICS stream模块的直流电源的IOC控制程序实例

本实例程序实现了对优利德UDP6720系列直流电源的网络控制和访问&#xff0c;先在此介绍这个项目中使用的硬件&#xff1a; 1、UDP6721直流电源&#xff1a;受控设备 2、moxa串口服务器5150&#xff1a;将UDP6721直流电源设备串口连接转成网络连接 3、香橙派Zero3&#xff1a;运…