Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Redis持久化 aof和rdb的原理

Redis持久化 aof和rdb的原理

作者头像
ITer.996
发布于 2022-11-22 06:56:03
发布于 2022-11-22 06:56:03
69800
代码可运行
举报
文章被收录于专栏:PHPer技术栈PHPer技术栈
运行总次数:0
代码可运行

一.介绍

由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。

redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时 dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)

本篇为综合整理的文档,若要深入了解可查阅Redis官网文档

二.RDB持久化(全量写入)

rdb原理

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发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)进程发送信号给父进程表示完成,父进程更新统计信息,具体见info Persistence下的rdb_*相关选项。

rdb模式

SAVE 阻塞式的RDB持久化,当执行这个命令时间时rdis的主进程把内存里的数据库状态写入到rdb文件中,直到该文件创建完毕的这段时间内redis讲不能处理任何命令请求

BGSAVE 非阻塞式的持久化,它会创建一个子进程,专门去把内存中的数据库状态写入RDB文件,同时主进程还可以处理来自客户端的请求命令,但子进程基本是复制父进程,这等于两个相同大小的redis进程在系统上运行,会造成内存使用率的大幅增加。

rdb触发情况

1.手动执行bgsave或save命令 2.根据配置文件的save选项自动触发 3.主从结构时,从节点执行全量复制操作,主节点自动执行,将生成的RDB文件发送给从 4.执行debug reload命令重新加载Redis时 5.默认情况下执行shutdown命令关闭redis时,如果没有开启AOF持久化功能则自动执行

rdb优势和劣势

优势:

  • 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对可以定时每天可以备份出一个整个的数据文件。
  • 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。
  • 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

劣势:

  • 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
  • RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。

rdb文件配置

redis.conf文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#注释所有save行则停止rdb持久化

#900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)

save 900 1

#300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)

save 300 10
#60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)

save 60 10000
#当RDB持久化出现错误后,再写入数据会报错,用于提示用户出问题了。

#yes是开启,no是关闭,默认开启

stop-writes-on-bgsave-error yes
#是否压缩rdb文件,rdb文件压缩使用LZF压缩算法,压缩会消耗一些cpu,不压缩文件会很大

#yes开启,no关闭,默认开启

rdbcompression yes
#使用CRC64算法来进行数据校验,防止RDB是错误的,但是这样做会增加大约10%的性能消耗

#yes开启,no关闭,默认开启

rdbchecksum yes

rdb命令配置

阻塞当前Redis服务器 直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。 save

Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。 bgsave

查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。 info stats

rdb数据恢复

1.将RDB备份放到配置文件指定的数据目录下,启动redis将会自动恢复。加载期间将会阻塞,无法进行其它操作。

2.上述方法不行,或者恢复的集群,可以使用redis-migrate-tool工具进行恢复。

三.AOF持久化(增量写入)

aof原理

以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

写入的数据具有可读性,同步时先写入缓冲区,再放入硬盘。如果直接写入硬盘,性能将取决于磁盘负载,并且放到缓冲区,可以提供各种同步策略。

过程:

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

aof触发情况

1.根据配置文件自动触发

aof优势和劣势

优势:

  • 该机制可以带来更高的数据安全性,即数据持久性。根据策略不同,从而对数据安全性不同,可以在性能和安全区选择一个。
  • 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。
  • 如果日志过大,将自动启用rewrite机制。以append模式不断的将修改数据写入到老的磁盘文件中,同时还会创建一个新的文件用于记录此期间有哪些修改命令被执行,保证安全性。
  • AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

劣势:

  • 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
  • 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

aof文件配置

在Redis的配置文件中存在三种同步方式,它们分别是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#是否开启aof持久化。默认no,要打开

appendonly yes

#位置

appendfilename "appendonly.aof"

#每次有数据修改发生时都会写入AOF文件

#命令写入aof_buf后调用系统fsync操作同步AOF文件,fsync完成后线程返回

appendfsync always

#每秒钟同步一次,该策略为AOF的缺省策略

#命令写入aof_buf后调用系统write操作,write完成后线程返回。fsync同步文件操作由专门线程每秒调用一次

#这个模式兼顾了效率的同时也保证了数据的完整性,即使在服务器宕机也只会丢失一秒内对redis数据库做的修改

appendfsync everysec

#不加入缓冲区,直接写到硬盘,速度最快,不安全

#命令写入aof_buf后调用系统write操作,不对aof文件做fsync同步,同步硬盘操作由操作系统负责,通常同步周期最长30秒

#这种模式下效率是最快的,但对数据来说也是最不安全的,如果redis里的数据都是从后台数据库如mysql中取出来的,属于随时可以找回或者不重要的数据,那么可以考虑设置成这种模式。

appendfsync no

aof命令配置

aof文件重写手动触发 bgrewriteaof

aof文件重写自动触发,配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#新的aof文件大小是上次的aof文件的大小2倍(100)时,进行重写

auto-aof-rewrite-percentage 100

#表示运行AOF重写时文件最小体积, 默认为64MB

auto-aof-rewrite-min-size 64mb

aof数据恢复

  • 将AOF备份放到配置文件指定的数据目录下,启动redis将会自动恢复。加载期间将会阻塞,无法进行其它操作。
  • 上述方法不行,或者恢复的集群,可以使用redis-migrate-tool工具进行恢复。
  • 可以使用pipline方式批量硬写入,但效率会低

四.总结

二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。

启动加载流程:

  • AOF持久化开启且存在AOF文件时, 优先加载AOF文件
  • AOF关闭或者AOF文件不存在时, 加载RDB文件
  • 加载AOF/RDB文件成功后, Redis启动成功
  • AOF/RDB文件存在错误时, Redis启动失败并打印错误信息
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHPer技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis的持久化机制,RDB 和 AOF 原理
在Redis重启的时候,如何把数据恢复,保持一致性,这就涉及Redis的持久化机制了。
HaC
2020/12/30
1.5K0
Redis的持久化机制,RDB 和 AOF 原理
深入剖析Redis高可用:持久化 AOF和RDB
2T学习视频教程+电子书 免费送:BAT面试精讲视频,亿级流量秒杀系统,分布式系统架构,中间件消息队列,Python Go入门到精通,Java实战项目,Linux, 网络,MySQL高性能,Redis集群架构,大数据,架构师速成,微服务,容器化Docker K8s, ELK Stack日志系统等免费视频教程!
码农富哥
2020/06/21
1.2K0
精讲Redis持久化前言一、Redis高可用概述二、Redis持久化概述三、RDB持久化四、AOF持久化五、方案选择与常见问题六、总结
前言 在上一篇文章中,介绍了Redis内存模型,从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999% 等等)。但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需
Java架构
2018/06/19
6690
Redis持久化
Redis为了保证运行的安全性,防止因进程退出或者其它系统原因导致的数据丢失问题,于是提供了持久化技术。在Reids中我们可以使用RDB和AOF两种机制来使用Reids持久化功能。下面我分别看一下这两种机制的区别及具体使用方法。
吉林乌拉
2019/10/30
1K0
Redis持久化
【玩转Redis面试第3讲】一次性将Redis RDB持久化和AOF持久化讲透
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
爱笑的架构师
2020/09/24
7590
【玩转Redis面试第3讲】一次性将Redis RDB持久化和AOF持久化讲透
Redis 持久化: RDB 和 AOF
Redis 是基于内存的数据库, 服务一旦宕机, 内存中的数据将全部丢失. 通常来说可以通过数据库来恢复这些数据, 但这会给数据库带来非常大的读压力, 并且这个过程会非常缓慢, 并导致程序响应慢, 因此 Redis 提供了把内存数据持久化到硬盘, 并通过备份文件来恢复数据的功能, 即持久化机制.
joelzychen
2023/03/08
3610
Redis 持久化: RDB 和 AOF
AOF持久化
由于需要记录Redis的每条写命令,因此AOF不需要触发,下面介绍AOF的执行流程。 AOF的执行流程包括: 命令追加(append):将Redis的写命令追加到缓冲区aof_buf; 文件写入(write)和文件同步(sync):根据不同的同步策略将aof_buf中的内容同步到硬盘; 文件重写(rewrite):定期重写AOF文件,达到压缩的目的。
用户5546570
2020/02/13
9010
Redis持久化 aof和rdb的原理配置(上)
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。
陈不成i
2021/05/20
4390
Redis---持久化
Redis是内存数据库,是把数据存储在内存中的,但是内存中的数据不是持久的,如果想要做到持久,那么就需要让redis将数据存储到硬盘上。
二肥是只大懒蓝猫
2024/03/01
1730
Redis---持久化
Redis持久化存储详解(一)
持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的丢失,因为当服务器关机等一些异常情况都会导致存储在内存中的数据丢失。
兔云小新LM
2019/07/24
1.4K0
Redis持久化存储详解(一)
不说全网最全面redis持久化,也敢说前10
3、还有续篇(总结、注意点、选择点)底部第 5 部分,会告知原因。
八点半的Bruce、D
2021/08/05
2720
Redis持久化RDB&AOF
RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据。
Se7en258
2021/05/18
3550
Redis持久化RDB&AOF
Redis:持久化
持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
灰子学技术
2020/10/10
5740
Redis:持久化
Redis持久化 - RDB和AOF
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。 持久化Redis所有数据保持在内存中,对数据的更新将异步地保存到磁盘上。
BUG弄潮儿
2020/09/23
3730
Redis持久化 - RDB和AOF
【Redis入门到精通七】详解Redis持久化机制(AOF,RDB)
RDB 持久化是把当前进程数据⽣成快照(二进制文件)保存到硬盘的过程,触发 RDB 持久化过程分为⼿动触发和自动触发。
小皮侠
2024/09/27
2200
【Redis入门到精通七】详解Redis持久化机制(AOF,RDB)
一文搞懂Redis持久化
文章目录 1. 前言 2. RDB 2.1. 手动触发 2.2. 自动触发 2.3. RDB执行流程 2.4. RDB的优点 2.5. RDB的缺点 3. AOF 3.1. 如何开启AOF 3.2. AOF整体的执行流程 3.3. 命令写入 3.4. 文件同步 3.5. 文件重写机制 3.6. AOF的优点 3.7. AOF的缺点 4. AOF和RDB的区别 5. 重启加载 6. 性能问题与解决方案 7. 总结 前言 Redis目前已经成为主流的内存数据库了,但是大部分人仅仅是停留在会用的阶段,你真的了
爱撒谎的男孩
2020/04/22
3790
redis系列:RDB持久化与AOF持久化
Redis的数据都是存储在内存中的,所以Redis持久化也就是要把Redis存储在内存中的数据保存到硬盘。
云枭
2018/08/25
6250
深入理解Redis的持久化机制
由于redis所有数据一般都在内存中,如果不进行配置持久化,redis一旦发生重启操作,数据全部丢失掉,所以就需要开启redis持久化机制,将数据保存到硬盘中,当redis重启后,底层会读取磁盘文件来进行恢复数据,合理使用持久化机制是成为架构师或运维重要的一步,接下来就来为各位小伙伴介绍redis持久化机制的几种方式
黎明大大
2021/03/09
9250
一篇文章彻底理解Redis持久化:RDB和AOF
Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复。理解和掌握Redis的持久机制,对于Redis的日常开发和运维都有很大帮助。Redis支持的两种持久化机制:
万猫学社
2022/04/22
2830
一篇文章彻底理解Redis持久化:RDB和AOF
Redis持久化数据之RDB和AOF
Redis由于读取效率快而常常被用作缓存来使用,之所以读取的速度非常快,是因为Redis将数据都存储在内存中,我们大家都知道存储在内存中的数据最大的特点就是:断电即丢失,这就容易出现数据不安全的问题。关系型数据库MySQL就是将数据持久化到磁盘上。那么Redis官方也提供了RDB和AOF两种方式,可以将数据持久化到磁盘来确保数据的安全性。
百思不得小赵
2022/12/01
4160
Redis持久化数据之RDB和AOF
相关推荐
Redis的持久化机制,RDB 和 AOF 原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档