Redis中的AOF重写是什么意思?

为什么需要AOF 重写?

AOF 会记录每个写命令到 AOF 文件,随着时间越来越长,AOF 文件会变得越来越大。如果不加以控制,会对 Redis 服务器,甚至对操作系统造成影响,而且 AOF 文件越大,数据恢复也越慢。为了解决 AOF 文件体积膨胀的问题,Redis 提供 AOF 文件重写机制来对 AOF 文件进行 “瘦身”。

Redis 通过创建一个新的 AOF 文件来替换现有的 AOF,新旧两个 AOF 文件保存的数据相同,但新 AOF 文件没有了冗余命令。
 

AOF 重写会阻塞吗?

AOF 重写过程是由后台进程 bgrewriteaof 来完成的。主线程 fork 出后台的 bgrewriteaof 子进程,fork 会把主线程的内存拷贝一份给 bgrewriteaof 子进程,这里面就包含了数据库的最新数据。然后,bgrewriteaof 子进程就可以在不影响主线程的情况下,逐一把拷贝的数据写成操作,记入重写日志。

所以 AOF 在重写时,在 fork 进程时是会阻塞住主线程的。
 

AOF 日志何时会重写?

有两个配置项控制 AOF 重写的触发:

auto-aof-rewrite-min-size: 表示运行 AOF 重写时文件的最小大小,默认为 64MB。

auto-aof-rewrite-percentage: 这个值的计算方式是,当前 AOF文件大小和上一次重写后 AOF 文件大小的差值,再除以上一次重写后 AOF 文件大小。也就是当前 AOF 文件比上一次重写后 AOF 文件的增量大小,和上一次重写后 AOF 文件大小的比值。
 

重写日志时,有新数据写入,主进程是怎么做的?

重写过程总结为:“一个拷贝,两处日志”。在 fork 出子进程时的拷贝,以及在重写时,如果有新数据写入,主线程就会将命令记录到两个 aof 日志内存缓冲区中。如果 AOF 同步策略配置的是 always,则直接将命令写回 旧的日志文件 ,并且保存一份命令至 AOF重写缓冲区 ,这些操作对新的日志文件是不存在影响的。(旧的日志文件:主线程使用的日志文件,新的日志文件:bgrewriteaof 进程使用的日志文件)

而在 bgrewriteaof 子进程完成会日志文件的重写操作后,会提示主线程已经完成重写操作,主线程会将 AOF 重写缓冲中的命令追加到新的日志文件后面。这时候在高并发的情况下,AOF 重写缓冲区积累可能会很大,这样就会造成阻塞,Redis 后来通过 Linux 管道技术让 aof 重写期间就能同时进行回放,这样 aof 重写结束后只需回放少量剩余的数据即可。

最后通过修改文件名的方式,保证文件切换的原子性。

在 AOF 重写日志期间发生宕机的话,因为日志文件还没切换,所以恢复数据时,用的还是旧的日志文件。
 

在重写日志整个过程时,主线程有哪些地方会被阻塞?

1、fork 子进程时,需要拷贝虚拟页表,会对主线程阻塞 。

2、主进程有 bigkey 写入时,操作系统会创建页面的副本,并拷贝原有的数据,会对主线程阻塞。

3、子进程重写日志完成后,主进程追加 aof 重写缓冲区时可能会对主线程阻塞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis AOF重写是一种机制,用于解决AOF文件过大导致IO性能问题的情况。AOF重写的过程并不需要对原有AOF文件进行读取、写入或分析操作,而是通过读取服务器当前的数据库状态来实现的。\[3\]AOF重写的执行流程包括命令追加、文件写入和文件同步以及文件重写。首先,Redis的写命令会被追加到缓冲区aof_buf。然后,根据不同的同步策略,将aof_buf的内容同步到硬盘,以确保数据的持久化。最后,定期进行AOF文件的重写,以达到压缩AOF文件的目的。\[3\]通过AOF重写,可以有效地减小AOF文件的大小,提高IO性能,同时保证数据的持久化。 #### 引用[.reference_title] - *1* *3* [缓存数据库REDIS之二:AOF重写原理](https://blog.csdn.net/qq_18343913/article/details/119343547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [redisaof重写机制](https://blog.csdn.net/qq_63431773/article/details/131691454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值