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

目录

1. RDB持久化

1.1 触发机制

 1.2 流程说明

1.3 RDB文件的处理

1.4 RDB机制演示

1.5 RDB的优缺点

2. AOF持久化

2.1 使用AOF与基本演示

2.2 AOF的工作流程

 2.3 文件同步(缓冲区刷新策略)

2.4 重写机制

2.5 AOF重写流程

 2.6 启动时数据恢复


持久化功能有效地避免因进程退出造成数据丢失问题当下次重启时利用之前持久化的文件即可实现数据恢复,(比如重启机器、机器故障之后恢复数据),或者是为了做数据同步(比如 Redis 集群的主从节点通过 RDB 文件同步数据)。

Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式:

  • 快照(snapshotting,RDB)
  • 只追加文件(append-only file, AOF)
  • RDB 和 AOF 的混合持久化(Redis 4.0 新增)


1. RDB持久化

RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB持久化过程分为手动触发和自动触发。Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用。

1.1 触发机制

1. 手动触发分别对应 save 和 bgsave 命令:

  • save 命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例造成长时间阻塞,基本不采用。
  • bgsave 命令:Redis 进程执行fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。

Redis 内部的所有涉及 RDB 的操作都采用类似 bgsave 的方式。

2. Redis 自动触发 RDB 持久化机制,这个触发机制才是在实战中有价值的。

  • 使用 save 配置。如"save m n" 表示 m 秒内数据集发生了n次修改,自动 RDB 持久化。(快照持久化是 Redis 默认采用的持久化方式,在 redis.conf 配置文件中默认有此下配置,后见1.4小节会详细讲)
  • 从节点进行全量复制操作时,主节点自动进行 RDB 持久化,随后将 RDB 文件内容发送给从结点。
  • 执行 shutdown 命令关闭 Redis 时,执行 RDB 持久化。

 1.2 流程说明

 bgsave 是主流的 RDB 持久化方式,上图是它的运作流程。

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

思考:如果当前Redis服务器中存储的数据特别多,内存消耗特别大(比如100GB),此时,进行上述的fork操作,是否会有很大的性能开销?

答:此时的性能开销,其实是挺小的。fork在进行内存拷贝的时候,不是简单无脑的直接把所有的数据都拷贝一遍,而是“写时拷贝”的机制来完成的!

具体来说,fork只会在内存被修改时才实际复制数据,而在未修改时,父子进程共享同一份物理内存。因此,即使有大量数据,内存的实际拷贝成本也能得到控制,从而在处理高内存使用情况下的性能影响降到最低。这使得Redis在高负载时仍然能够有效运行。

1.3 RDB文件的处理

保存

reids生成的rdb文件,存放在redis的工作目录中,也是在redis配置文件中进行设置的。

 打开目录看一看:

这里的 dump.rdb就是rbd机制生成的文件,以压缩的方式,保存到二进制文件中。(压缩需要消耗一定的cpu资源,但是能够节省存储空间)(Redis 默认采用 LZF 算法对生成的 RDB 文件做压缩处理,压缩后的文件远远小于内存大小,默认开启,可以通过参数 config set rdbcompression {yes|no} 动态修改。)

rbd持久化是可以被多次触发的,那么这个dump.rdb文件按照什么机制来“完成”的呢?

当执行生成rdb镜像操作的时候,此时会把要生成的快照数据,先保存到一个临时文件中,当快照要生成结束之后,再删除之前的rdb文件,把新生成的rdb文件名字修改成刚才的dump.rdb。


校验

如果 Redis 启动时加载到损坏的 RDB 文件会拒绝启动。这时可以使用 Redis 提供的 redis-check-dump 工具检测 RDB 文件并获取对应的错误报告。

这里的redis-check-rdb* 就是检查工具。


1.4 RDB机制演示

1. 连接到redis,清空数据,观察工作目录(/var/lib/redis)下的dump.rdb大概是什么样子:

2. 插入几个key-value数据,再次观察rdb文件:

此时看到是没有变化的,这是因为rdb触发时机并不是插入后就会立即更新的。我们前面提到手动触发和命令触发,两种方式都没能达到啊。手动触发没有使用可以理解,那么自动触发的条件究竟是怎么触发呢?

继续来看看redis的配置文件,在/etc/redis/redis.conf

save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。

可见我们现在的修改确实达不到,任何一种自动触发机制。【配置文件中的数值可以修改,但是要注意,修改的基本原则就是:生成一次rbd是一个比较高的成本,不宜让这个操作的执行过于频繁】

3. 手动触发RDB

虽然是二进制文件,但是隐隐约约才是能够看到rdb文件确实发生了变化。我们可以重启redis服务器来观察是否重启后,可以通过持久化的RDB文件来恢复数据。

4. 重启Redis,观察持久化是否成功

可以看到数据确实恢复了,哪怕redsi服务器重启,数据也是不会丢失的。因为它加载了rdb文件中的内容恢复到了之前的状态。

如果插入新的key后,没有通过手动bgsave来触发RDB机制,这时候重新启动Redis,服务中新添加的数据就会丢失。那么是不是这样的呢?

其实并不是这样的,除了手动触发之外:

  • 通过刚才配置文件中 save 执行 M 时间内,修改 N 次.…..
  • 通过 shutdown 命令(redis 里的一个命令) 关闭 redis 服务器,也会触发.(service redis-server restart)
  • redis 进行主从复制的对候,主节点也会自动生成 rdb 快照,然后把 rdb 快照文件内容传输给从节点

5. 继续添加新元素,然后使用service redis-server restart 重启服务

除了手动执行bgsave之外,也可以通过配置save配置文件来修改自动触发的条件。这里就不再演示。

1.5 RDB的优缺点

  • RDB 是一个紧凑压缩的二进制文件,代表 Redis 在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave 备份,并把 RDB 文件复制到远程机器或者文件系统中(如 hdfs)用于灾备。
  • Redis 加载 RDB 恢复数据远远快于 AOF 的方式。
  • RDB 方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork创建子进程,属于重量级操作,频繁执行成本过高。
  • RDB 文件使用特定二进制格式保存,Redis版本演进过程中有多个 RDB版本,兼容性可能有风险。

2. AOF持久化

AOF(Append Only File)持久化: 以独立日志的方式记录每次写命令,重启时再重新执行 AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是
Redis 持久化的主流方式。(当开启AOF后,RDB就不再生效)

2.1 使用AOF与基本演示

AOF默认是不开启的,需要通过配置文件配置:appendonly yes后,开启AOF。

修改完配置文件后,重启服务:service redis-server restart

添加新的数据

暴力kill redis服务,是否会恢复数据?

 从图中结果来看,数据是不会丢失的。符合我们的预期,以上就是大概的AOF持久化机制的基本使用过程。

2.2 AOF的工作流程

1. 所有的写⼊命令会追加到 aof_buf(缓冲区)中。
2. AOF 缓冲区根据对应的策略向硬盘做 同步操作 。 (具体是哪些文件同步策略下文2.3会详细介绍)这样可以减少写磁盘的次数。【缓冲区还是为了追求高的效率,如果 突然断电 ,缓冲区中的数据还没有来得及写磁盘,这时候还是会出现 数据丢失 的情况的】
3. 随着 AOF ⽂件越来越⼤,需要定期对 AOF ⽂件进⾏ 重写 ,达到压缩的⽬的。
4. 当 Redis 服务器启动时,可以加载 AOF ⽂件进⾏数据恢复。

 2.3 文件同步(缓冲区刷新策略)

Redis 提供了多种 AOF 缓冲区同步文件策略,由参数 appendfsync控制,不同值的含义如下所
示。刷新频率越高,性能影响就越大,同时数据的可靠性也就越高;反之则反。

always:刷新频率最高,数据的可靠性最高,但是性能最低;

everysec:刷新频率低一丢丢,数据的可靠性稍降低,性能同时稍高;(默认刷新方式

no:频率最低,数据可靠性也是最低,但是性能是最好的。

2.4 重写机制

随着命令不断写入AOF,文件会越来越大(redis重启后需要读取aof内容,太大的话肯定影响效率),为了解决这个问题,Redis 引入 AOF 重写机制压缩文件体积。AOF文件重写是把 Redis 进程内的数据转化为写命令同步到新的 AOF文件。重写后的 AOF为什么可以变小?有如下原因:

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

整体的思想就是剔除其中冗余的操作,并且合并一些操作(记录最终状态),能够达到aof的文件“瘦身”效果。

AOF 重写过程可以手动触发和自动触发:

  • 手动触发:调用 bgrewriteaof命令。
  • 自动触发:根据 auto-aof-rewrite-min-size和 auto-aof-rewrite-percentage 参数确定自动触发时机。
    • auto-aof-rewrite-min-size:表示触发重写时 AOF 的最小文件大小,默认为 64MB。
    • auto-aof-rewrite-percentage:代表当前 AOF 占用大小相比较上次重写时增加的比例。

当触发了AOF重写时,就会通过运行流程来执行重写。2.5节所示

2.5 AOF重写流程

 2.6 启动时数据恢复

当Redis启动的时候,会根据RDB和AOF文件的内容,进行数据恢复。


3. 总结

1. RDB(Redis Database)快照

优点

  • 性能影响较小:RDB持久化的过程由Redis在后台子进程执行,因此对主进程的读写性能影响较小。
  • 数据恢复速度快:由于RDB文件是一个紧凑的二进制文件,可以快速加载到内存中,因此数据恢复速度通常比AOF更快。
  • 适用于定期备份:RDB文件是完整的数据快照,适合用于定期全量备份,便于长期数据保存和迁移。

缺点

  • 数据丢失风险较高:RDB是定期执行的(默认每5分钟或1小时执行一次,视配置而定),因此在两次快照之间的数据将会丢失。如果Redis在快照完成之前崩溃,会导致最新的数据丢失。
  • 不灵活:RDB持久化只能定期执行,无法根据实际业务需求灵活地设置持久化频率。

2. AOF(Append-Only File)

优点

  • 数据丢失风险低:AOF记录每个写操作的日志,并支持多种同步策略(如每次写操作、每秒写操作、操作系统自动同步等),可以实现较高的数据持久化频率,最大程度减少数据丢失。
  • 更可控的持久化机制:AOF提供多种同步方式,用户可以根据性能与数据安全的需求调整同步频率,获得灵活的持久化控制。
  • 文件内容可读:AOF文件是以Redis命令格式保存的,具有可读性,方便用户对数据进行恢复和诊断。

缺点

  • 文件体积大:由于AOF会记录每一条写操作指令,随着时间的推移,文件会比RDB大得多,导致持久化文件占用大量磁盘空间。
  • 数据恢复速度较慢:AOF文件在恢复时需要逐条执行日志中的命令,因此恢复速度通常比RDB慢。
  • 对性能影响更大:频繁的写操作会导致性能开销,尤其是在设置为“每次写操作”同步时,对Redis的性能影响较大。

总结

  • RDB适用于:希望最小化对Redis性能影响、对数据持久化频率要求不高,或者需要定期备份的场景。
  • AOF适用于:对数据持久性要求高,不能接受较多数据丢失的场景,但需要注意性能和磁盘空间的占用。

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

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

相关文章

时序必读论文13|ICLR24 “又好又快”的线性SOTA时序模型FITS

论文标题:FITS: Modeling Time Series with 10k Parameters 开源代码:https://anonymous.4open.science/r/FITS/README.md 前言 FITS(Frequency Interpolation Time Series Analysis Baseline)这篇文章发表于ICLR2024&#xff…

Python自动化脚本,工作实现自动化附代码

Python是一种流行的编程语言,以其简洁和易读性而闻名。它提供了大量的库和模块,使其成为自动化各种任务的绝佳选择。 我们将探讨9个Python脚本及其代码,可以帮助您自动化各种任务并提高工作效率。无论您是开发人员、数据分析师还是只是想简化…

[EBPF] 实时捕获DM数据库是否存在SQL阻塞

1. 介绍 eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter(BPF),后者是由贝尔实验室开发的一种网…

Linux系统进程控制

目录 一、进程创建 1.进程创建过程 2.写时拷贝 3.fork函数的两种常规用法 二、进程终止 1.进程终止的三种情况 2.进程退出信息 (1)退出码 (2)退出信号 3.进程终止的方式 三、进程等待 1.为什么要有进程等待&#xff1f…

5个最佳开源RPA框架之一UI.Vision介绍

博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。技术范围: 目前专注java体系,以及golang、.Net、…

Golang优雅关闭gRPC实践

本文主要讨论了在 Go 语言中实现gRPC服务优雅关闭的技术和方法,从而确保所有连接都得到正确处理,防止数据丢失或损坏。原文: Go Concurrency — Graceful Shutdown 问题 我在上次做技术支持的时候,遇到了一个有趣的错误。我们的服务在 Kubern…

webshell-HTTP常见特征

一、总体特点 二、蚁剑 数据中可以看到一些明文字符串函数,响应中可以看到响应的明文数据。 ant特征以及对数据base64可以解码 chr类别的会出现大量的chr编码 大量的百分号字符 三、哥斯拉 第一个请求包很大 响应为0 密钥被拆分到数据前后 响应包cookie带&#xf…

SUP-NeRF-ECCV2024: 单目3D对象重建的新突破

2024-09-25,由Bosch Research North America和Michigan State University联合发布的SUP-NeRF,是一个基于单目图像进行3D对象重建的新型方法。一个无缝集成姿态估计和物体重建的统一网格。 ECCV:欧洲计算机视觉会议的缩写,它是计算…

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片(如 ESP32、ESP32-S2、ESP32-C3 等)提供 Ru…

学日语必备神器!这4款翻译APP你用过吗?

小伙伴们,你们有没有在日常生活或工作中遇到过需要翻译日语的场景呢?无论是阅读日本原著、工作文档还是和日本小伙伴交流,一个好的翻译工具绝对能成为你的贴心小助手;今天,我就来跟大家分享几款我个人非常喜欢的日语翻…

2024年合肥市职业院校技能大赛(中职组)赛 网络安全 竞赛样题

2024年合肥市职业院校技能大赛(中职组)赛 网络安全 竞赛样题 (总分100分) 培训、环境、资料、考证 公众号:Geek极安云科 网络安全群:624032112 网络系统管理群:223627079 网络建设与运维群:870959784 极安云科专注于技能提升&am…

数据结构与算法——Java实现 19.队列

目录 一、概述 二、链表实现队列 接口定义 接口实现类 测试类 三、环形数组实现队列 优点 下标计算 判满和判空 判满 判空 辅助变量size判空和判满 方法1 接口定义 接口实现类 测试类 方式2 接口定义 接口实现类 测试类 方法3 接口定义 接口实现类 测试类 生活鲜少给人留下退…

Nginx配置及部署前端项目,安排!

哈喽小伙伴们大家好!我是程序媛小李,一位正在往全栈方向发展的前端小姐姐,今天给大家分享一下在日常编码中我们是怎么使用nginx来部署前端项目的! Nginx安装 浏览器输入nginx,来到官网 右边找到doewnload&#xff0c…

短剧向左,体育向右,快手前途未卜?

最近,辗转于多项业务的快手收到了来自于市场“寓褒于贬”的评价。 麦格理发表报告表示,短剧业务正成为快手近期新的增长动力,亦维持对快手的正面看法,给予“跑赢大市”评级,预期上市前投资者出售2%股份对基本面没有太…

掌握AI提示词的艺术:应用、防护与成为提示词专家的策略

掌握好提示词的编写,可以用来做的事情: 写简历、输出面试题、输出ppt、思维导图、提取摘要、翻译、总结会议纪要、总结审计报告、数据分析、写广告/营销/请假等跟文字相关的文案、爆款文章、小说、写周报/月报。 如何写提示词 4大原则 1、 指令要精简…

Python精选200Tips:176-180

针对图像的经典卷积网络结构进化史及可视化 P176--LeNet-5【1988】模型结构说明模型结构代码模型结构可视化 P177--AlexNet【2012】模型结构及创新性说明模型结构代码模型结构可视化 P178--VGGNet【2014】VGG19模型结构及创新性说明VGG19模型结构代码VGG19模型结构可视化 P179-…

广东自闭症寄宿学校:为大龄自闭症儿童提供全寄宿制教育

在广东这片温暖的土地上,有一类特殊的孩子,他们以自己独特的方式感知世界,却往往因为自闭症的障碍而在成长的道路上步履维艰。为了给予这些大龄自闭症儿童更加全面、专业的关怀与教育,广东地区涌现出了一批自闭症寄宿学校&#xf…

Java中的Junit、类加载时机与机制、反射、注解及枚举

目录 Java中的Junit、类加载时机与机制、反射、注解及枚举 Junit Junit介绍与使用 Junit注意事项 Junit其他注解 类加载时机与机制 类加载时机 类加载器介绍 获取类加载器对象 双亲委派机制和缓存机制 反射 获取类对象 获取类对象的构造方法 使用反射获取的构造方法创建对象 获…

从0-1搭建海外社媒矩阵,详细方案深度拆解

做买卖,好的产品质量固然是关键,但如何让更多的消费者知道?营销推广是必不可少的。在互联网时代,通过社交媒体推广已经成为跨境电商卖家常用的广告手段。 如何通过海外社交媒体矩阵扩大品牌影响力,实现营销目标&#…

【开源项目】数字孪生智慧停车场——开源工程及源码

飞渡科技数字孪生停车场管理平台,基于国产数字孪生3D渲染引擎,结合数字孪生、物联网IOT,以及车牌自动识别、视频停车诱导等技术,实现停车场的自动化、可视化和无人化值守管理。 以3D可视化技术为基础,通过三维场景完整…