网站首页 > 教程文章 正文
1、RDB
Rdb快照的配置选项:
save 900 1 // 900s内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
优点:
(1)RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去,比阿里云的ODPS分布式存储上,以预定好的备份策略来定期备份redis中的数据。
(2)RDB对redis对外提供的读写服务,影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可。
(3)相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速。
缺点:
(1)如果想要在redis故障时,尽可能少的丢失数据,那么RDB没有AOF好。一般来说,RDB数据快照文件,都是每隔5分钟,或者更长时间生成一次,当然也可以设置 ,这个时候就得接受一旦redis进程宕机,那么会丢失最近5分钟的数据。
(2)RDB每次在fork子进程来执行RDB快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。
2、AOF
AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集。
如果同时使用RDB和AOF两种持久化机制,那么在redis重启的时候,会使用AOF来重新构建数据,因为AOF中的数据更加完整。
配置选项:
appendonly no #是否打开 AOF日志功能。
appendfsync always #每1个命令,都立即同步到aof。最安全,速度慢。
appendfsync everysec #折中方案,每秒写1次。
appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到AOF. 同步频率低,速度快。
no-appendfsync-on-rewrite yes: #正在导出RDB快照的过程中,要不要停止重写AOF。
auto-aof-rewrite-percentage 100 #AOF文件大小比起上次重写时的大小,增长率100%时,重写。
auto-aof-rewrite-min-size 64mb #AOF文件,至少超过64M时,重写。
优点
(1)AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据
(2)AOF日志文件以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复
(3)AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在rewrite log的时候,会对其中的指导进行压缩,创建出一份需要恢复数据的最小日志出来。在创建新日志文件的时候,老的日志文件还是照常写入。当新的合并后的日志文件ready的时候,再交换新老日志文件即可。
(4)AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据
缺点:
(1)对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大
(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
(3)以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。所以说,类似AOF这种较为复杂的基于命令日志/merge/回放的方式,比基于RDB每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有bug。不过AOF就是为了避免rewrite过程导致的bug,因此每次rewrite并不是基于旧的指令日志进行merge的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。
3、相关问题
(1)RDB和AOF到底该如何选择?
综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。
(2)在dump rdb过程中,aof如果停止同步,会不会丢失?
不会,所有的操作缓存在内存的队列里, dump完成后,统一操作。
(3)aof重写是指什么?
aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里以解决 aof日志过大的问题。
(4)如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
aof
(5)恢复时rdb和aof哪个恢复得快?
rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行。
(6) 如果不小心运行了flushall怎么办?
首先,这个时候确定后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。到安装redis目录下的src下,用redis-check-aof --fix命令来修复破损的AOF文件,如:
./redis-check-aof --fix /var/redis/6379/appendonly.aof
然后、立即 shutdown nosave关闭服务器然后手工编辑aof文件,去掉文件中的 "flushall "相关记录, 然后开启服务器,就可以导入回原来的数据.
最后,如果flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失。
4、AOF的rewrite操作流程
Redis保存设置命令,会存在冗余,所以在redis.conf中,可以配置rewrite策略
auto-aof-rewrite-percentage 100 #就是当前AOF大小膨胀到超过上次100%,上次的两倍
auto-aof-rewrite-min-size 64mb #AOF文件,至少超过64M时,重写。
可以通过BGREWRITEAOF 命令手动执行AOF
(1)当达到rewrite策略时,redis会fork一个子进程
(2)子进程基于当前内存中的数据,构建日志,开始往一个新的临时的AOF文件中写入日志
(3)redis主进程,接收到client新的写操作之后,在内存中写入日志,同时新的日志也继续写入旧的AOF文件,主进程的数据更新操作,会缓存到aof_rewrite_buf中,
(4)子进程写完新的日志文件之后,redis主进程将内存中的新日志再次追加到新的AOF文件中
(5)用新的日志文件替换掉旧的日志文件
猜你喜欢
- 2025-05-15 Redis大Key分析利器:支持TOP N、批量分析与从节点优先
- 2025-05-15 别再说Redis是单线程了!面试官挖坑高频题,答对这3点直接满分
- 2025-05-15 Java面试官最爱问的那些Redis面试题盘点
- 2025-05-15 Redis主从同步与故障切换的常见问题及解决方案
- 2025-05-15 你必须懂的Redis十大应用场景
- 2025-05-15 Redis主从,集群,哨兵你了解多少?
- 2025-05-15 Redis持久化技术深度解析及适用场景分析
- 2025-05-15 思考:为什么数据库会丢失数据?
- 2025-05-15 Redis单机安装以及集群搭建
- 2025-05-15 十年之重修Redis原理
- 05-15Redis大Key分析利器:支持TOP N、批量分析与从节点优先
- 05-15别再说Redis是单线程了!面试官挖坑高频题,答对这3点直接满分
- 05-15Java面试官最爱问的那些Redis面试题盘点
- 05-15Redis主从同步与故障切换的常见问题及解决方案
- 05-15你必须懂的Redis十大应用场景
- 05-15Redis主从,集群,哨兵你了解多少?
- 05-15Redis持久化技术深度解析及适用场景分析
- 05-15思考:为什么数据库会丢失数据?
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)