「Redis」07 持久化操作(RDB、AOF)

news2024/12/23 23:26:46

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程

Redis——持久化操作(RDB、AOF)

1. RDB(Redis DataBase)

概述

RDB是什么

  • 在指定的时间间隔内将内存中的数据集快照写入磁盘, 即 Snapshot 快照,恢复时是将快照文件直接读到内存里。

备份是如何执行的

  • Redis 会单独创建一个子进程(fork)来进行持久化
  • 将数据入到一个临时文件中,待持久化过程完成后,再将这个临时文件替换上次持久化好的文件(内容覆盖到 dump.rdb)。
  • 整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。
  • RDB 的缺点是最后一次持久化后的数据可能丢失

image-20220922111754078

Fork

  • 作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

  • Linux 程序中,fork() 会产生一个和父进程完全相同的子进程,但子进程在此后多会 exec 系统调用,出于效率考虑,Linux 中引入了 “写时复制技术”

  • 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程

RDB持久化流程

image-20220922113142962

redis.conf

  • dump 文件名字

    • redis.conf 中配置文件名称,默认为 dump.rdb

      image-20220922110536871

  • dump 保存位置

    • rdb 文件的保存路径可以修改。默认为 Redis 启动时命令行所在的目录下。

      image-20220922134225367

      image-20220922120419576

  • stop-writes-on-bgsave-error

    • redis 无法写入磁盘,直接关闭 redis 的写操作。推荐 yes

      image-20220922134154294

  • rdbcompression 压缩文件

    • 对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis 会采用 LZF 算法 进行压缩。

    • 如果你不想消耗 CPU 来进行压缩的话,可以设置为关闭此功能。推荐 yes

      image-20220922134209030

  • rdbchecksum 检查完整性

    • 在存储快照后,还可以让 redis 使用 CRC64 算法 来进行数据校验。

      • 即检查数据是否完整、是否有损坏。
    • 但是这样做会增加大约 10 % 10\% 10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。推荐 yes

      image-20220922134240433

save VS bgsave

RDB 持久化主要是通过savebgsave两个命令对Redis数据库中当前的数据做snapshot(快照)并生成 rdb 文件来实现的。在 Redis 启动的时候会检测 rdb 文件,然后载入 rdb 文件中未过期的数据到服务器中。

  • save时只管保存,其它不管,全部阻塞。手动保存。
  • bgsave是非阻塞的,通过 fork 了一个子进程来完成的。

savebgsave 的区别

  • save:直接调用 rdbSave函数 ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
  • bgsaveRedis 会在后台异步进行快照操作,快照同时还可以响应客户端请求。
    • fork 出一个子进程,子进程负责调用rdbSave函数,并在保存完成之后向主进程发送信号,通知保存已完成。
    • Redis 服务器在bgsave 执行期间仍然可以继续处理客户端的请求。

RDB 可以通过向服务器提供配置信息来自动间隔性保存。如默认情况下服务器满足以下 3 3 3 个条件中任意一个条件就会触发 bgsave 命令:

格式:
save 秒钟 写操作次数
save 900 1    // 服务器在900s(15min)之内,对数据库进行了至少1次修改
save 300 10   // 服务器在300s(5min)之内,对数据库进行了至少10次修改
save 60 10000 // 服务器在60s(1min)之内,对数据库进行了至少10000次修改

RDB 是整个内存的压缩过的 SnapshotRDB 的数据结构,可以配置复合的快照触发条件。

默认是 1 1 1 分钟内改了 10000 10000 10000 次,或 5 5 5 分钟内改了 10 10 10 次,或 15 15 15 分钟内改了 1 1 1 次。

这种持久化方式被称为快照 snapshotting

  • 禁用

    • 不设置 save 指令,或者save 传入空字符串

    • 动态停止 RDBredis-cli config set save "" # save后给空值,表示禁用保存策略

      image-20220922134052875

可以通过lastsave命令获取最后一次成功执行快照的时间。

执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义。

rdb的备份

  • 先通过config get dir:查询 rdb 文件的目录

  • *.rdb的文件拷贝到别的地方

    • cp dump.rdb dump2.rdb
  • rdb 的恢复

    • 关闭 Redis
    • 先把备份的文件拷贝到工作目录下:cp dump2.rdb dump.rdb
    • 启动 Redis, 备份数据会直接加载

优点

  • 适合大规模的数据恢复;
  • 对数据完整性和一致性要求不高更适合使用;
  • 节省磁盘空间
  • 恢复速度快

缺点

  • Fork 的时候,内存中的数据被克隆了一份,大致 2 2 2 倍的膨胀性需要考虑。
  • 虽然 Redisfork 时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
  • 在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉的话,就会丢失最后一次快照后的所有修改。

小总结

image-20220922122323962

2. AOF(Append Only File)

概述

日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有指令记录下来(读操作不记录)只许追加文件但不可以改写文件Redis 启动之初会读取该文件重新构建数据,换言之,如果 Redis 重启就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF 持久化流程

  • 客户端的请求写命令会被 append 追加到 AOF 缓冲区内;

  • AOF 缓冲区根据 AOF 持久化策略 [always,everysec,no] 将操作 sync 同步到磁盘的 AOF 文件中;

  • AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 Rewrite 重写,压缩 AOF 文件容量;

  • Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的。

    image-20220922143832996

AOFRDB 同时开启时,系统默认读取 AOF 的数据(数据不会存在丢失)。

配置

  • AOF 默认不开启

    • 此时我们将 AOF 开启,改为 yes

    image-20220922143216278

  • 文件名字

    • 可以在redis.conf中配置文件名称,默认为 appendonly.aof
    • AOF 文件的保存路径,同 RDB 的路径一致。

    image-20220922143237262

    image-20220922155529774

  • AOF 启动/修复/恢复

    AOF 的备份机制和性能虽然和 RDB 不同,但是备份和恢复的操作同 RDB 一样,都是拷贝备份文件,需要恢复时再拷贝到 Redis 工作目录下,启动系统即加载。

    • 正常恢复
      • 修改默认的 appendonly no,改为 yes
      • 将有数据的 aof 文件复制一份保存到对应目录(查看目录:config get dir)
      • 恢复:重启 redis 然后重新加载
    • 异常恢复
      • 修改默认的 appendonly no,改为 yes
      • 如遇到 AOF 文件损坏,通过/usr/local/bin/redis-check-aof--fix appendonly.aof进行恢复
      • 备份被写坏的 AOF 文件
      • 恢复:重启 redis,然后重新加载
  • AOF 同步频率设置

    • appendfsync always
      • 始终同步,每次 Redis 的写入都会立刻记入日志;
      • 性能较差但数据完整性比较好。
    • appendfsync everysec(推荐 并且也是默认)
      • 每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
      • 这种策略可以兼顾速度和安全性。
    • appendfsync no
      • Redis 不主动进行同步,把同步时机交给操作系统。

    image-20220922143311476

Rewrite 重写压缩

  • AOF 采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当 AOF 文件的大小超过所设定的阈值时,Redis 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。

  • 执行命令 bgrewriteaofRedis 会将 AOF 文件的内容压缩,生成一个新的 AOF 文件,只保留可以恢复数据的最小指令集。

    • Redis2.2 需要自己手动执行 bgrewriteaof 命令;Redis2.4 则可以自动触发 AOF 重写
    set k1 v1
    set k2 v2
          ↓
    set k1 v1 k2 v2
    

重写原理,如何实现重写

  • AOF 文件持续增长而过大时,会 fork 出一条新进程来将文件重写(也是先写临时文件最后再 rename),redis4.0版本后的重写,是指就是把 rdb 的快照,以二级制的形式附在新的 aof 头部,作为已有的历史数据,替换掉原来的流水账操作。

no-appendfsync-on-rewrite

  • 如果 no-appendfsync-on-rewrite=yes,不写入 aof 文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)
  • 如果 no-appendfsync-on-rewrite=no, 还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)

触发机制,何时重写

  • Redis 会记录上次重写时的 AOF 大小,默认配置是当 AOF 文件大小是上次 rewrite 后大小的一倍且文件大于 64M 时触发
  • 重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定 Redis 要满足一定条件才会进行重写。
  • auto-aof-rewrite-percentage:设置重写的基准值,文件达到 100 % 100\% 100% 时开始重写(文件是原来重写后文件的 2 2 2 倍时触发)
  • auto-aof-rewrite-min-size:设置重写的基准值,最小文件 64MB。达到这个值开始重写。
  • 例如:文件达到 70MB 开始重写,降到 50MB,下次什么时候开始重写?100MB
  • 系统载入时或者上次重写完毕时,Redis 会记录此时 AOF 大小,设为 base_size
  • 如果 Redis AOF 当前大小 >= base_size + base_size×100%(默认)且 当前大小 >=64mb(默认)的情况下,Redis 会对 AOF 进行重写。

image-20220922143524347

重写流程

  • bgrewriteaof 触发重写,判断是否当前有 bgsavebgrewriteaof 在运行,如果有,则等待该命令结束后再继续执行。
  • 主进程 fork 出子进程执行重写操作,保证主进程不会阻塞。
  • 子进程遍历 redis 内存中数据到临时文件,客户端的写请求同时写入 aof_buf 缓冲区和 aof_rewrite_buf 重写缓冲区保证原 AOF 文件完整以及新 AOF 文件生成期间的新的数据修改动作不会丢失。
  • 子进程写完新的 AOF 文件后,向主进程发信号,父进程更新统计信息。
    • 主进程把 aof_rewrite_buf 中的数据写入到新的 AOF 文件。
  • 使用新的 AOF文件覆盖旧的 AOF 文件,完成 AOF 重写。

image-20220922155045827

优点

  • 备份机制更稳健,丢失数据概率更低;
  • 可读的日志文本,通过操作 AOF 稳健,可以处理误操作。

缺点

  • 比起 RDB 占用更多的磁盘空间;
  • 恢复备份速度要慢;
  • 每次读写都同步的话,有一定的性能压力;
  • 存在个别 Bug,造成不能恢复。

小总结

image-20220922143649566

3. 总结

Ⅰ. 用哪个好

  • 官方推荐两个都启用。
  • 如果对数据不敏感,可以选单独用 RDB
  • 不建议单独用 AOF,因为可能会出现 Bug
  • 如果只是做纯内存缓存,可以都不用。

Ⅱ. 官网建议

  • RDB 持久化方式能够在指定的时间间隔能对你的数据进行快照存储
  • AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据, AOF 命令以 redis 协议追加保存每次写的操作到文件末尾
  • Redis 还能对 AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大
  • 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
  • 同时开启两种持久化方式
    • 在这种情况下,当 redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整
  • RDB 的数据不实时,同时使用两者时服务器重启也只会找 AOF 文件。那要不要只使用 AOF 呢?
  • 建议不要,因为 RDB 更适合用于备份数据库(AOF 在不断变化不好备份),快速重启,而且不会有 AOF 可能潜在的 bug,留着作为一个万一的手段。
  • 性能建议
    • 因为 RDB 文件只用作后备用途,建议只在 Slave 上持久化 RDB 文件,而且只要 15 15 15 分钟备份一次就够了,只保留 save 900 1 这条规则。
    • 如果使用 AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只 load 自己的 AOF 文件就可以了。
    • 代价,一是带来了持续的 IO,二是 AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。
    • 只要硬盘许可,应该尽量减少 AOF rewrite 的频率,AOF 重写的基础大小默认值 64M 太小了,可以设到 5G 以上。
    • 默认超过原大小 100 % 100\% 100% 大小时重写可以改到适当的数值。
      文件就可以了。
    • 代价,一是带来了持续的 IO,二是 AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。
    • 只要硬盘许可,应该尽量减少 AOF rewrite 的频率,AOF 重写的基础大小默认值 64M 太小了,可以设到 5G 以上。
    • 默认超过原大小 100 % 100\% 100% 大小时重写可以改到适当的数值。

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

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

相关文章

实战 Creator 2.x 项目升级 3.x!避坑要点与基础 API 写法差异总结

最近,我将自己在 Cocos Store 上的一个 2D 项目《球球要回家》从 Creator 2.2.2 升级到 Creator 3.6.2,编程语言也从 JavaScript 全面升级至 TypeScript 并适配微信小游戏,目前在微信审核中!本篇文章就来跟大家分享一下&#xff0…

发布3天获推荐10w+,视频号内容出现新玩法?

上月,腾讯发布Q3季度财报,视频号也被重点提及,广告主对其早前上线的原生信息流广告需求强劲,像首批投放的阿玛尼等品牌的广告还曾引起过不少讨论。用户对视频号广告的关注热度高,也从侧面说明,视频号目前的…

大数据流批一体

流批一体的内涵 流批一体中的“流批”是指流处理与批处理,是两种不同的数据处理方式,而不是对数据种类的划分。具体来说,数据可以按产生的时间划分为历史数据与实时数据,亦可按数据的明细程度分为流水数据与切片数据;数…

VS2022环境下C++ DLL动态链接库的编写和调用

一、编写DLL动态链接库 1、新建动态链接库项目 2、新建类 3、宏定义 #ifdef DLL_API # define DLL_API _declspec(dllexport) # else # define DLL_API _declspec(dllimport) #endif 4、使用宏定义修饰类 /*h*/ #pragma once#ifdef DLL_API # define DLL_API _declspec(dl…

ad2019--LED灯按键类创建元件库

摘自凡亿教育 一、LED灯按键类创建元件库 1.绘制LED灯的原理图库 鼠标右击箭头所指的,然后选择倒数第三个,多边形 在画的时候可以按住,shift空格,来调整角度。 但是,一般的LED灯都是蓝色的,我们可以把它…

用MybatisPlus代码生成器生成代码

作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注&…

用帝国主义竞争算法(ICA)求解旅行商问题(TSP)(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

两大产品上线“粤复用”,赋能大数据智能行业发展

为深入贯彻落实国家《关于加强数字政府建设的指导意见》关于数字政府应用“一地创新、各地复用”的部署要求,促进优秀应用成果快速、可靠、低成本地复用推广,正式上线广东数字政府应用超市——“粤复用”。据悉,“粤复用”应用超市汇聚各级政…

spring-aop源码分析(2)_AnnotationAwareAspectJAutoProxyCreator后置处理器

本文将通过阅读AnnotationAwareAspectJAutoProxyCreator后置处理器的源码,分析其解析AOP通知、匹配切入点和创建AOP代理的流程。 入口 AnnotationAwareAspectJAutoProxyCreator是一个BeanPostProcessor实现,他在容器进行initializeBean的时候被调用&am…

[附源码]计算机毕业设计汽车美容店管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

TDH社区版上新宽表数据库Hyperbase,轻松实现海量数据的毫秒级精确检索

日前,为了降低用户接触使用大数据技术的门槛以及成本,星环科技推出TDH社区版(Transwarp Data Hub Community Edition)来帮助企业用户、高校师生、科研机构以及其他专业开发人更简单、更便捷的进行大数据分析。为了满足更多用户在存…

IT统一运维软件发展趋势浅析

在企业IT数字化转型趋势下,为支撑业务敏捷、稳定、创新发展,IT运维的重要性已日益凸显。伴随着IT运维管理目标、管理范围、管理对象及管理深度的转变,IT运维平台建设呈现管理一体化、规模扩大化、业务可视化、运维自动化、运维智能化的关键趋…

成功实施企业内容管理(ECM)的 5 个技巧

成功实施企业内容管理(ECM)的 5 个技巧 俗话说,唯一不变的就是变化。在您不懈努力发展业务的过程中,您需要改变业务流程、不断升级产品、使用技术实现自动化、让您的员工和客户满意。 改变管理方式是实施企业内容管理的一个关键考…

Vue Element UI 中 el-table 树形数据 tree-props 多层级使用避坑

实现效果: element官网提示设置tree-props为{children: ‘children’,hasChildren: ‘hasChildren’},data数据需要设置children和hasChildren属性,row-key也绑定了数据的唯一值变量id,但是树形结构的第三级就是出不来 如图 可以…

02、交换机

目录 1.、Exchange(交换机)的作用 2、Exchange(交换机)的类型 2.1.直连交换机:Direct Exchange 2.2.主题交换机:Topic Exchange 2.3.扇形交换机:Fanout Exchange 2.4.首部交换机:Headers exchange 2.5.默认交换机 2.6.Dead…

MySQL基础三问:底层逻辑、正在执行、日志观察

背景及目录: 经常面试会遇到且实际工作中也会应用到的三个场景: 一.mysql查询时的底层原理是什么? 二.如何查看正在执行的mysql语句? 三.如何观察mysql运行过程中的日志信息? - - - - - - - - - -分割线- - - - -…

【html5期末大作业】基于HTML+CSS+JavaScript管理系统页面模板

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

pyinstaller 操作以及常见问题解决

最近有需要用pyinstaller打包 直接上命令: pyinstaller -F xxx.py -w -i img.ico-F 指定需要打包的主文件,-w是让打包后的exe,运行不再出现cmd框,一般打包都会加上,-i 是指定打包后的图标ico文件 在线生成ico链接&am…

(14)点云数据处理学习——RGBD 里程计

1、主要参考 (1)官网 RGBD Odometry — Open3D 0.16.0 documentation 2、原理和实现 2.1 RGBD Odometry主要作用 RGBD里程计在两个连续的RGBD图像对之间查找相机运动。输入是RGBDImage的两个实例。输出是刚体变换形式的运动。Open3D实现了[Steinbruc…

Transformer——台大李宏毅详讲Transformer

文章目录李宏毅老师讲TransformerEncoderDecoderDecoder整体逻辑non-autoregressiveDecoder中的Cross Attention训练Seq2seq的一些Tips老师讲的超级棒,激动哭了: 视频链接:台大李宏毅21年机器学习课程 self-attention和transformer 李宏毅老师…