【Redis】持久化—RDB和AOF机制

目录

什么是持久化?

RDB(定期备份)

触发机制

bgsave命令的运作流程

RDB文件的处理

RDB文件

RDB的优缺点

AOF(实时备份)

AOF工作流程

 AOF 缓冲区同步⽂件策略

AOF重写机制

AOF重写流程

Redis根据持久化文件进行数据恢复

混合持久化


什么是持久化?

通过前面几篇文章的介绍我们知道Reids是把数据存储在内存中的,但是内存中的数据是不持久的,因为当发生极端异常情况时,内存中的数据是无法保留的,要想能够做到持久,就需要让Redis制定一定的策略把数据存放到磁盘中;在Redis重启的时候,将数据在恢复到内存中。

Redis ⽀持 RDB 和 AOF 两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题,
当下次重启时利⽤之前持久化的⽂件即可实现数据恢复。



RDB(定期备份)

RDB(Redis Datebase) 持久化是把当前进程数据⽣成快照保存到硬盘的过程,触发 RDB 持久化过程分为⼿动触发和
⾃动触发。

触发机制

手动触发

程序员通过Reids客户端,执行待定的命令,来触发快照生成;

⼿动触发分别对应 save 和 bgsave 命令:                                                                                       

  • save 命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为⽌,对于内存⽐较⼤的实例造成⻓时间阻塞,基本不采⽤。(这种行为类似于执行keys *的后果,所以一般不建议使用save)
  • bgsave 命令:Redis 进程执⾏ fork 操作创建⼦进程,RDB 持久化过程由⼦进程负责,完成后⾃动结束。阻塞只发⽣在 fork 阶段,⼀般时间很短。   

bgsave命令的运作流程

bgsave是主流的RDB持久化方式

  • 执⾏ bgsave 命令,Redis ⽗进程判断当前进是否存在其他正在执⾏的⼦进程,如 RDB/AOF ⼦进程,如果存在 bgsave 命令直接返回。
  • ⽗进程执⾏ fork 创建⼦进程,fork 过程中⽗进程会阻塞,通过 info stats 命令查latest_fork_usec 选项,可以获取最近⼀次 fork 操作的耗时,单位为微秒。
  • ⽗进程 fork 完成后,bgsave 命令返回 "Background saving started" 信息并不再阻塞⽗进程,可以继续响应其他命令。
  • ⼦进程创建 RDB ⽂件,根据⽗进程内存⽣成临时快照⽂件,完成后对原有⽂件进⾏原⼦替换。执⾏ lastsave 命令可以获取最后⼀次⽣成 RDB 的时间,对应 info 统计的 rdb_last_save_time 选项。
  • 进程发送信号给⽗进程表⽰完成,⽗进程更新统计信息。 

RDB文件的处理

  1. 保存:RDB ⽂件保存再 dir 配置指定的⽬录(默认 /var/lib/redis/)下,⽂件名通过 dbfilename配置(默认 dump.rdb)指定。可以通过执⾏ config set dir {newDir} 和 config set dbfilename{newFilename} 运⾏期间动态执⾏,当下次运⾏时 RDB ⽂件会保存到新⽬录。
  2. 压缩:Redis 默认采⽤ LZF 算法对⽣成的 RDB ⽂件做压缩处理,压缩后的⽂件远远⼩于内存⼤⼩,默认开启,可以通过参数 config set rdbcompression {yes|no} 动态修改。
  3. 校验:如果 Redis 启动时加载到损坏的 RDB ⽂件会拒绝启动。这时可以使⽤ Redis 提供的 redis-check-dump ⼯具检测 RDB ⽂件并获取对应的错误报告。

RDB文件

说明:

  • RDB ⽂件保存再 dir 配置指定的⽬录(默认 /var/lib/redis/)下的
  • 此文件是一个通过LZF算法生成的二进制文件,在这个文件的末尾进行修改的时候可能不会早场影响,在这个文件的中间或者开头进行修改的时候可能会造成Reids客户端无法重启;我们可以使用vim打开看看,但是切记不要进行任何的修改
  • 在子进程根据快照生成新的文件时,旧的文件依旧存在;当新的临时文件成功生成后,才会删除旧的文件,将新的文件改为配置文件;这样子进程进行重写时发生意外;
  • 执行依次flushall及对Reids客户端的key进行了清理,又对dump.rdb进行了清理;

验证save命令

当我们插入少量的数据时,可以执行save命令;因为它基本不会阻塞,会在一瞬间完成;根据查看同一个文件的inode,我们可以发现执行save命令前后文件的inode是不同的;使用vim打开文件查看时我们也是可以发现几个关键词我们可以看懂的。

验证bgsave命令 

 

自动触发

在Redis的配置文件中可以设置让Redis每隔过长时间/每产生多少次修改就触发,这个触发机制才是在实战中有价值的;

使⽤ save 配置。如 "save m n" 表⽰ m 秒内数据集发⽣了 n 次修改,⾃动 RDB 持久化。
从节点进⾏全量复制操作时,主节点⾃动进⾏ RDB 持久化,随后将 RDB ⽂件内容发送给从结点。
执⾏ shutdown 命令关闭 Redis 时,执⾏ RDB 持久化。

RDB的优缺点

  1. RDB 是⼀个紧凑压缩的⼆进制⽂件,代表 Redis 在某个时间点上的数据快照。⾮常适⽤于备份,全量复制等场景。⽐如每 6 ⼩时执⾏ bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中(如 hdfs)⽤于灾备。
  2. Redis 加载 RDB 恢复数据远远快于 AOF 的⽅式。
  3. RDB ⽅式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运⾏都要执⾏ fork 创建⼦进程,属于重量级操作,频繁执⾏成本过⾼。
  4. RDB ⽂件使⽤特定⼆进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有⻛险

AOF(实时备份)

AOF(Append Only File)持久化:以独⽴⽇志的⽅式记录每次写命令,重启时再重新执⾏ AOF
⽂件中的命令达到恢复数据的⽬的。AOF 的主要作⽤是解决了数据持久化的实时性,⽬前已经是Redis 持久化的主流⽅式。

AOF默认一般是关闭状态,需要修改配置文件并重启Redis,才能开启AOF功能;当 开启AOF的时候RDB就不生效了,启动的时候不在读取rdb文件内容了;

AOF是一个文本文件每次进行的操作,都会被记录到文本文件中,通过一些特殊的符号作为分隔符,来对命令的细节做出区分;

AOF机制并不是直接让工作线程把数据写入硬盘,而是写入一个内存中的缓冲区,积累一波后在统一写入硬盘;因此这也是AOF机制的一个弊端:当进程突然挂掉了,或者主机掉线了;缓冲区内的数据还没来得及写入硬盘中的数据是会丢失的;

AOF机制是每次把新的操作写入到原有问价的末尾,属于顺序写入;因为在磁盘上读写数据,顺序读写的速度时比较快的;

AOF工作流程

  1. 所有的写⼊命令会追加到 aof_buf(缓冲区)中。
  2. AOF 缓冲区根据对应的策略向硬盘做同步操作。
  3. 随着 AOF ⽂件越来越⼤,需要定期对 AOF ⽂件进⾏重写,达到压缩的⽬的。
  4. 当 Redis 服务器启动时,可以加载 AOF ⽂件进⾏数据恢复。AOF缓冲区文件同步策略

 AOF 缓冲区同步⽂件策略

刷新频率越高,性能影响越大,同时数据的可靠性就高

刷新频率越低,性能影响越小,数据的可靠性越低

可配置值说明
always命令写⼊ aof_buf 后调⽤ fsync 同步,完成后返回
everysec命令写⼊aof_buf 后只执⾏ write 操作,不进⾏fsync。每秒由同步线程进⾏ fsync。
no命令写⼊ aof_buf 后只执⾏ write 操作,由 OS 控制fsync 频率。

AOF重写机制

随着命令不断写⼊ AOF,⽂件会越来越⼤,为了解决这个问题,Redis 引⼊ AOF 重写机制压缩⽂
件体积。AOF ⽂件重写是把 Redis 进程内的数据转化为写命令同步到新的 AOF ⽂件。

原因如下:

  • 进程内已超时的数据不再写⼊⽂件。
  • 旧的 AOF 中的⽆效命令,例如 del、hdel、srem 等重写后将会删除,只需要保留数据的最终版本。
  • 多条写操作合并为⼀条,例如 lpush list a、lpush list b、lpush list 从可以合并为 lpush list a bc。

例如:当我们执行多条set命令插入数据的时候,是不是可以将这多条命令压缩成一条set命令;又或者我们执行多条del命令删除数据的时候,按照上面的思想也可以将多条del命令压缩成一条del命令;本质就是压缩指令。

这样做较⼩的 AOF ⽂件⼀⽅⾯降低了硬盘空间占⽤,⼀⽅⾯可以提升启动 Redis 时数据恢复的速度

AOF 重写过程可以⼿动触发和⾃动触发:

⼿动触发:调⽤ bgrewriteaof 命令。

⾃动触发:根据 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定⾃动触发时
机。

auto-aof-rewrite-min-size:表⽰触发重写时 AOF 的最⼩⽂件⼤⼩,默认为 64MB。

auto-aof-rewrite-percentage:代表当前 AOF 占⽤⼤⼩相⽐较上次重写时增加的⽐例。

AOF重写流程

1.执⾏ AOF 重写请求

如果当前进程正在执⾏ AOF 重写,请求不执⾏。如果当前进程正在执⾏ bgsave 操作,重写命令
延迟到 bgsave 完成之后再执⾏。

2.⽗进程执⾏ fork 创建⼦进程。

3.重写

  • 主进程 fork 之后,继续响应其他命令。所有修改操作写⼊ AOF 缓冲区并根据 appendfsync 策略同步到硬盘,保证旧 AOF ⽂件机制正确。
  • ⼦进程只有 fork 之前的所有内存信息,⽗进程中需要将 fork 之后这段时间的修改操作写⼊AOF 重写缓冲区中。

4.⼦进程根据内存快照,将命令合并到新的 AOF ⽂件中。

5.⼦进程完成重写                                                                                                                                a.新⽂件写⼊后,⼦进程发送信号给⽗进程。
b. ⽗进程把 AOF重写缓冲区内临时保存的命令追加到新 AOF ⽂件中。
c. ⽤新 AOF ⽂件替换⽼ AOF ⽂件。


Redis根据持久化文件进行数据恢复


混合持久化

由于AOF本来是按照文本的方式来写入文件的,但是文本的方式写文件后续加载的成本是比较高的;因此Reids结合RDB和AOF的特点引入了“混合持久化的方式;这种方式按照AOF的方式将每一个请求/操作都记录入文件;再触发AOF重写后,就会把当前内存的状态按照AOF文本的方式追加到文件的后面;


今天对Resid持久化的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2015款到18款奔驰GLC升级为2021款的HU6主机后,实现了触摸屏人机交互和Carplay功能

奔驰GLC是北京奔驰生产的一款中型SUV。有车主将2015款奔驰GLC升级为2021款的HU6主机后,实现了触摸屏人机交互和Carplay功能。该车主分享了使用体验: • Carplay功能:可以直接在车机大屏幕上显示导航、音乐和电话信息,让用户在开车…

联想SR650更换风扇后提示传感器异常“传感器Phy Presence Set已从正常状态转换至非紧急状态”

服务器型号:联想ThinkSystem SR650 故障现象:一台联想 ThinkSystem SR650服务器告警,面板和平台同时报风扇故障 告警信息如下图:(面板和平台同时告警) 接入bmc后查看发现是6号风扇告警 硬件这里已经无法识…

会C++了,想开始接触C#怎么办?|.Net 架构|从C++到C#的入门教学

前言 高质量博客汇总https://blog.csdn.net/yu_cblog/category_12379430.html成熟常用的开发工具和框架https://blog.csdn.net/yu_cblog/category_12737979.htmlDocker从认识到实践再到底层原理https://blog.csdn.net/yu_cblog/category_12424689.html操作系统和计算机网络从入…

[C++] 深入理解面向对象编程特性 : 继承

文章目录 继承的概念与定义继承的定义定义格式不同继承方式与继承的基类中访问限定符间的影响C中的继承和访问控制总结父类的private成员在子类中的访问限制protected成员的使用场景成员访问方式总结继承方式的默认值实际应用中的继承方式 示例代码 OOP中类之间的关系“is a” …

PLSQL导入导出ORACLE数据提示失败问题修改PLSQL配置

oracle中plsql导入提示无法导入问题 1.首先看下是否环境变量已经配置(具体配置看下面环境变量配置) 2.plsql数据导入中tools-->Preferences中配置如下框中的内容 3.设置 tnsnames.ora文件中看下是否设置有问题 4.PLSQL乱码问题 NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16…

性能测试工具之JMeter

JMeter Apache JMeter应用程序是开源软件,是一个100%纯Java应用程序,旨在负载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。 JMeter是一个免费、开源、跨平台的性能测试工具,于20世纪90年代后期面世。这是一个成熟、健全且具有…

湖南(市场调查)源点咨询 构建多元样本是如何改善调研结果的?

湖南(市场调研)源点咨询认为,大多数市场研究从业者更倾向于从单一数据源获取调研样本,然而在很多情况下,仅从单个数据源很难获得真正具有代表性的样本。 使用多元样本源有两大好处: ①能够捕获不愿加入样…

2024110读书笔记|《飞花令·月》——长安一片月,万户捣衣声,独出前门望野田,月明荞麦花如雪

2024110读书笔记|《飞花令月》——长安一片月,万户捣衣声,独出前门望野田,月明荞麦花如雪 《飞花令月》素心落雪 编著,飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”,类似于行酒令,是文人们…

Java数组篇[5]:数组的排序和查找

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…

1960-2020中国1km分辨率年均气温数据

数据简介 中国1km分辨率年均气温数据是在中国大陆2400多个站点的气温年统计结果的基础上,融合了NOAA Gsod中包括港澳台在内亚洲地区1300个站点的数据,使用Ansuplin插值软件生成的1960-2020年0.01(约1km)的网格数据。 Ansuplin基…

shell外壳与Linux权限

🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.shell命令以及运行原理2. Linux权限的概念3.Linux权限管理3.1 文件访问者的分类…

vue3前端开发-小兔鲜项目-添加购物车操作第一步

首先,呢,告诉大家一个坏消息,官方媒体的案例代码已经被他们删除了。如图所示。 也就是说,大家已经看不到官方的代码文件了。 那么既然如此,我们自己写的这个博客记录日志,就显得尤为重要了。继续今天的内容…

SuccBI+低代码文档中心 — 可视化分析(仪表板)(下)

制作仪表板 引入数据模型 仪表板所需模型已经在数据模块中准备好,可以将对应模型表添加到数据模型中。提供了两种添加方式: 在数据栏中点击添加按钮,在弹出框中通过搜索或直接在其所在目录下选中该模型,点击确定。 点击数据按钮…

一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现

目录 前言: 一、密码加密 1. MD5介绍 2.彩虹表攻击 3.测试复杂密码是否能被攻破 二、加盐算法 1.对密码123456演示加盐算法 2.盐值的储存 3.密码加盐思想总结 三、Java代码实现 前言: 早些年,数据泄露屡见不鲜,每个班上总…

【Web前端】vue3整合eslint约束代码格式

一、整合eslint 整合eslint的两种方式: 在已有项目中整合eslint:# 安装eslint及其vue插件即可 npm i -D eslint eslint-plugin-vue创建项目时整合eslint: 提示 是否引入ESLint用于代码质量检测 时选择 是# 创建vue3项目 npx create-vue # 下…

.NET8使用VS2022打包Docker镜像

NET8使用VS2022打包Docker镜像 1. 项目中添加Docker支持文件2. 自定义镜像名称3. 发布Docker镜像3.1 安装Docker3.2 控制台切换到项目根目录,执行以下命令发布镜像 3.3 修改镜像名称4. 保存镜像到本地 1. 项目中添加Docker支持文件 2. 自定义镜像名称 项目文件PropertyGroup节…

vue3中 ref 和 reactive 的区别

相同:均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同:ref用于包装JavaScript基本类型的数据(如字符串、数字、布尔值等),而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…

力扣45:跳跃游戏2题解

题目链接: https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 参考的代码随想录里面的题解: 题目 难度 中等,标的是中等难度,而且我之前做过这道题,但是我没写…

AI大模型赋能开发者|海云安创始人谢朝海受邀在ISC.AI 2024大会就“大模型在软件开发安全领域的应用”主题发表演讲

近日,ISC.AI 2024 第十二届互联网安全大会在北京国家会议中心盛大开幕。作为全球规格最高、规模最大、影响力最深远的安全峰会之一,本次大会以“打造安全大模型 引领安全行业革命”为主题,聚焦安全与AI两大领域,吸引了众多行业领袖…

【NLP】文本张量表示方法【word2vec、词嵌入】

文章目录 1、文本张量表示2、one-hot词向量表示2.1、one-hot编码代码实现:2.2、onehot编码器的使用2.3、one-hot编码的优劣势 3、word2vec模型3.1、模型介绍3.2、CBOW模式3.3、skipgram模式3.4、word2vec的训练和使用3.4.1、获取训练数据3.4.2、训练词向量3.4.3、查…