Redis AOF重写阻塞问题分析

Redis能保证数据不丢失吗之AOF 我们都知道,Redis是一个基于内存的k-v数据库,既然是基于内存的,那么Redis如何保证数据不丢失?以及真的能做到数据的百分百不丢失吗? 阅读详情

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>> hot3.png

问题背景

某个业务线使用Redis集群保存用户session数据,数据量大约在4千万-5千万,每天发生3-4次AOF重写,每次时间持续30-40秒,AOF重写期间出现Redis主进程阻塞,应用端响应超时的问题。

环境:Redis 2.8,一主一从。

什么是AOF重写

AOF重写是AOF持久化的一个机制,用来压缩AOF文件,通过fork一个子进程,重新写一个新的AOF文件,该次重写不是读取旧的AOF文件进行复制,而是读取内存中的Redis数据库,重写一份AOF文件,有点类似于RDB的快照方式。

在子进程进行AOF重启期间,Redis主进程执行的命令会被保存在AOF重写缓冲区里面,这个缓冲区在服务器创建子进程之后开始使用,当Redis执行完一个写命令之后,它会同时将这个写命令发送给 AOF缓冲区和AOF重写缓冲区。如下图:

阻塞原因

当子进程完成AOF重写工作之后,它会向父进程发送一个信号,父进程在接收到该信号之后,会调用一个信号处理函数,并执行以下工作:

  • 将AOF重写缓冲区中的所有内容写入到新的AOF文件中,保证新 AOF文件保存的数据库状态和服务器当前状态一致。
  • 对新的AOF文件进行改名,原子地覆盖现有AOF文件,完成新旧文件的替换
  • 继续处理客户端请求命令。

在整个AOF后台重写过程中,只有信号处理函数执行时会对 Redis主进程造成阻塞,在其他时候,AOF后台重写都不会阻塞主进程,如下图所示:

解决方案

这是当时的Redis配置:

127.0.0.1:6379> config get *append*
1) "no-appendfsync-on-rewrite"
2) "no"
3) "appendonly"
4) "yes"
5) "appendfsync"
6) "everysec"

从配置看,原因理论上就很清楚了:我们的这个Redis实例使用AOF进行持久化(appendonly),appendfsync策略采用的是everysec刷盘。但是AOF随着时间推移,文件会越来越大,因此,Redis还有一个rewrite策略,实现AOF文件的减肥,但是结果是幂等的。我们no-appendfsync-on-rewrite的策略是 no,这就会导致在进行rewrite操作时,appendfsync会被阻塞。如果当前AOF文件很大,那么相应的rewrite时间会变长,appendfsync被阻塞的时间也会更长。

这不是什么新问题,很多开启AOF的业务场景都会遇到这个问题。解决的办法有这么几个:

  1. 将no-appendfsync-on-rewrite设置为yes. 这样可以避免与appendfsync争用文件句柄,但是在rewrite期间的AOF有丢失的风险。
  2. 给当前Redis实例添加slave节点,当前节点设置为master, 然后master节点关闭AOF,slave节点开启AOF。这样的方式的风险是如果master挂掉,尚没有同步到slave的数据会丢失。

我们采取了折中的方式:

  • 在master节点设置将no-appendfsync-on-rewrite设置为yes(表示在日志重写时,不进行命令追加操作,而只是将命令放在重写缓冲区里,避免与命令的追加造成磁盘IO上的冲突),同时auto-aof-rewrite-percentage参数设置为0关闭主动重写
  • 为了防止AOF文件越来越大,我们在缓存云平台上配置在凌晨低峰期定时手动执行bgrewriteaof命令完成每日一次的AOF重写
  • 在重写时为了避免硬盘空间不足或者IO使用率高影响重写功能,我们还添加了硬盘空间报警和IO使用率报警保障重写的正常进行

那么如果rewrite的时候对新的写操作不进行fsync,那么新的AOF文件里面是否会丢失这个写操作呢?

答案是不会的,Redis会将新的写操作放在重写缓存区中,等待rewrite操作完成的时候,将新操作直接追加到新的AOF中。

参考资料

Redis中AOF的潜在阻塞点 在加载过程中,Redis会继续接受新的客户端请求,并将它们缓存在内存中,然后在AOF文件加载完成后依次执行这些请求。在加载过程中,Redis会继续接受新的客户端请求,并将它们缓存在内存中,然后在AOF文件加载完成后依次执行这些请求。在默认情况下,Redis每秒钟执行一次AOF文件的写入操作,通过将写入操作缓冲到内存中,减少了对磁盘的频繁访问。在默认情况下,Redis每秒钟执行一次AOF文件的写入操作,通过将写入操作缓冲到内存中,减少了对磁盘的频繁访问。以确保每个写操作都立即写入磁盘,但这会增加阻塞的风险。 阅读详情

相关推荐

Redis-x64-5.0.14

Redis-x64-5.0.14

AOF后台重写也会造成阻塞

Redis为了解决AOF后台重写造成的数据不一致问题,设置了AOF重写缓冲区。即使设置了no-appendfsync-on-rewrite yes也会造成短暂的主进程阻塞。原因就在于子进程完成AOF重写之后,会发送一个信号给主进程,而父进程会在这个时候调用信号处理函数,主要是将新的AOF文件替换旧的AOF文件,那么在这段时间内, 主进程是阻塞的。

jaybroker的博客 1880

从零搭建ECG心电图仪:模拟前端电路设计与噪声对抗实战

在电子工程和生物医学信号处理领域,微弱信号的采集与放大是核心挑战。其基本原理在于利用高精度模拟电路,从强大的环境噪声中提取出有用的差分信号。这项技术的核心价值在于将理论上的传感器信号转化为稳定、可靠的可用数据,是连接物理世界与数字系统的关键桥梁。在医疗监护、工业传感和科学测量等场景中,高性能的模拟前端设计直接决定了整个系统的精度与可靠性。本文聚焦于生物电信号采集这一具体应用,深入探讨如何运用差分放大器、低通滤波器和陷波滤波器等经典模块,构建一个能够有效对抗工频干扰和接触噪声的实用电路,最终实现从人体体表清晰

weixin_30616969的博客 458

Redis AOF重写阻塞因素

持久化阻塞 对于开启了持久化功能的Redis节点, 需要排查是否是持久化导致的阻塞。 持久化引起主线程阻塞的操作主要有: fork阻塞、 AOF刷盘阻塞、HugePage写操作阻塞。 fork操作 当Redis做RDB或AOF重写时, 一个必不可少的操作就是执行fork操作创建子进程, 对于大多数操作系统来说fork是个重量级错误。虽然fork创建的子进程不需要拷贝父进程的物理内存空间, 但是会复制父进程的空间内存页表。例如对于10GB的Redis进程, 需要复制大约20MB的内存页表, 因...

SBS技术栈-晓白 1304

多模态变体—ALIGN:高效的图像-文本学习

ALIGN 论文介绍了该模型的关键技术。无人工标注数据:使用互联网数据进行训练,不依赖人工清洗的数据集。高效的对比学习策略:采用大规模图像-文本配对数据,通过对比学习优化嵌入空间。支持零样本(zero-shot)学习:可以在没有专门训练的情况下执行多种任务,如分类、检索等。可扩展性强:ALIGN 采用高效的 CNN 或 Transformer 作为编码器,适用于大规模计算。

Azperk的博客 1218

TMP112/TMP102温度传感器驱动开发与嵌入式实战

数字温度传感器是嵌入式系统环境感知的核心器件,其通过I²C等标准总线实现高精度、低功耗测温。原理上依赖ΔΣ模数转换与二进制补码数据格式,结合寄存器配置实现模式控制、阈值报警与功耗管理。技术价值体现在±0.5°C级精度、1μA级静态电流及SOT-563超小封装带来的系统集成优势。广泛应用于工业MCU热监控、电池物联网终端、医疗电子温度补偿及汽车ECU板级测温等场景。本文围绕TMP112/TMP102展开,深入解析寄存器协议、硬件接口约束、HAL驱动分层设计、FreeRTOS任务调度及生产级校准方法,覆盖从芯片

weixin_35756690的博客 674

Redis有哪些持久化方式?Redis数据持久化AOF和RDB原理

简单来说,就是客户在执行一个数据变更的操作,Redis就会把这样的一个命令,追加到aof缓冲区。当执行保存操作时,Redis会将数据集的状态进行快照,并将其转换为二进制格式,然后将该快照保存到一个文件中。最初,Redis打算去分析原来的AOF文件,然后将其中的冗余指令去掉来给AOF文件瘦瘦身。为了节约空间,Redis定义了一个二进制的格式,把数据一条一条码在一起,生成了一个rdb文件。随着时间的推移,备份文件越来越大。也就是说当AOF文件大小达到某一个阈值的时候,就会把这个文件里面的相同的指令进行压缩。

qq_46130027的博客 271

【OCCT】第3讲 OpenCasCade&VTK实现三维建模Demo

本文分享OpenCasCade&VTK共同实现三维建模Demo,希望对各位小伙伴有所帮助!1. 新建Visual Studio工程新建空项目添加main.cpp添加main函数2. 配置OpenCasCade & VTK 库配置包含路径:配置库文件:添加链接库:添加运行环境:注意:VTK库的版本要与编译OpenCasCade库时选择的版本一致,否则会出错!

qq_40041064的博客 779

深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析

缓存服务器有一个很重要的指标就是能否持久化,如果缓存服务器不支持持久化的话,一些相对重要的数据都不能存在缓存服务器中了,毕竟谁也不能保证服务百分百可用,一旦缓存服务器宕机,所有数据就都丢失了。 今天来分享一下Redis的持久化两种持久化方式RDB和AOF。 1、RDB RDB(redis database),可以理解为快照/内存快照,RDB持久化过程是将当前进程中的数据生成快照存储到硬盘...

lebronchen的博客 6318

vue支付项目-APP支付宝支付功能

如果用户已安装支付宝客户端,商家 App 唤起支付宝完成支付,支付完后跳回到商家 App 内,最后展示支付结果。如果用户没有安装支付宝客户端,商家 App 内会调起支付宝网页支付收银台,用户登录支付宝账号,支付完后展示支付结果。1.点击按钮开通或者续费,会验证是否选择会员商品以及对协议是否查看选中(这里根据项目需要自行验证,可忽略),验证通过打开选择支付方式弹窗页面,选择微信支付或者支付宝支付;4.可取消支付,放弃支付会返回会员页面,页面提示支付取消;1.判断支付方式,如果是2,则是支付宝支付方式。

总结前端开发中遇到的问题,分享前端知识 1万+

汽车IVI中控开发入门及进阶(三):概述

开发板的作用当然是为了解决一些应用而设计的,主体是板,终极目的是应用,中间过程则是开发,是基于板的开发。可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到芯片上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。所以这些实现都是建构在汽车中控开发板的解决方案上的,最核心的当然就是一颗中控主控芯片,这是一颗国产中控双核DA主控芯片,AECQ100认证的车规级芯片。Q:uboot的作用是什么?

码农17年的博客 1406

redis因AOF追加磁盘阻塞发生故障转移

追加AOF时磁盘繁忙redis 错误日志截图下图为AOF工作流程图AOF工作流程图1.所有的写入命令会追加aof_buf(缓冲区中)。2.AOF缓冲区根据对应的策略向硬盘做同步操作。3.随着AOF文件越来越大,需要定期对AOF文件进行重写,达成压缩的目的(对一个key跟新100次会有100条记录,重写后只留最后一条).4.当redis服务器重启时,可以加载AOF文件进行数据...

weixin_33974433的博客 532

华为MetaERP在财务模块(GL/AP/AR/FA)及子账模块效率优化、月末关账加速、与外部系统对账方面,已形成一套**“并行+实时+智能化”**的完整技术方案

华为MetaERP推出"并行+实时+智能化"技术方案,显著提升财务模块效率:1)采用三级并行策略和内存计算,使子账模块单任务处理时间从142分钟降至9分钟;2)通过并行关账架构将月末关账时间从68小时压缩至7.2小时;3)运用AI智能对账提升效率50%,并支持异步流程和区块链审计。典型场景测试显示月结耗时下降89%,CPU利用率提升116%。方案建议分阶段实施,注意依赖分析、任务粒度设计和性能监控,避免过度并行。该方案已有效解决大型集团财务处理效率低、关账慢、对账难等痛点。

金牌架构师 557

Redis中的AOF持久化、重写阻塞、fork阻塞

AOF持久化AOF怎么记录的AOF记录了什么AOF的潜在风险数据丢失阻塞写回策略AOF的重写机制AOF重写如何避免阻塞 Redis虽然是基于内存的键值对数据库,但是它同时也支持持久化,可以根据自己的业务来判断是否可以当作数据持久化的数据库使用。 Redis支持两种持久化文件: RDB:记录数据某一时刻的快照; AOF:更新命令以追加的方式写入文件。 AOF怎么记录的 AOF是写后日志,意思是先写内存在记日志。 AOF记录了什么 Redis中的AOF记录了执行的命令,这些命令就保存在文件中。Redis在记

搞数学的架构师的博客 1991

07RK3568 I2S主模式 FPGA

RK3568与fpga通过i2s0连接,fpga连接音频芯片ES8388,RK为i2s主模式。调试时发现可正常采集来自fpga的数据。不可发送数据至fpga。由于i2s后连接fpga这里用了Rockchip的dummy-codec,一个虚拟的编解码器。

qq_39451352的博客 302

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis AOF 追加阻塞问题分析处理

当Redis开启AOF持久化时,常用的同步硬盘的策略是everysec,用于平衡性能和数据安全性。对于这种方式,Redis使用另一条线程每秒执行fsync同步硬盘。当系统硬盘资源繁忙时,会造成Redis主线程阻塞,如图所示。 阻塞流程分析: 1)主线程负责写入AOF缓冲区。 2)AOF线程负责每秒执行一次同步磁盘操作,并记录最近一次同步时间。 3)主线程负责对比上次AOF同步时间: 如果距上次同步成功时间在2秒内,主线程直接返回。 如果距上次同步成功时间超过2秒,主线程将会阻塞,直到同步.

ccy19910925的博客 1660

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

redis 持久化

Redis每执行一条写操作命令,就把该命令以追加的方式写到一个文件里,然后重启Redis时,先去读取这个文件里的命令,并且执行他,这就相当于恢复了数据这就是Redis中的AOF(Append Of File)持久化功能,。AOF日志文件其实就是普通的文本,不过里面的内容如果不知道规则的话应该是看不懂的。以[set name xiaolin]为例,Redis执行了这条命令后,记录在AOF日志的内容如下图*3表示当前命令有三部分,每行以$+数字开头,数字表示这部分的命令,键或值一共有多少字节。

qq_73182976的博客 1273

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Redis 的大 Key 对持久化有什么影响

当 AOF 写回策略配置了 Always 策略,如果写入是一个大 Key,主线程在执行 fsync() 函数的时候,阻塞的时间会比较久,因为当写入的数据量很大的时候,数据同步到硬盘这个过程是很耗时的。AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过fork()函数创建一个子进程来处理任务。会有两个阶段会导致阻塞父进程(主线程):创建子进程的途中,由于要复制父进程的页表等数据结构,阻塞的时间跟页表的大小有关,页表越大,阻塞的时间也越长;

sanylove的博客 1057

图解Redis持久性篇

当 AOF 写回策略配置了 Always 策略,如果写入是一个大 Key,主线程在执行 fsync() 函数的时候,阻塞的时间会比较久,因为当写入的数据量很大的时候,数据同步到硬盘这个过程是很耗时的。AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过fork()函数创建一个子进程来处理任务。创建子进程的途中,由于要复制父进程的页表等数据结构,阻塞的时间跟页表的大小有关,页表越大,阻塞的时间也越长;

小小博客 872

Redis持久化模式RDB和AOF讲解

1.Redis的持久化策略包括RDB和AOF两种方式。2.RDB默认配置在Docker容器中的Redis实例中。3.AOF以日志形式存储命令,通过执行日志文件恢复数据。4.RDB通过全量备份数据到磁盘,适用于灾备和恢复。

小匠的Blog 1032

Redis持久化的原理及优化

Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。 RDB 保存数据快照至一个RDB文件中,用于持久化。RDB操作和Mysql Dump相似。 执行方式 save。同步操作,会阻塞Redis。 bgsave。调用linux的fork(),然后使用新的线程执行复制。但是fork期间也会阻塞Redis,但...

全菜工程师小辉的博客 5632

聊聊 Redis 高可用之持久化AOF和RDB分析

Redis 持久化概述 Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以某种形式把内存中的数据保存到磁盘中;当 Redis 重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。 Redis 提供了两种不同的持久化方法来讲数据存储到硬盘上 : RDB:一种称为快照的方式,是 将某一时刻内存中的所有数据以快照的形式写入硬盘上。 AOF:一种称为只追加文件的方式,它会是将每次执行的写命令以追加的

small_love的专栏 380

AOF持久化

RDB持久化是将进程数据写入文件,而AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中(有点像MySQL的binlog);当Redis重启时再次执行AOF文件中的命令来恢复数据。 与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案。 1. 开启AOF Redis服务器默认开启RDB,关闭AOF;要开启AOF,需要在配...

小麦大大博客 2万+

Redis 磁盘 I/O 阻塞导致连接超时问题复盘!

某日上午,生产环境监控系统触发大量告警,显示系统接口响应超时率异常升高。本次Redis连接超时问题的成功解决,充分体现了系统性问题排查方法的重要性。通过深入的日志分析、指标诊断和配置审查,我们准确定位了磁盘I/O阻塞这一根本原因,并制定了针对性的优化方案。这次经历提醒我们,在分布式系统中,性能问题往往涉及多个层面的交互。Redis作为内存数据库,其性能不仅取决于内存和网络,持久化机制对磁盘I/O的依赖同样不可忽视。只有建立全面的监控体系,深入理解各组件的工作原理,才能在问题发生时快速定位并有效解决。

cxytony的博客 979

整理一下:面试中经常被问到的 Redis 持久化与恢复,面试官不礼貌

JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

wfegre的博客 1088

Redis--大Key对持久化有什么影响

Redis-大key对持久化有什么影响

Need not to know 182
上一篇: Java反序列化与对象的创建
下一篇: HDFS 客户端读写超时时间解析
Viking_bird
博客等级 码龄11年 92粉丝 183原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值