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

news2024/7/7 17:22:02

这里写目录标题

    • 版本
    • 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.coloradmin.cn/o/1828520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web墨卡托投影的原理和公式推导

Web墨卡托投影的原理和公式推导 简介 Web墨卡托投影(Web Mercator,EPSG:3857)是一种广泛应用于互联网地图的投影系统。Google地图、天地图等互联网地图通常情况下默认支持两种坐标系统,其一是WGS84地理坐标系,EPSG代码为4326,坐…

嵌入式面经111题答案汇总(含技术答疑)_嵌入式项目源码分享

111道嵌入式面试题答案汇总专栏链接(承诺免费技术答疑) --> 《嵌入式/C面试题解析大全》 1、简介 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业工作经验,整理超全面111道嵌入式面试…

CentOS7服务器中安装openCV4.8的教程

参考链接:Centos7环境下cmake3.25的编译与安装 参考链接:Linux安装或者升级cmake,例子为v3.10.2升级到v3.25.0(自己指定版本) 参考链接:Linux安装Opencv(C) 一、下载资源 1.下载cmake3.25.0的压缩包&am…

计算机网络:网络层 - 路由选择协议

计算机网络:网络层 - 路由选择协议 路由器的结构路由选择协议概述自治系统 AS内部网关协议路由信息协议 RIP距离向量算法RIP报文格式收敛问题 开放最短路径优先 OSPF基本工作原理自治系统分区 外部网关协议BGP-4 路由器的结构 如图所示,路由器被分为路由…

Java实现异步开发的方式

1)、继承 Thread 2)、实现 Runnable 接口 3)、实现 Callable 接口 FutureTask (可以拿到返回结果,可以处理异常) 4)、使用线程池 区别:1、2)不能得到返回值 …

AI 定位!GeoSpyAI上传一张图片分析具体位置 不可思议! ! !

🏡作者主页:点击! 🤖常见AI大模型部署:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2024年6月16日12点23分 🀄️文章质量:94分…

关于小程序测试账号如何移除

关于小程序测试账号如何移除 有很多小伙伴一开始做开发,一开始用来做测试号,登录微信公众号的时候会提示配置项, 那么如何移除掉呢 https://mp.weixin.qq.com/ 关注「公众平台安全助手」公众号 -> 绑定查询 -> 微信号绑定账号 -> 小程序 -> 点击小程序 -> 解除…

统计完全子字符串

很不错的计数问题&#xff0c;用到了分组循环技巧和滑动窗口 代码的实现方式也非常值得多看 class Solution { public:int f(string s,int k){int res 0;for(int m1;m<26&&k*m<s.size();m){int cnt[27]{};auto check[&](){for(int i0;i<26;i){if(cnt[i]…

打造私密的通信工具,极空间搭建免费开源的电子邮件管理程序『Cypht』

打造私密的通信工具&#xff0c;极空间搭建免费开源的电子邮件管理程序『Cypht』 哈喽小伙伴门好&#xff0c;我是Stark-C~ 说起电子邮件大家都不陌生&#xff0c;哪怕是在当前微信或者QQ已经非常普遍的今天&#xff0c;电子邮件在我们很多人的工作中都充当了重要的通信工具。…

【编程语言】Python平台化为何比Java差?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

第十七章 策略模式

目录 1 策略模式概述 2 策略模式原理 3 策略模式实现 4 策略模式应用实例 5 策略模式总结 1 策略模式概述 策略模式(strategy pattern)的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立…

2.PyQT6程序入门实例

1.第一个程序HelloWorld实现 # conding:utf8from PyQt6.QtWidgets import QApplication, QWidget, QLabel import sysapp QApplication(sys.argv) # 创建一个应用 print("sys.argv&#xff0c;获取项目路径", sys.argv) # 获取参数 print("app.arguments()&qu…

05-5.3.1_1 二叉树的先中后序遍历

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

vmmare虚拟机没有被分配ip地址问题;NAT模式下一直变化问题

打开任务管理器–>服务–>找到与VM和server相关的服务 发现NAT和DHCP服务被关闭了 尝试启动&#xff0c;报错 尝试一 虚拟网络编辑器点击还原默认设置 尝试二 可以了 ip变化 更改租用时长

【C++】C++入门的杂碎知识点

思维导图大纲&#xff1a; namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域&#xff0c;它可以将内部的成员隔绝起来。举个例子&#xff0c;我们都知道有全局变量和局部变量&#xff0c;全局变量存在于全局域…

定点数的加减法以及浮点数的表示

加减法运算是计算机中最基本的计算&#xff0c;由于减法可以看成是负值是加法&#xff0c;因此计算机中使用补码表示有符号数之后&#xff0c;可以将减法运算和加法运算合并在一起讨论。 1.补码的加减运算 补码加减运算的规则简单&#xff0c;公式如下(设机器字长为n)&#x…

Spark日志有哪些?

spark.log&#xff1a;记录作业运行日志&#xff0c;包括Spark框架内部日志和用户通过日志接口输出的日志。 executor 启动结束日志&#xff1a; job&#xff0c;stage&#xff0c;task提交结束日志&#xff1a; pmap.log&#xff1a;周期性地截取Driver或Executor的pmap和…

基于SSM+Jsp的列车票务信息管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

多设备互通、开箱即用的私有化笔记软件,极空间部署最强备忘录项目『Memos』

多设备互通、开箱即用的私有化笔记软件&#xff0c;极空间部署最强备忘录项目『Memos』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 手机上的备忘录我想绝大多数的小伙伴都会用到&#xff0c;日常用来记录一下生活中的消费开支清单&#xff0c;或者工作中记录一些重要的任务或项…

欧洲杯“球迷狂欢趴”开启,容声带来“健康养鲜”新理念

6月15日&#xff0c;容声冰箱在深圳举行了异彩纷呈的“欧洲杯养鲜补给站 球迷狂欢趴”系列活动。 容声国内营销总经理韩栋现场发布“以品质领先 为健康养鲜”的主题内容&#xff0c;强调容声将以健康养鲜技术产品的升级迭代&#xff0c;满足用户品质生活需求。 作为有着41年发…