- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章什么是RDB和AOF? 一文了解Redis持久化!由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
概述 。
本文提供Redis持久化技术说明, 建议所有Redis用户阅读. 如果您想更深入了解Redis持久性原理机制和底层持久性保证, 请参考文章 揭秘Redis持久化: http://antirez.com/post/redis-persistence-demystified.html 。
Redis持久化 。
Redis提供了不同级别的持久化选项
接下来, 让我们来对比RDB和AOF的优缺点
RDB优点 。
RDB缺点 。
AOF优点 。
使用AOF持久化程度更高: 你可以配置不同的fsync策略
注: fsync(https://man7.org/linux/man-pages/man2/fsync.2.html)是系统方法, 用于将内核态的缓存数据持久化到存储设备, 比如将内存数据写入硬盘 。
默认使用每秒执行一次fsync的策略, 这种场景下, Redis的写性能也能非常好, 因为fsync运行在一个后台线程, 而主线程会尽力完成写操作. 所以你最多丢失1秒钟的数据. 。
AOF缺点 。
那我该使用哪个?
通常, 如果你想获得像PostgreSQL那样的数据安全性, 你应该结合RDB和AOF. 。
如果你非常关心你的数据, 但是允许丢失几分钟的数据, 你可以只使用RDB持久化. 。
有很多用户只使用AOF, 但是我们不建议那样做, 因为RDB的基于时间点的快照在做数据库备份, 快速重启, 或AOF引擎出现问题时, 非常有用. 。
注意: 基于这些原因, 在将来(长期计划), 我们最终会统一AOF和RDB为一个持久化模型方案. 。
下面几节, 我们来举例说明更多, 关于RDB和AOF的细节. 。
快照 。
Redis默认保存快照到硬盘上的dump.rdb文件. 你可以配置, 每N分钟, 至少出现了M次数据集改变执行一次快照, 或者手动执行保存 SAVE 或后台保存BGSAVE 命令. 。
save 60 1000 。
它是如何工作的?
每当Redis需要保存数据集到磁盘, 会执行下面的任务
这种方法就是Redis的写即拷语义(copy-on-write) 。
AOF仅追加文件 。
快照不是很持久, 如果Redis服务异常停止, 掉电停止, 或者意外执行了kill -9杀掉Redis服务进程, 最后的数据写入将会丢失. 虽然对于有些应用来说这是个小问题, 但对于要求完全持久化的场景, RDB不是一个很好的选择. 。
appendonly yes 。
从现在开始, 每当Redis收到一个改变数据集的命令(比如SET), 该操作将追加到AOF文件, 当你重启Redis时, 会基于AOF文件重建数据集. 。
日志重写 。
AOF文件大小随着操作的增加而增加. 举个例子, 如果你想递增计数100次, 最终数据集中只包含一个键值就是最终的结果, 但是在AOF文件中有100条记录, 实际上在重建数据集时, 不需要剩余的99次记录. 。
所以Redis支持这个有趣的功能: 在不中断Redis服务的情况下, 后台进行AOF文件重写. 当执行后台重写命令 BGREWRITEAOF 时, Reids会将当前内存中的数据集以最短的有序命令集写下来. 如果你使用Redis2.2, 你需要定时执行 BGREWRITEAOF(https://redis.io/commands/bgrewriteaof) , 从Redis2.4开始, 它可以自动触发日志重写(更多信息可以查看2.4的配置示例, 不同版本的配置(https://redis.io/topics/config)). 。
AOF怎么持久化?
你可以配置时间间隔, Redis来执行fsync到磁盘. 这里有三个策略
每秒执行一次fsync是建议并且是默认的方式. 它既快又安全. appendfsync always策略在实践中非常慢, 但是支持组提交, 所以可以将多个并行写操作合并, 执行一次fsync即可. 。
如果AOF文件被截断了应该怎么做?
在写AOF文件时, 服务器出现crash或磁盘空间满了, 这时候AOF依然包含一致的数据, 代表了给定时间点版本的数据集(默认fsync策略可能会丢失1秒的数据), 但是最后的命令在AOF记录中会被截断, 最新的Redis主干版本依然会导入所有的AOF文件内容, 但是会忽略最后的不完整的命令, 这时候, 服务器会发出警告日志
* Reading RDB preamble from AOF file... 。
* Reading the remaining AOF tail... 。
# !!! Warning: short read while loading the AOF file !!! 。
# !!! Truncating the AOF at offset 439 !!! 。
# AOF loaded anyway because aof-load-truncated is enabled 。
你可以改变默认配置来强制停止这种事情发生, 但是默认配置会忽略最后这个不完整的命令, 为了保证服务重启后可用. 。
老版本的Redis不会自动恢复, 需要做以下步骤来恢复
AOF文件被损坏了怎么办?
如果AOF文件不仅被截断了, 中间还被插入了无效的字节, 事情将变得更加复杂, Redis在启动的时候会中断并提示
* Reading the remaining AOF tail... 。
# Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> 。
最好是用 redis-check-aof 工具修复, 首先不适用 --fix 选项, 找到问题, 跳过该文件的错误位置, 查看是否可以手动修复该文件, AOF使用与Reids一致的协议格式,所以非常便于手动修复, 否则就使用工具修复该文件, 这种情况, 从无效的位置到文件结束的数据都可能被丢失, 如果损坏位置发生在开头的位置, 则相当于丢失整个数据集. 。
它是怎样工作的?
日志重写使用了与快照一致的拷贝即写(copy-on-write)的方式, 步骤如下
怎样从dump.rdb快照切换到AOF 。
在Redis2.0和Redis2.2用不同的步骤来切换到AOF, 而且Redis2.2切换到AOF更简单, 不需要重启. 。
Redis >= 2.2 。
第一个配置命令表示启用AOF功能. 这样Redis会阻塞来生成初始的备份, 然后打开新文件来写入操作记录, 后面的写操作将会持续追加到该AOF文件中. 。
第二个配置命令用来关闭RDB快照持久化. 这是可选的, 如果保留save表示同时使用RDB和AOF持久化. 。
重要: 记住同时修改redis.conf配置文件来打开AOF, 否则服务重启时将使用原来的配置. 。
Redis 2.0 。
在AOF和RDB之间交互 。
Redis >= 2.4会保证当RDB快照在运行时, 避免触发一个AOF重写进程, 或者当AOF重写已经运行时, 不允许后台保存快照BGSAVE. 这可以防止两个后台进程同时产生高负载的磁盘I/O. 。
备份Redis数据 。
开始本节内容前, 请确认已经对数据库进行备份, 如果磁盘损坏, 云实例消失等, 没有备份意味着数据面临着巨大风险, 会消失在"黑洞" /dev/null中. 。
Redis对于数据备份非常友好, 即使数据库数据库运行中也允许你对数据进行拷贝备份: RDB文件产生时就不会被修改, 快照备份期间, 它会生成零时的文件, 当快照最终备份完成后采用重命名替换原来的RDB文件. 。
这意味着服务在运行时, 拷贝RDB文件是非常安全的, 下面是我们的建议
如果你使用ROF持久化方式, 仍然可以拷贝AOF文件来做备份. 这个AOF文件即使丢失最后一小段数据, Redis也可以重建它们(请参考上面的截断AOF文件处理方式) 。
灾难恢复 。
灾难恢复和备份基本是一致的, 加上可以在许多不同的数据中心间转存这些备份数据. 这种情况下, 即使影响到最主要的数据中心, 其他地方的备份也是安全并且可以恢复的. 。
针对刚起步, 没有太多的资金来做大型备份, 这里也提供了一些不需要太大开销的灾备恢复技术
这种方式可能会导致文件传输失败, 所以在传输完成后, 至少要增加文件完整性校验, 比如校验文件大小, 如果使用VPS, 甚至可以使用SHA1校验. 。
你也需要部署独立的监控报警系统, 对备份过程进行监控, 在备份失败时能及时发现并修复. 。
参考文档 。
Redis官方文档: https://redis.io/topics/persistence 。
原文地址:https://mp.weixin.qq.com/s/mTvM3C0Ppsc61h8Mhnt-Qw 。
最后此篇关于什么是RDB和AOF? 一文了解Redis持久化!的文章就讲到这里了,如果你想了解更多关于什么是RDB和AOF? 一文了解Redis持久化!的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想我的 redis 配置可能搞砸了。使用 nodeBB 我试图与 git 共享我的 .rdb 文件,因为我想在我的本地环境和我的服务器上共享数据。 在寻找 .rdb 文件的过程中,我执行了 redi
我需要转换SQL语句RDB$GET_CONTEXT和 RDB$SET_CONTEXT从 Firebird 到 Interbase,我应该使用什么? 这是完整的 Firebird SQL: if (rd
我在这里内部运行一个 Redis 数据库,想制作一个“快照的快照”。 什么鬼?是的。我想每天将 .rdb 文件移动到 S3 的存储桶中。此外,它应该是一个计划操作(可能使用 cronTab 函数)。
我使用的是 redis-server 版本 Redis 4.0.9 (00000000/0) 64 位。尝试从 Heroku Redis 中保存的 RDB 文件恢复数据时(Redis 版本合规性 5.
Redis 一旦服务器宕机,内存中的数据将全部丢失,从后端数据库恢复这些数据,对数据库压力很大,且性能肯定比不上从 Redis 中读取,会拖慢应用程序。所以,对 Redis 来说,实现数据的 持久化
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我的 redis rdb 文件的大小一直在增长,直到数据库变得不可操作并且连接被拒绝。我意识到这与某些配置设置有关 - 我使用的是默认配置文件。 有什么办法可以防止这种情况发生吗?我不关心持续备份。
我使用 Redis,并将其保存为 .rdb 文件(每笔交易)。 我注意到生产中的 .rdb 每天增长 15 MB(现在是 75 MB)。 .rdb 文件有限制吗?这对 Redis 数据库的性能有影响吗
在 MySQL 或 Oracle 等数据库中,索引是如何实现的?我认为常规索引存储为 B 树,但找不到有关在多列上建立索引的复合索引的任何信息。我正在寻找所使用的数据结构的名称,以便研究它们。 更一般
在典型的 RDB 中,我可以描述与外键的关系。但是,我不确定如何有效地描述组内关系。我知道这很难理解,所以让我描述一下这个场景。 我想做一个成绩册服务,教师可以注册和创建类(class),学生可以注册
上下文 我有一个实时运行的 redis 服务器。 我要备份。 想法: 我想做以下事情: cp dump.rdb ~/some-other-location/06-24-2012.rdb ? 关注 我没
我正在尝试运行查询来提取 Firebird 中所有列的元数据。它看起来像这样: select f.RDB$RELATION_NAME as tableName, f.RDB$F
我正在尝试运行查询来提取 Firebird 中所有列的元数据。它看起来像这样: select f.RDB$RELATION_NAME as tableName, f.RDB$F
我记得玩过一些设置,我相信它改变了 dump.rdb 的位置。现在,dump.rdb 自动神奇地出现在我项目的根目录中。 它属于哪里,我该如何将它放回那里?另外,这个位置在生产环境中如何变化? 最佳答
我已阅读 Redis 文档以找到标题的答案。但我找不到它。我想知道在集群节点迁移时如何操作RDB和AOF。 假设在同一个集群中有2个节点。(A节点,B节点)* RDB、AOF选项开启。 如果A的一些数
我正在使用 redis 2.6.9。目前,我不确定 dump.rdb 文件来自哪个版本的 redis(我正在尝试从另一台计算机复制 redis 信息 - 如果这不起作用,我将查看 slave 选项)。
很抱歉,如果这是一个重复的问题,但我已经在 stackoverflow 上搜索了几个小时,但找不到答案。 场景: 我更改了 Redis 的 dump.rdb 的默认目录,因为我的雇主希望它在特定目录中
我正在经历 Redis RDB 持久化。我对 RDB 持久性与其缺点有关有一些疑问。 到目前为止的理解: 当我们需要定期保存内存中当前数据集的快照时,我们应该使用 rdb 持久化。 我可以理解,如果服
过去 10 个月我一直在 Windows 服务器上使用 Redis,没有任何问题,但今天早上我检查了我的网站,发现它完全是空的!!! 经过几分钟的调查,我意识到 Redis 数据库是空的??? 幸运的
上下文 我正在使用 Redis。数据库 < 100 MB。 但是,我想每天备份一次。 我也在 Ubuntu Server 12.04 上运行 当输入时: redis-cli save 我不知道 dum
我是一名优秀的程序员,十分优秀!