【Redis技术探索】「底层架构原理」探索分析服务数据同步持久化机制

news2024/11/23 8:15:16

📚背景介绍

✒️ Redis数据恢复的介绍

通常情况下redis的数据全部存储在内存中,数据库一旦故障发生重启数据会全部丢失持久化功能在于能够有效地避免因进程退出造成的数据丢失问题在下次重启时利用之前持久化的文件即可实现数据恢复。

✒️ Redis高可用的功能基础

即使是在redis cluster或者redis sentinel模式下主从同步数据的恢复仍然需要一段时间。

✒️ Redis实际场景的分析

开启Redis持久化之后,数据将存放到磁盘中,数据库执行增量同步的时间要远小于全量同步在生产环境下故障的数据恢复有着非常重要的作用!

📚前提概要

Redis是出了名的速度快,那是因为在内存中进行数据存储和操作;如果仅仅是在内存中进行数据存储,那就会导致以下问题

  1. 数据随进程退出而消失当服务器断电或Redis Server进程退出时,内存肯定随之释放,最后数据也会丢失

    • 有些小伙伴认为只是作为缓存,数据没有了,重新从数据库中读取放在里面即可,试想,如果是高并发场景,数据库岂不是压力很大;
  2. 重要数据无法恢复:数据丢失之后无法进行恢复,对于一些重要的数据,只是存在Redis中,而没有存在关系型数据库,如果数据丢失便不可恢复;比如刷礼品排行榜,如果数据丢失,用户肯定不愿意的

    • 对于Redis持久化在工作中和面试过程中是一个很重要的技术点,必用必考,接下来详细说说Redis持久化;

📚 基本介绍

✒️ Redis持久化有两种方案

  • RDB(Redis DataBase)是一种快照式的二进制数据存储,它会周期性的保存当前时间点Redis所有的数据到磁盘中

  • AOF(Append Of FIle)是一种追加式的存储方式,会实时的记录Redis的写操作到磁盘中

✒️ Redis持久化机制实现

  1. Redis是基于内存进行操作运算,如果不持久化数据再重启服务时会导致数据丢失
  2. 开启Redis持久化功能后,数据会保存到磁盘中。当redis重启后,可以从磁盘中恢复数据。

✒️ RDB快照(snapshot)

✒️ RDB持久化方式

RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发。

✒️ RDB手动触发

手动触发有save和bgsave两命令

✒️ save命令
  1. 该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止

  2. 执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。

在执行redis-cli shutdown关闭redis服务时,如果没有开启AOF持久化,自动执行save

✒️ bgsave命令
  1. Redis主进程fork一个子进程来创建临时RDB存储文件创建文件完成后对这个临时文件rename替换原先的RDB文件

  2. RDB文件是一个单文件很适合数据的容灾备份与恢复通过RDB文件恢复数据库耗时较短通常1G的快照文件载入内存只需20s左右

✒️ bgsave命令和save命令
命令名称savebgsave
IO类型同步异步
是否阻塞
复杂度O(n)O(n)
优点不会耗费额外内存不阻塞客户端访问
缺点阻塞客户端访问耗费多余客户端

在指定时间间隔内将内存中的数据库记录集dump到磁盘上,RDB是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb

✒️ RDB自动触发

自动触发是由我们的配置文件来完成的,自动触发bgsave。

✒️ 配置方法
  • 在redis.conf文件中配置N 秒内数据集至少有 M 个改动时自动触发一次RDB持久化Redis会将数据集的快照dump到dump.rdb文件中

  • 我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后我们搜索save,可以看到下面的配置信息

✒️ 60秒内至少有10000个键被修改
  • save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
  • save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
  • save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,dump内存快照。

关闭RDB方式持久化只需要将所有save保存策略注释掉即可

✒️ RDB持久化命令
  • 命令:config set dir /usr/local //设置rdb文件保存路径
  • 备份:bgsave //将dump.rdb保存到usr/local下
  • 恢复:将dump.rdb放到redis安装目录与redis.conf同级目录,重启redis即可

save命令是同步命令,bgsave命令是异步命令,会从redis主进程fork出一个子进程去处理,每次命令执行后会新生成一个rdb文件并覆盖原来的文件。

✒️ 修改配置

  • rdbcompression yes:rdb文件压缩是否开启

  • dbfilename dump.rdb:rdb文件名称定义

✒️ RDB的优缺点

✒️ 优点

  • (恢复速度快,适合大数量恢复机制)RDB保存的是某一个时间点的内存快照,非常适合灾难恢复。在恢复大数据集时速度快,1G的RDB数据恢复耗时大概20s,比AOF要快的多

✒️ 缺点

  • (间隔时间大并且丢失数据较为多)RDB通过触发某个时间点条件生成快照文件,如果5分钟保存一次的话,一旦发生故障会丢失好几分钟的数据配置不同的保存点让RDB至少可以保存5分钟的数据。因此,如果Redis由于任何原因没有正确关闭而停止工作,你应该做好好丢失最近几分钟的数据

  • (CPU资源占用过大、内存资源占用过多)fork子进程消耗内存和CPU,RDB经常需要 fork() 才能使用子进程在磁盘上持久化。如果数据集很大,fork()可能很耗时,如果数据集非常大,CPU性能不好可能会导致Redis停止为客户机服务几毫秒甚至一秒钟。

✒️ AOF(append-only file)

由于RDB快照方式的缺点,如果redis由于某些原因导致机器故障时,则会丢失最近几分钟写入的数据,而AOF持久化方式,则通过追加的方式将操作命令添加到appendonly.aof文件中,存储的文件是RESP协议指令文件。

✒️ 配置方法

  • appendonly yes # 开启AOF持久化,(默认不开启,为no)

  • appendfilename “appendonly.aof”:默认文件名

配置好后,redis每次修改操作的命令会追加到AOF末尾,当redis重启后会重新执行AOF里的命令达到重建缓存数据集的目的,配置刷命令的频率

  • appendfsync always每次有新命令追加到AOF文件时就执行一次fsync,非常慢但最安全。服务器在每执行一个事件就把AOF缓冲区的内容强制性的写入硬盘上的AOF文件里,保证了数据持久化的完整性,效率是最慢的但最安全的;

  • appendfsync everysec # 服务端每隔一秒才会进行一次文件同步把内存缓冲区里的AOF缓存数据真正写入AOF文件里,兼顾了效率和完整性,极端情况服务器宕机只会丢失一秒内对Redis数据库的写操作;默认方式

  • appendfsync no # 从不fsync交由操作系统处理,速度快,表示默认系统的缓存区写入磁盘的机制,不做程序强制,数据安全性和完整性差一些。


  • bgrewriteaof:后台运作重写机制

  • auto-aof-rewrite-min-size 64mb # aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大

  • auto-aof-rewrite-percentage 100 # aof文件自上一次重写后文件大小增长了100%,则再次触发重写执行bgrewriteaof命令可以手动重写aof文件,AOF重写redis会fork出一个子进程去做,不会对redis正常命令处理有太多影响。


redis启动时如果既有rdb文件又有aof文件则优先选择aof文件恢复数据,因为aof一般来说数据更全一点。

  • 全量同步(RDB):每天定时(避开高峰期)或者采用一个周期实现将数据拷贝到一个地方

  • 增量同步(AOF):比如采用对行为的操作实现对数据的同步。

  • 增量同步比全量同步更加消耗服务器的内存,但是能够更加的保证数据的同步

📚 AOF的优缺点

✒️ 优点

AOF是通过保存Redis写操作的命令来实现持久化,使用AOF来持久化,Redis数据的安全性将大幅提高,异常宕机情况下最多丢失1s的数据。AOF文件记录了redis的写操作,格式清晰,易于理解和修改,利于数据的重建。

AOF日志是一个只附加的日志,因此如果断电,就不会出现查找或损坏问题。即使日志由于某种原因(磁盘已满或其他原因)以半写的命令结束,redis check aof工具也可以轻松地修复它。

当AOF太大时,Redis能够在后台自动重写AOF。重写是完全安全的,因为当Redis继续附加到旧文件时,一个全新的文件会生成,只需创建当前数据集所需的最少操作集,一旦第二个文件就绪,Redis就会切换这两个文件并开始附加到新文件中。

AOF以易于理解和解析的格式包含所有操作的日志。你甚至可以轻松导出AOF文件。

✒️ 缺点

  • AOF文件通常比相同数据集的等效RDB文件大

  • 根据具体的fsync策略,AOF可能比RDB慢。

使用建议

Redis默认开启了持久化功能,而且是全量RDB的,缺点是服务器宕机后可能会造成数据丢失。
建议最好还是搭配使用aof的everysec,既能够保证数据的同步,效率也还可以,但是会存在丢失一秒数据的可能性,就算丢失也关系不大,因为数据库中已经存在了数据。

混合持久化

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的AOF文件会原子覆盖掉原来的AOF文件

开启混合持久化命令

aof-use-rdb-preamble yes # 开启混合持久化

appendonly.aof文件中同时保存着RDB和AOF两种格式的数据

RDB、AOF、混合持久化对比

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

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

相关文章

【学习打卡】ZFNet深度学习图像分类算法

文章目录引言可以学到什么为什么叫ZFNetZFNet的网络结构简介方法:可视化反卷积反池化反激活反卷积训练细节大小裁剪层可视化特征可视化第 1 层第 2 层两边的对应关系更深的层第 3 层第 4 层第 5 层特征演化特征不变性实验简介图的分析模型改进:AlexNet局…

【愚公系列】2022年12月 Elasticsearch数据库-ELK添加中文分词器插件(三)

文章目录前言1.IK分词器2.pingying分词器一、ELK添加中文分词器插件1.IK分词器测试1.1 文件准备1.2 测试2.pingying分词器测试2.1 文件准备2.2 测试2.2.1 单个测试2.2.2 多个测试2.2.3 短语查询测试2.2.3.1 medcl2索引2.2.3.2 medcl3索引前言 分词器的作用是把一段文本中的词按…

Python学习基础笔记五十一——学校管理系统

完成一个作业: 1. 创建北京、上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格 4. 班级关联课程、讲师 5. 创建学员时,选择学校,关联…

从零开始搭建CentOS7虚拟机系统、MySQL5.7和Redis3服务

CentOS7搭建MySQL和Redis服务 为什么不直接搭建高版本的呢? 因为有些公司的环境就是低版本的,这些低版本的环境也需要学会如何搭建。 准备工作 搭建一个CentOS7系统 第一步:先下载一个CentOS7的iso文件 点击直接下载:https:…

Odoo丨如何改造Odoo原生form表单使其更好看

文章目录前言一、原生表单实现方式二、问题发现与分析1.项目中遇到问题2.问题具体分析三、具体解决方法第一步:把Span变成输入框第二步:改写_renderFieldWidget前言 Odoo作为快速搭建系统的框架,我们在利用它便捷高效功能的同时,…

踩坑记录:C++调用matlab生成的动态链接库

任务类别: 通常出现在项目中,使用 Matlab 设计算法,最后应用于 Qt 的应用程序中。 配置Vs2008环境:(PS:这里应该也同样能应用于其它版本) 一. 设置matlab库目录 选择“可执行文件”下拉框,添加:" ##…

【Redis】Docker 安装 Redis

Docker 安装 Redis 1、安装镜像 docker pull redis docker images docker run -d -p 6379:6379 redis docker ps docker exec -it 容器ID bash 2、验证Redis容器安装结果 redis- clipingset k1 v1 get k1 3、使用Redis需修改配置文件redis.conf。可通过:方法一&…

【Redis】Redis 内存淘汰策略

文章目录概述数据淘汰策略不进行数据淘汰策略进行数据淘汰策略在设置了过期时间的数据中进行淘汰在所有数据范围内进行淘汰查看与配置数据淘汰机制查看 Redis 的数据淘汰机制修改 Redis 的数据淘汰机制方法一方法二浅谈 LRU 算法和 LFU 算法LRU 算法LFU 算法概述 当我们往 Red…

勒索病毒防御 运维安全管控 | 某烟草公司数据安全建设实践

对于烟草行业而言,加快数字化转型是建设现代化烟草经济体系、实现高质量发展的重要支撑。但新技术的普及与应用,在给烟草行业带来便利、创造价值的同时,也使行业面临的数据安全威胁与日俱增。 在数据安全监管合规持续升级的大背景下&#xff…

《自己动手写CPU》学习记录(9)——第7章/Part 2

目录 引言 致谢 流水线暂停 指令说明 madd、maddu、msub、msubu 设计 宏定义文件 程序计数器模块 译码模块 执行模块 访存模块 HI LO 寄存器模块 通用寄存器模块 流水线控制模块 程序ROM MIPS32顶层 MIPS32 SOPC 仿真 仿真程序 TESTBENCH 仿真结果 引言 …

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之绘制

从 0 到 1 搞一个 Compose Desktop 版本的玩天气之绘制 上一篇文章 “从 0 到 1 搞一个 Compose Desktop 版本的玩天气之踩坑” 中大概说了下刚开始使用 Compose Desktop 会遇到的一些问题,帮大家踩了踩坑,那么这一篇则会带大家一起来看下项目中绘制的一…

网易开发三年,现跳槽蚂蚁花呗,4面顺利通过,拿下Java岗offer

面试准备 不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: 1. 自我介绍。(介…

ubuntu22.04LTS 内核源码编译,安装,卸载

下载内核源码 到网站 https://www.kernel.org/ 下载你自己版本的内核源码。 使用如下命令查看自己的内核版本 uname -r编译前准备 安装工具 sudo apt-get install libncurses5-dev libssl-dev build-essential openssl zlibc minizip libidn11-dev libidn11 libelf-dev bc…

困扰程序员50年的问题终于解决了,但好像又没完全解决......

闰秒,这个唯一能够让Meta、谷歌、微软等巨头同暴躁的Linux之父Linus Torvalds达成一致的存在,这个让无数程序员为之头疼的存在,终于要取消了! 今年第27届国际计量大会上,与会代表通过了一项决议——从2035年起暂停在官…

【车辆计数】光流法行驶车辆检测计数【含Matlab源码 627期】

⛄一、光流场简介 1 案例背景 运动视觉研究的内容是如何从变化场景中的一系列不同时刻的图像中提取有关场景中物体的形状、位置和运动的信息。根据研究的方法,它可以分为两类:基于特征的方法和基于光流场的方法。基于特征的方法抽取特征点,是…

动态磨砂玻璃渐变背景

网页特效代码合集 动态磨砂玻璃渐变背景 妙用滤镜构建高级感拉满的磨砂玻璃渐变背景 一个磨砂(毛玻璃)质感效果的渐变背景图,看上去是比较高级的。 这个效果使用 CSS 其实也可以非常轻松制作出来。本文就讨论讨论: 使用 CSS …

WIN10环境下 MYSQL免安装版配置

之前用的旧版本Mysql,还安装Workbench,感觉很冗余,卸了重装一个免安装版, 1、 MYSQL下载解压 MySQL官网下载地址:https://downloads.mysql.com/archives/community/ 点击Download下载免安装版,并进行解压 2、配置环…

02.Ioc容器加载过程-Bean的生命周期源码深度剖析

Spring源码编译教程 Spring IoC容器的加载过程 1.实例化化容器:AnnotationConfigApplicationContext : // 加载spring上下文 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(MainConfig.class);AnnotationConfi…

24岁程序媛实现了人生第一个小目标 | 2022年终总结

前言 大家好,我是伊人a。2022这一年我实现了人生中的第一个小目标-25岁前能够全款拿下宝马3系。耶比耶比🎉🎉🎉 2022年我是一个满眼星辰的的攀登者。 满眼星辰指的是我对未来充满希望且笃定不移, 攀登者指的是我在…

策略模式(State)

参考: 策略设计模式 (refactoringguru.cn) [5. 策略模式 — Graphic Design Patterns (design-patterns.readthedocs.io)](https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/state.html) [design-patterns-cpp/Strategy.cpp at master …