redis aof写入以及aof重写的源码分析

这里写目录标题

    • 版本
    • aof的面试问题
      • aof正常写入流程
      • aof重写流程

版本

redis:6.2.7

aof的面试问题

最近找工作,面试被问倒了,记录一下
比如redis的aof指令会不会丢失?比如在重写aof的什么新来的操作怎么办?

在重写的时候会新开一个文件,这个大家可能都知道,然后会将新来的操作放在重写缓冲区,但是这个要不要落地,怎么落地?难住我了。后面想了想应该是写入老的aof文件,重写缓冲区内存存一份,当老的aof文件重写完成后,父进程上锁阻塞重写缓冲区,让新的aof写入新接收的指令,再解锁重新接收指令,这样避免了数据丢失,同时也最低限度避免了阻塞耗时,但是我觉得这样加锁性能会有蛮大的损耗,但也想不出来其他好的做法,当然这个只是我面完试之后一个说的通的猜想。注:这是错误的猜想,单纯记录当时的想法,具体过程还是给看代码梳理流程

aof正常写入流程

aof是写后日志,肯定是在执行完redis命令之后写入的。feedAppendOnlyFile核心函数,每当执行call函数之后,执行完相应的cmd就会调用propagate函数,随后就调用feedAppendOnlyFile,一般来说应该是在指令执行完的beforeSleep调用flushAppendOnlyFile,进行相应的程序缓冲区写入、内核缓冲区flush以及fsync到硬盘中。

feedAppendOnlyFile函数只会单纯记录aof_buf,不涉及操作系统write操作,同时如果有一个子进程打开类型还是aof重写的,会加入到重写缓冲区aof_rewrite_buf_blocks这个字段里,数据结构是双向链表
在这里插入图片描述
flushAppendOnlyFile函数会涉及write、flush、fsync操作,正常写入流程还是比较简单易懂的

aof重写流程

这一块的流程比较复杂。
核心函数rewriteAppendOnlyFileBackground,在每次重写的时候都会先创建一组管道,下标0是读管道,下标1是写管道,依次类推,看成2个一组就好了。
在这里插入图片描述
然后会进入rewriteAppendOnlyFile,这个是重写的核心函数,子进程copy on write临时文件之后,会有一个简单读父进程发来aof的buf的过程,两个维度来进行控制
在这里插入图片描述
然后就是发信号通知父进程不要在发差异(就是重写缓冲区数据)了,子进程要读完已发过来的差异就准备rename文件去了,这个rename的是temp-rewriteaof-%d.aof这个文件,名字要变成temp-rewriteaof-bg-%d.aof,%d指的是子进程id。
在这里插入图片描述
这个时候我一直在思考,子进程已经不让父进程继续同步了,再来新的指令怎么存到新aof文件啊?子进程马上就要退出了呀,父进程可以把新来的命令存到老的aof文件中,那新的aof文件怎么获取新的命令?父进程又不会重新处理新的aof文件,再三确认没有阻塞机制,我就在猜想那一定会丢相应的aof记录啊,但一想这么牛逼的产品怎么可能会在重写文件上丢失命令,自己重新编了编测了测,发现并没有丢失,觉得很神奇,为什么不阻塞,新aof文件还是对的,百思不得其解。上网也查了查发现页没有相关解答,又看了看redis debug 日志,顺着日志走找到解决思路。

serverCron函数中,有这样的一个操作,会检查子进程是否操作完。不同类型的处理函数也是不同的,backgroundRewriteDoneHandler这个函数是主角,在checkChildrenDone
在这里插入图片描述
子进程fork重写完成,父进程还没有清理相应子进程状态,父进程还是会往重写缓冲区写一份数据的,当父进程监听到子进程退出的时候,backgroundRewriteDoneHandler函数再把重写缓冲区的文件写入到新aof文件中,写完再重命名,完成了这个操作,就不会有数据丢失了。又不阻塞又不会丢数据,就算是监控子进程这一步挂掉了,也可以继续使用老的aof文件,老的aof文件除了大一点没其他毛病,只能说这个设计思路无敌,又学会了一招。
在这里插入图片描述

总结:子进程在快fork完成时候利用管道告知父进程不要在发送重写缓冲内容了,在重写子进程没完全退出的时候还是会把新来的命令放在重写缓冲区的,重写缓冲区是由双向链表组成。父进程会监控子进程完成的进度,当子进程执行结束后,父进程会把没同步的重写缓冲区的数据写入到新的aof文件中去,这样既没有加锁阻塞新来的redis命令执行,也不会丢失redis命令,设计思路真的棒,又学会了一招。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/351108.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云计算】Docker部署Nextcloud网盘并实现随地公网远程访问

配置文件 切换root权限,新建一个nextcloud的文件夹,进入该目录,创建docker-compose.yml [cpslocalhost ~]$ su root Password: 666666 [rootlocalhost cps]# ls Desktop Documents Downloads Music Pictures Public Templates Vide…

【面经总结】Java集合 - Map

Map 概述 Map 架构 HashMap 要点 以 散列(哈希表) 方式存储键值对,访问速度快没有顺序性允许使用空值和空键有两个影响其性能的参数:初始容量和负载因子。 初始容量:哈希表创建时的容量负载因子:其容量自动扩容之前被允许的最大…

CPP多线程

什么是多线程? 多线程是一种允许程序同时运行多个线程的技术。每个线程可以执行不同的任务,这在处理需要并发执行的操作时(例如,处理多个客户端的网络服务器,或者图形用户界面应用程序)非常有用。多线程能够…

Github 2024-06-13开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2Shell项目1TypeScript项目1Swift项目1PHP项目1Blade项目1JavaScript项目1从零开始构建你喜爱的技术 创建周期:2156…

MySQL数据库管理(一)

目录 1.MySQL数据库管理 1.1 常用的数据类型​编辑 1.2 char和varchar区别 2. 增删改查命令操作 2.1 查看数据库结构 2.2 SQL语言 2.3 创建及删除数据库和表 2.4 管理表中的数据记录 2.5 修改表名和表结构 3.MySQL的6大约束属性 1.MySQL数据库管理 1.1 常用的数据类…

ElementPlus非表单组件ElUpload值更新后校验不消失问题

项目场景: el-form表单中有一个上传组件,有必填校验。 问题描述 先触发表单的必填校验(点击提交按钮),然后再上传文件,必填校验的提示一直存在,如果再次点击提交,手动触发表单校验,必填校验消…

JavaScript常见面试题(一)

文章目录 1. JavaScript有哪些数据类型,它们的区别?2.数据类型检测的方式有哪些3. 判断数组的方式有哪些4.null和undefined区别5.typeof null 的结果是什么,为什么?6.intanceof 操作符的实现原理及实现7.为什么0.10.2 ! 0.3&…

计算机网络(8) Finite State Machines(有限状态机)

一.建立连接(三次握手) 建立连接过程中的状态转换如下: 客户端: 发送SYN CLOSED >>>>>>>>>>>>>>SYN SENT(第一次握手) 接收SYNACK发送ACK …

如何看懂SparkUI?

Jobs页面 Stage页面 显示额外的指标和摘要指标: 摘要指标(Summary Metrics)统计了所有完成的任务的执行行为,包括执行时间、GC时间、输入输出信息等,并提供了最小值(Min)、第25百分位数&#xf…

HCIA11 网络安全之本地 AAA 配置实验

AAA 提供 Authentication(认证)、Authorization(授权)和 Accounting(计费)三种安全功能。 • 认证:验证用户是否可以获得网络访问权。 • 授权:授权用户可以使用哪些服务。 •…

黑马头条Minio报错non-xml response from server错误的解决方法

今天在写项目的时候,想测试minio上传文件功能是否正常, 但是每次都出现non-xml response from server的错误。 自己也在网上找了很多解决方法,大部分是说用户名和密码的配置问题,但是检查后发现并没有错误。 最后发现是自己的dock…

QT 5.14.2 应用程序打包

我们可以直接通过开发工具预览我们的程序。但是当要把开发好的程序给别人使用的时候,我们就需要把程序打包成可执行的exe,然后把这个exe文件和其他相关的文件一起发给别人,这样别人就可以使用了。 一、生成可独立运行的exe (一)、编译程序的…

图论(一)之概念介绍与图形#matlab

图论(一)之概念介绍与图形目录 前言 一、图论介绍 二、基本概念 2.1图的概念 2.2图形分类 2.3邻接矩阵 2.3.1无向图 2.3.2有向图 2.3.3有向赋权图 2.4出度(Outdegree) 2.5入度(Indegree) 3.四种…

联想电脑 调节屏幕亮度不起使用,按F5,F6,屏幕上的hotkeys进度条是在改变,但是屏幕没有一些作用的处理方法

1、查看驱动是否正常 Win键X ,设备管理器 发现似乎挺正常的。 查看原厂驱动:联想电脑管家 这样看来,驱动是没有问题了。 2、看看设置电池模式 其实还是这个电池模式的问题导致。 如果处于养护模式的话,充电只在75%~80%&#x…

【Numpy】一文向您详细介绍 np.round()

【Numpy】一文向您详细介绍 np.round() 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕,…

【大数据】计算引擎:Spark核心概念

目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文,专栏地址: https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…

【SpringCloud学习笔记】RabbitMQ(上)

1. RabbitMQ简介 官网地址:https://www.rabbitmq.com/ 2. 安装方式 安装前置准备: 此处基于Linux平台 Docker进行安装,前置准备如下: Linux云服务器 / 虚拟机Docker环境 安装命令: docker run \-e RABBITMQ_DEFAU…

TCP与UDP案例

udp不会做拆分整合什么的 多大就是多大

【日记】第一次养植物,没什么经验……(781 字)

正文 前两天梦见灵送的几盆植物全都死掉了。梦里好伤心。醒来与她说这件事,她宽慰我说,梦都是反着的,肯定能活得很好的。于是忽然记起昨天给植物换水时,文竹的根居然从花盆底部伸吊了出来,以前都没有这种情况来着&…

探索智慧校园,引领数字化教育浪潮

在21世纪的教育版图上,智慧校园进一步发展。这是一场深度融合信息技术与教育实践的深刻转型,它不仅仅是在校园里简单叠加智能设备,而是一种从教育理念到实践模式全方位的革新。智慧校园如同一座桥梁,连接着过去与未来,…