admin 管理员组文章数量: 887029
2024年1月17日发(作者:abroad的用法及短语)
Redis的持久化方式 RDB和AOF相关知识点
Redis的持久化方式 RDB和AOF
Redis会在以下几种情况下对数据进行快照
1. 根据配置规则进行自动快照
2. 用户执行SAVE(阻塞所有来自客户端的请求)或者GBSAVE(异步)命令
3. 执行FLUSHALL命令
4. 执行复制(replication)时
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持久化即可(用的是COW 写时复制机制)
(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
低,速度快。
no-appendfsync-on-rewrite yes:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
优点
(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的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。
#正在导出RDB快照的过程中,要不要停止重写AOF
#AOF文件大小比起上次重写时的大小,增长率100%时,重写
#AOF文件,至少超过64M时,重写
#折衷方案,每秒写1次
appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到AOF,同步频率3、RDB和AOF到底该如何选择
持久化机制,AOF、RDB具体区别有哪些?
综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏,不可用的时候,还可以使用RDB来进行快速的数据恢复
4、相关问题
1、在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
2、 aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里以解决 aof日志过大的问题.
3、 如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: aof
4、 恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
5、如果不小心运行了flushall怎么办。
(1)这个时候确定后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据
到安装redis目录下的src下,用redis-check-aof --fix命令来修复破损的AOF文件
./redis-check-aof --fix /var/redis/6379/
(2)立即 shutdown nosave关闭服务器然后 手工编辑aof文件, 去掉文件中的 "flushall "相关行, 然后开启服务器,就可以导入回原来数据.
(3)如果flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.
5、AOF的rewrite操作流程
Redis保存设置命令,会存在冗余,所以在中,可以配置rewrite策略
auto-aof-rewrite-percentage 100 #就是当前AOF大小膨胀到超过上次100%,上次的两倍
auto-aof-rewrite-min-size 64mb
可以通过BGREWRITEAOF 命令手动执行AOF
(1)当达到rewrite策略时,redis会fork一个子进程
(2)子进程基于当前内存中的数据,构建日志,开始往一个新的临时的AOF文件中写入日志
(3)redis主进程,接收到client新的写操作之后,在内存中写入日志,同时新的日志也继续写入旧的AOF文件,主进程的数据更新操作,会缓存到aof_rewrite_buf中。
(4)子进程写完新的日志文件之后,redis主进程将内存中的新日志再次追加到新的AOF文件中
(5)用新的日志文件替换掉旧的日志文件
6、RDB备份方案
(1)写crontab定时调度脚本去做数据备份
(2)每小时都copy一份rdb的备份,到一个目录中去,仅仅保留最近48小时的备份
(3)每天都保留一份当日的rdb的备份,到一个目录中去,仅仅保留最近1个月的备份
(4)每次copy备份的时候,都把太旧的备份给删了
(5)每天晚上将当前服务器上所有的数据备份,发送一份到远程的云服务上去
版权声明:本文标题:Redis的持久化方式 RDB和AOF相关知识点 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1705483347h486646.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论