Redis:持久化RDB和AOF

目录

  • 概述
  • RDB
    • 持久化流程
    • 指定备份文件的名称
    • 指定备份文件存放的目录
    • 触发RDB备份
    • redis.conf 其他一些配置
    • rdb的备份和恢复
    • 优缺点
    • 停止RDB
  • AOF
    • 持久化流程
    • AOF启动/修复/恢复
    • AOF同步频率设置
    • rewrite压缩
      • 原理
      • 触发机制
      • 重写流程
      • no-appendfsync-on-rewrite
    • 优缺点
  • 如何选择

概述

Redis是一个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢失。

Redis的数据也支持写到硬盘中,这个过程就叫做持久化。

Redis提供了2种不同形式的持久化方式。

  • RDB(Redis DataBase)
  • AOP(Append Of File)

RDB

RDB是在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是键快照文件直接读到内存里。

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

持久化流程

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

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

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

在这里插入图片描述

指定备份文件的名称

在redis.conf中,可以修改rdb备份文件的名称,默认为dump.rdb,如下:
在这里插入图片描述

指定备份文件存放的目录

在redis.conf中,rdb文件的保存的目录是可以修改的,默认为Redis启动命令所在的目录,如下

在这里插入图片描述

触发RDB备份

方式1:自动备份,需配置备份规则

可在redis.conf中配置自动备份的规则,默认规则如下:
在这里插入图片描述

save用来配置备份的规则

save的格式: save 秒钟 写操作次数

默认是1分钟内修改了1万次,或5分钟内需修改了10次,或30分钟内修改了1次。

示例:设置20秒内有最少有3次key发生变化,则进行备份

save 20 3

方式2:手动执行命令备份(save | bgsave)

有2个命令可以触发备份。

**save:**save时只管保存,其他不管,全部阻塞,手动保存,不建议使用。

**bgsave:**redis会在后台异步进行快照操作,快照同时还可以响应客户端情况。

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

方式3:flushall命令

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

redis.conf 其他一些配置

1. stop-writes-on-bgsave-error

当磁盘满时,是否关闭redis的写操作。当redis无法写入磁盘的话,是否直接关掉redis的写操作,推荐yes。

在这里插入图片描述

rdbcompression

rdb备份是否开启压缩。对于存储到磁盘中的rdb快照文件,可以设置是否进行压缩,如果是的话,redis会采用LZF算法进行压缩。如果你不想小号CPU来进行压缩的话,可以设置为关闭此功能,推荐yes。
在这里插入图片描述

rdbchecksum

是否检查rdb备份文件的完整性。存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取最大的性能提升,可以关闭此功能。推荐yes。

rdb的备份和恢复

  1. 先通过config get dir 查询rdb文件的目录
    在这里插入图片描述

  2. 然后将rdb的备份文件 *.rdb 文件拷贝到别的地方

cp dump.rdb dump2.rdb
  1. rdb的恢复
  • 关闭redis
  • 先把备份的文件拷贝到工作目录 cp dump2.rdb dump.rdb
  • 启动redis,备份数据直接加载,数据被恢复

优缺点

优势

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

缺点

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

停止RDB

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

AOF

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

AOF默认不开启,可以在 redis.conf 文件中对AOF进行配置:

appendonly no # 是否开启AOF,yes:开启,no:不开启,默认为no 
appendfilename "appendonly.aof" # aof文件名称,默认为appendonly.aof
dir ./ # aof文件所在目录,默认./,表示执行启动命令时所在的目录,比如我们在/opt目录中,去执行redis-server /etc/redis.conf 来启动redis,那么dir此时就是/opt目录

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

持久化流程

  • 客户端的请求写命令会被append追加到AOF缓冲区内
  • AOF缓冲区会根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中
  • AOF文件大小超过重写策略或手动重写时,会对AOF文件进行重写(rewrite),压缩AOF文件容量
  • redis服务器重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的

在这里插入图片描述

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.config中配置AOF同步的频率。

有以下几种:

appendfsync always:每次写入立即同步,始终同步,每次redis的写入都会立刻记入日志;性能较差但数据完整性比较好。

appendfsync everysec:每秒同步,每秒同步,每秒记录日志一次,如果宕机,本秒数据可能丢失;更新的命令会放在内存中AOF缓冲区,每秒将缓冲区的命令追加到AOF文件。

appendfsync no:不主动同步,redis不主动进行同步,把同步交给操作系统。

rewrite压缩

原理

AOF采用文件追加方式,文件会越来越大,为了避免出现此情况,新增了重写机制,当AOF文件的大小超过锁审定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof触发重写。

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

触发机制

bgrewriteaof

手动触发重写。

从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, bgrewriteaof 仅仅用于手动触发重写操作。

redis会记录上次重写的aof大小,默认配置是当aof文件大小是上次rewrite后大小的2倍且文件大于64M时触发。

重写虽然可以节约大量磁盘空间,减少恢复时间,但是每次重写还是有一定负担的,因此设置redis满足一定条件才会进行重新。

auto-aof-rewrite-percentage

设置重写基准值。

设置重写的基准值,默认100,当文件达到100%时开始重写(文件是原来重写后文件的2倍时重写)。

auto-aof-rewrite-min-size

设置重写基准值。

设置重写的基准值,默认64MB,AOF文件大小超过这个值开始重写。

重写流程

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

在这里插入图片描述

no-appendfsync-on-rewrite

该参数表示在正在进行AOF重写时不会将AOF缓冲区中的数据同步到旧的AOF文件磁盘,也就是说在进行AOF重写的时候,如果此时有写操作进俩,此时写操作的命令会放在aof_buf缓存中(内存中),而不会将其追加到旧的AOF文件中,这么做是为了避免同时写旧的AOF文件和新的AOF文件对磁盘产生的压力。

默认是ON,表示关闭,即在AOF重写时,会对AOF缓冲区中的数据做同步磁盘操作,这在很大程度上保证了数据的安全性。

但在数据量很大的场景,因为两者都会消耗磁盘IO,对磁盘的影响较大,可以将其设置为“yes”减轻磁盘压力,但在极端情况下可能丢失整个AOF重写期间的数据。

如果no-appendfsync-on-rewrite为yes,不写入aof文件,只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)

如果no-appendfsync-on-rewrite为no,还是会把数据库往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)。

优缺点

优点

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

缺点

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

如何选择

官方推荐2个都启用。

如果对数据不敏感,可以单独用RDB。

不建议单独使用AOF,因为可能会出现BUG。

如果只是做纯内存缓存,可以都不用。

官网建议

RDB持久化方式能够在指定的时间间隔对你的数据进行快照存储;

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始数据,AOF命令以redis协议追加保存每次写的操作到AOF文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

如果只做缓存,你也可以不使用任何持久化方式。

其他情况建议同时开启两种持久化方式。在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。RDB更适合用于备份数据库,快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

性能建议:

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留 save 900 1 这一条;

如果使用AOF,好处是在最恶劣的情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了;

AOF的代价,一是带来持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据(aof_rewrite_buf)写到文件造成的阻塞几乎是不可避免的;

只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基数大小默认值64M(autoaof-rewrite-min-size)太小了,可以设置到5G以上;

默认超过原大小100%(auto-aof-rewrite-percentage)大小时重写可以改到适当的数值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu+Tesla V100环境配置

系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 查看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…

新时代线下门店如何能够降低创业者的风险?

随着社会的发展和科技的进步,共享经济已经渗透到生活的各个领域。在这个大背景下,共享门店共享股东的商业模式应运而生,为传统门店经营带来了全新的思路和方向。而下面这个故事诠释了一个普通青年的底层崛起之路。 在繁华的都市中&#xff0c…

5、Qt:项目中包含多个子项目(.pro)/子模块(.pri)

一、说明: 在进行项目开发过程中,会涉及子项目/子模块的问题 Qt中使用TEMPLATE subdirs添加多个子项目;子项目可以单独编译生成可执行文件(exe)或者动态链接库(dll)等,供其他模块…

阿里云ACE认证之国际版与国内版对比!

大厂疯狂裁员,互联网行业迎来寒冬,技术人员被动陷入疯狂内卷。在愈加内卷的IT领域,“云计算”作为少有的蓝海,无疑是打工人未来实现职场提升、摆脱内卷的绝佳选择! 对于云计算行业的人来说,最值得考的肯定是…

Linux中部署MongoDB

在 是一个必要的过程,因为MongoDB是一种流行的NoSQL数据库,它可以在大多数操作系统上使用。在本文中,我们将介绍如何在CentOS 8上部署MongoDB。 MongoDB的下载 您可以从MongoDB官网上下载最新的MongoDB版本。使用以下命令下载MongoDB&#…

C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

python的pandas中如何在dataframe中插入一行或一列数据?

dataframe类型是如何插入一行或一列数据的呢&#xff1f;这个需求在本文中将会进行讨论。相比较ndarray类型的同样的“数据插入”需求&#xff0c;dataframe的实现方式&#xff0c;则不是很好用。本文以一个dataframe类型变量为例&#xff0c;测试插入一行数据或者一列数据的方…

人力资源管理后台 === 登陆+主页鉴权

目录 1. 分析登录流程 2. Vuex中用户模块的实现 3.Vue-cli代理解决跨域 4.axios封装 5.环境区分 6. 登录联调 7.主页权限验证-鉴权 1. 分析登录流程 传统思路都是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页。 vue-elemen…

【心得】XXE漏洞利用个人笔记

XML中关于DTD类型(内部(SYSTEM)的和外部(PUBLIC)的区别) xxe的利用 XML Entity 实体注入 当程序处理xml文件时&#xff0c;没有禁止对外部实体的处理&#xff0c;容易造成xxe漏洞 危害 主流是任意文件读取 XML 文件 一般表示带有结构的数据 祖父 3个叔父 8个堂弟堂妹 …

App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法

&#x1f4dd; App备案与iOS云管理式证书 &#xff0c;公钥及证书SHA-1指纹的获取方法 引言 在iOS应用程序开发过程中&#xff0c;进行App备案并获取公钥及证书SHA-1指纹是至关重要的步骤。本文将介绍如何通过appuploader工具获取iOS云管理式证书 Distribution Managed 公钥…

Django(十一、auth认证模块)

文章目录 一、auth介绍auth认证相关模块及操作扩展auth_user表 一、auth介绍 Django自带一个admin路由&#xff0c;但是需要我们提供管理员账户和密码&#xff0c;如果想要使用admin后台管理&#xff0c;需要先创建表&#xff0c;然后创建管理员账户。 直接执行数据类迁移命令…

二、Lua数据类型

文章目录 一、数据类型nil二、数据类型boolean三、数据类型number四、数据类型String&#xff08;一&#xff09;用单引号或双引号&#xff1a;&#xff08;二&#xff09;可以包含换行的字符串&#xff08;三&#xff09;字符串与数字做数学运算时&#xff0c;优先将字符串转换…

抖音开新店,十个设置,实操满满全是干货

抖店开店的第一天手足无措不知从哪入手&#xff1f;我给大家分享一个新手开店必须完成的十个设置&#xff0c;实操满满全是干货&#xff0c;每一项都很重要&#xff01;特别是新手一定要认真看&#xff0c;因为这个直接关系到你店铺能否正常经营&#xff0c;跟着我一起来实操一…

C语言线性表的实现(详解)

数据结构之线性表 ​ 线性表的基本概念&#xff1a;线性表是由0个或者多个数据元素的有限序列 ​ 特性是&#xff1a; ​ 1&#xff1a;数据元素之间都是有顺序的 ​ 2&#xff1a;数据元素的个数是有限的&#xff0c; ​ 3&#xff1a;数据元素的类型是相同的 ​ 性质是&…

Java代码生成器,一键在线生成,支持自定义模板

【Java代码生成神器】自动化生成Java实体类、代码、增删改查功能&#xff01;点击访问 推荐一个自己每天都在用的Java代码生成器&#xff01;这个网站支持在线生成Java代码&#xff0c;包含完整的Controller\Service\Entity\Dao代码&#xff0c;完整的增删改查功能&#xff01…

给国外客户价格报低了怎么办

前一段时间有一个单子的货发出去了&#xff0c;被朋友提醒才发现自己报错了价格&#xff0c;造成了亏损&#xff0c;而报错价格的原因并不是自己看错了或者是抄错了价格&#xff0c;而是自己的脑子里记错了产品的价格列表。 如果不是朋友善意的提醒&#xff0c;大概我会一直错…

.NET的Dockerfile文件编写要点——以WOL项目为例

本文以 WOL 的.NET 项目为例&#xff0c;介绍了 Dockerfile 的基础知识和编写要点&#xff0c;旨在帮助读者更好地理解和掌握如何为 .NET 应用创建和优化 Dockerfile。 1. 背景 前面我们已经勾选了 Docker 容器化支持&#xff0c;项目已经生成了一个默认的 Dockerfile。但在实…

快速上手Banana Pi BPI-R4 MediaTek MT7988A 开源路由器开发板

基础开发 准备开发 * 准备8G以上TF卡、USB转串口线、Ubuntu系统* 使用 USB 串行电缆&#xff08;3.3V TTL&#xff0c;波特115200&#xff09;连接到 BPI-R4 上的调试控制台G接地&#xff1b;RXBPI-R4输入&#xff1b;TXBPI-R4输出* BPI-R4 引导程序和设备选择跳线设置* 例子…

部署Jenkins

一、介绍 Jenkins 、Jenkins概念 Jenkins是一个功能强大的应用程序&#xff0c;允许持续集成和持续交付项目&#xff0c;无论用的是什么平台。这是一个免费的源代码&#xff0c;可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允…

代码随想录算法训练营第五十天|309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费

LeetCode 309. 买卖股票的最佳时机含冷冻期 题目链接&#xff1a;309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 所谓的冷冻期&#xff0c;就是卖了股票后的第二天不能买入该股票&#xff08;股票上的N2,N1是今天卖明天能买)&#xff0c;所以影响到…