Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?

这篇具有很好参考价值的文章主要介绍了Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

重写 AOF 日志的过程是怎样的?

Redis 的重写 AOF 过程是由后台子进程 bgrewriteaof 来完成的,这么做有以下两个好处。

  • 子进程进行 AOF 重写期间,主进程可以继续处理命令请求,从而避免阻塞主进程
  • 子进程带有主进程的数据副本。这里使用子进程而不是线程,是因为如果使用线程,多线程之间会共享内存,那么在修改共享内存数据的时候,需要通过加锁来保证数据的安全,而这样就会降低性能。而使用子进程,创建子进程时,父子进程是共享内存数据的,不过这个共享的内存只能以只读的方式,而当父子进程任意一方修改了该共享内存,就会发生「写时复制」,于是父子进程就有了独立的数据副本,就不用加锁来保证数据安全

触发重写机制后,主进程就会创建重写 AOF 的子进程,此时父子进程共享物理内存,重写子进程只会对这个内存进行只读,重写 AOF 子进程会读取数据库里的所有数据,并逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志(新的 AOF 文件)。

子进程是怎样拥有和主进程一样的数据副本的呢?

主进程在通过 fork 系统调用生成 bgrewriteaof 子进程时,操作系统会把主进程的「页表」复制一份给子进程,这个页表记录着虚拟地址和物理地址映射关系,而不会复制物理内存。简单来说,两者的虚拟空间不同,但其对应的物理空间是同一个。

Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?,Redis,redis

这样一来,子进程就共享了父进程的物理内存数据,这样能够节约物理内存资源,页表对应的页表项的属性会标记该物理内存的权限为只读。

不过,当父进程或者子进程在向这个内存发起写操作时,CPU 就会触发写保护中断,这个写保护中断是由于违反权限导致的,然后操作系统会在「写保护中断处理函数」里进行物理内存的复制,并重新设置其内存映射关系,将父子进程的内存读写权限设置为可读写,最后才会对内存进行写操作,这个过程被称为「写时复制」。

Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?,Redis,redis

注意,这里只会复制主进程修改的物理内存数据,没修改的物理内存还是与子进程共享的。

但是在重写过程中,主进程依然可以正常处理命令。那么问题来了,重写 AOF 日志过程中,如果主进程修改了已经存在的 key-value,就会触发「写时复制」,此时这个 key-value 数据在子进程的内存数据就和在主进程的内存数据不一致了。

为了解决这种数据不一致的问题,Redis 设置了一个 AOF 重写缓冲区,这个缓冲区在创建 bgrewriteaof 子进程之后开始使用。

在重写 AOF 期间,当 Redis 执行完一个写命令之后,它会同时将这个写命令写入到 「AOF 缓冲区」和 「AOF 重写缓冲区」。

Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?,Redis,redis

也就是说,在 bgrewriteaof 子进程执行 AOF 重写期间,主进程需要执行以下三个工作。

  • 执行客户端发来的命令
  • 将执行后的写命令追加到 「AOF 缓冲区」,用于后续通过 write() 系统调用,写入内核的缓冲区,再由内核决定在合适的时机将数据写入磁盘
  • 将执行后的写命令追加到 「AOF 重写缓冲区」

当子进程完成 AOF 重写工作(扫描数据库中的所有数据,逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志)后,会向主进程发送一条信号(信号是进程间通讯的一种方式,且是异步的)。

主进程收到该信号后,会调用一个信号处理函数,该函数主要做以下工作。

  1. 将 AOF 重写缓冲区中的所有内容追加到新的 AOF 文件中,使得新旧两个 AOF 文件所保存的数据状态一致
  2. 对新的 AOF 的文件进行改名,覆盖现有的 AOF 文件

信号函数执行完后,主进程就可以继续像往常一样处理命令了。文章来源地址https://www.toymoban.com/news/detail-671514.html

到了这里,关于Redis 重写 AOF 日志期间,主进程可以正常处理命令吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Redis】AOF 源码

    在上篇, 我们已经从使用 / 机制 / AOF 过程中涉及的辅助功能等方面简单了解了 Redis AOF。 这篇将从源码的形式, 进行深入的了解。 Redis 的 AOF 功能概括起来就 2 个功能 AOF 同步: 将客户端发送的变更命令, 保存到 AOF 文件中 AOF 重写: 随着 Redis 的运行, AOF 文件会不断变大, 在文件达

    2024年01月19日
    浏览(38)
  • 【Redis】——AOF持久化

    AOF日志是redis为数据的持久化提供了的一个技术,日志里面记录着执行redis写命令。 每当r edis执行一条写命令的时候,就会将该命令记录 到AOF日志当中 。 当redis启动的时候,可以加载AOF日志中的所有指令,并执行这些指令恢复所有的数据。 在 Redis 中 AOF 持久化功能默认是不开

    2024年02月13日
    浏览(48)
  • Redis- AOF刷盘策略

    在Redis中, appendfsync everysec 是一个与持久化相关的配置选项,它属于 Redis 的 AOF(Append Only File)持久化策略的一部分。 Redis支持两种主要的数据持久化方式:RDB(快照)和AOF(追加只文件)。AOF持久化通过记录每个写操作到一个日志文件来工作,以此在Redis重启后重放这些操

    2024年01月21日
    浏览(48)
  • Redis 持久化——AOF

    使用 RDB 持久化有一个风险,它可能会造成最新数据丢失的风险。因为 RDB 的持久化有一定的时间间隔,在这个时间段内如果 Redis 服务意外终止的话,就会造成最新的数据全部丢失。 可能会操作 Redis 服务意外终止的条件: 安装 Redis 的机器停止运行,蓝屏或者系统崩溃; 安装

    2024年01月22日
    浏览(43)
  • 【Redis】Redis持久化之AOF详解(Redis专栏启动)

    📫作者简介:小明java问道之路, 2022年度博客之星全国TOP3 ,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。          📫 热衷分享,喜欢原

    2024年02月02日
    浏览(35)
  • 【Redis】Redis持久化机制RDB与AOF

    目录 一、RDB 1、概念 2、RDB文件保存 3、执行RDB 4、触发RDB 5、fork原理 6、RDB的缺点 二、AOF 1、概念 2、开启AOF 3、触发AOF 4、触发重写AOF 三、区别 RDB全称为Redis Database Backup File(Redis数据备份文件),也叫做Redis数据快照。简单的来说就是把某一时刻Redis内存里的数据都记录到磁

    2024年02月08日
    浏览(54)
  • 【征服redis8】Redis的AOF持久化

    Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使用这些命令来重构数据库状态。  目录 1.AOF的

    2024年01月19日
    浏览(44)
  • redis 持久化 RDB + AOF

    RDB(Redis DataBase)和AOF(Append Only File) RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上 AOF,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

    2024年02月03日
    浏览(58)
  • 【redis】通过配置文件简述redis的rdb和aof

    redis的持久化方式有2种,rdb,即通过快照的方式将全量数据以二进制记录在磁盘中,aof,仅追加文件,将增量的写命令追加在aof文件中。在恢复的时候,rdb要更快,但是会丢失一部分数据。aof丢失数据极少,但是恢复数据很慢。redis默认使用rdb进行持久化。 下面结合配置文件

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包