宕机了,Redis 如何避免数据丢失?

613a3eb0d9b75cb85e2da579f7350190.jpeg

程序员的成长之路

互联网/程序员/技术/资料共享 

关注

阅读本文大概需要 8 分钟。

来自:juejin.cn/post/7193597571305046071

  • 前言

  • AOF

    • 日志是如何实现的

    • 写后日志的优势与风险

  • 日志的写回策略

  • 日志的重写

    • 重写的作用

    • 重写的过程

  • RDB

  • 快照的原理

  • 混合 AOF/RDB

  • 总结


前言

如果有人问你:"你会把 Redis 用在什么业务场景下?"

我想你大概率会说:"我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快。"

没错,这确实是 Redis 的一个普遍使用场景,但是,这里也有一个绝对不能忽略的问题:「一旦服务器宕机,内存中的数据将全部丢失」 。

目前,Redis 的持久化主要有两大机制,即 「AOF(Append Only File)日志和 RDB(Redis DataBase) 快照」 。

AOF

日志是如何实现的

说到日志,我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL),在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复。不过,AOF 日志正好相反,它是写后日志,"写后"的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。

96b329f3d82c694da87a34673af69db5.jpegAOF日志是如何实现的

AOF 里记录的是 Redis 收到的每一条命令,这些命令是以文本形式保存的。

我们以 Redis 收到“set testkey testvalue”命令后记录的日志为例,看看 AOF 日志的内容。其中,“*3”表示当前命令有三个部分,每部分都是由“数字开头,后面紧跟着具体的命令、键或值。这里,数字表示这部分中的命令、键或值一共有多少字节。例如,3 set”表示这部分有 3 个字节,也就是“set”命令。

e550c4cb921b22858575cd3745ec0eb4.jpegAOF日志是如何实现的

写后日志的优势与风险

「为了避免额外的检查开销,Redis 在向 AOF 里面记录日志的时候,并不会先去对这些命令进行语法检查」 。

如果先记日志再执行命令的话,日志中就有可能记录了错误的命令,Redis 在使用日志恢复数据时,就可能会出错。而写后日志这种方式,就是先让系统执行命令,只有命令能执行成功,才会被记录到日志中,否则,系统就会直接向客户端报错。

所以,Redis 使用写后日志这一方式的一大好处是,可以避免出现记录错误命令的情况。

除此之外,写后日志一个好处:它是在命令执行后才记录日志,「不会阻塞当前的写操作」 。

AOF 也有两个潜在的风险:

  • 风险一:如果刚执行完一个命令,还没有来得及记日志就宕机了,那么这个命令和相应的数据就有丢失的风险。

    • 如果此时 Redis 是用作缓存,还可以从后端数据库重新读入数据进行恢复。

    • 如果 Redis 是直接用作数据库的话,此时,因为命令没有记入日志,所以就无法用日志进行恢复了。

  • 风险二:AOF 虽然避免了对当前命令的阻塞,但可能会给下一个操作带来阻塞风险。

    • AOF 日志也是在主线程中执行(写回策略为 always 时),如果在把日志文件写入磁盘时,磁盘写压力大,就会导致写盘很慢,进而导致后续的操作也无法执行了。

这两个风险都是和 AOF 写回磁盘的时机相关的。这也就意味着,如果我们能够控制一个写命令执行完后 AOF 日志写回磁盘的时机,这两个风险就解除了。

日志的写回策略

AOF 机制一共有三种写回策略,也就是 AOF 配置项 appendfsync 的三个可选值。

  • 「Always 同步写回」 :每个写命令执行完,立马同步地将日志写回磁盘;

  • 「Everysec 每秒写回」 :每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;

  • 「No 操作系统控制的写回」 :每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。

针对避免主线程阻塞和减少数据丢失问题,这三种写回策略都无法做到两全其美。

ccdc0a4f42eabf333d5d1b21b8b4a236.jpeg日志的写回策略

我们就可以根据系统对高性能和高可靠性的要求,来选择使用哪种写回策略了。

  • 想要获得高性能,就选择 No 策略;

  • 想要得到高可靠性保证,就选择 Always 策略;

  • 允许数据有一点丢失,又希望性能别受太大影响的话,那么就选择 Everysec 策略。

日志的重写

重写的作用

AOF 是以文件的形式在记录接收到的所有写命令。「随着接收的写命令越来越多,AOF 文件会越来越大」 。这也就意味着,我们一定要小心 AOF 文件过大带来的性能问题,主要在于以下三个方面:

  • 一是,文件系统本身对文件大小有限制,无法保存过大的文件;

  • 二是,如果文件太大,之后再往里面追加命令记录的话,效率也会变低;

  • 三是,如果发生宕机,AOF 中记录的命令要一个个被重新执行,用于故障恢复,如果日志文件太大,整个恢复过程就会非常缓慢,这就会影响到 Redis 的正常使用。

AOF 重写机制就是在重写时,Redis 根据数据库的现状创建一个新的 AOF 文件,也就是说,「读取数据库中的所有键值对,然后对每一个键值对用一条命令记录它的写入」 。重写机制具有“多变一”功能。所谓的“多变一”,也就是说,旧日志文件中的多条命令,在重写后的新日志中变成了一条命令。

ca737005f63b31d2d8d1d974fc61b4b9.jpeg重写的作用

重写的过程

AOF 日志由主线程写回不同,重写过程是由「后台子进程 bgrewriteaof 来完成的,这也是为了避免阻塞主线程」 ,导致数据库性能下降。

我把重写的过程总结为“「一个拷贝,两处日志」 ”。

“一个拷贝”就是指,每次执行重写时,主线程 fork 出后台的 bgrewriteaof 子进程。此时,fork 会把主线程的内存拷贝一份给 bgrewriteaof 子进程,这里面就包含了数据库的最新数据。然后,bgrewriteaof 子进程就可以在不影响主线程的情况下,逐一把拷贝的数据写成操作,记入重写日志。

第一处日志,指的是因为主线程未阻塞,仍然可以处理新来的操作,Redis 会把这个操作写到它的缓冲区。这样一来,即使宕机了,这个 AOF 日志的操作仍然是齐全的,可以用于恢复。

第二处日志,就是指新的 AOF 重写日志。这个操作也会被写到重写日志的缓冲区。这样,重写日志也不会丢失最新的操作。等到拷贝数据的所有操作记录重写完成后,重写日志记录的这些最新操作也会写入新的 AOF 文件,以保证数据库最新状态的记录。

此时,我们就可以用新的 AOF 文件替代旧文件了。

8ccb52253106056470dbea6fbb336bc4.jpeg重写的过程

总结来说,每次 AOF 重写时,Redis 会先执行一个内存拷贝,用于重写;然后,使用两个日志保证在重写过程中,新写入的数据不会丢失。而且,「因为 Redis 采用子进程进行日志重写,所以,这个过程并不会阻塞主线程」 。

正因为记录的是操作命令,而不是实际的数据,所以,用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。这当然不是理想的结果。那么,还有没有既可以保证可靠性,还能在宕机时实现快速恢复的其他方法呢?

RDB

对 Redis 来说,它实现类似照片记录效果的方式,把某一时刻的状态以文件的形式写到磁盘上,也就是快照(RDB 文件)。这样一来,即使宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。

和 AOF 相比,RDB 记录的是某一时刻的数据,并不是操作,所以,在做数据恢复时,我们可以直接把 RDB 文件读入内存,很快地完成恢复。

快照的原理

Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bgsave。

  • 「save」 :在主线程中执行,会导致阻塞;

  • 「bgsave」 :创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。

我们可以通过 bgsave 命令来执行全量快照,这既提供了数据的可靠性保证,也避免了对 Redis 的性能影响。

在执行快照的同时,Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),正常处理写操作。bgsave 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。

如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么,主线程和 bgsave 子进程相互不影响。但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被复制一份,生成该数据的副本(键值对 C’)。然后,主线程在这个数据副本上进行修改。同时,bgsave 子进程可以继续把原来的数据(键值对 C)写入 RDB 文件。

5aab3280d4ac926c271dd7b3d70f8586.jpeg快照的原理

这样既保证了快照的完整性,也允许主线程同时对数据进行修改,避免了对正常业务的影响。

混合 AOF/RDB

虽然 bgsave 执行时不阻塞主线程,但是,如果频繁地执行全量快照,也会带来两方面的开销。

一方面,频繁将全量数据写入磁盘,会给磁盘带来很大压力,多个快照竞争有限的磁盘带宽,前一个快照还没有做完,后一个又开始做了,容易造成恶性循环(所以,在 Redis 中如果有一个 bgsave 在运行,就不会再启动第二个 bgsave 子进程)。

另一方面,bgsave 子进程需要通过 fork 操作从主线程创建出来。虽然,子进程在创建后不会再阻塞主线程,但是,「fork 这个创建过程本身会阻塞主线程」 ,而且主线程的内存越大,阻塞时间越长。

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,「内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作」 。这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。

e3e7ceafa362a43777ee082091bed78e.jpeg混合 AOF/RDB

总结

最后,关于 AOF 和 RDB 的选择问题,我想再给你提三点建议:

  • 数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择;

  • 如果允许分钟级别的数据丢失,可以只使用 RDB;

  • 如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。

<END>

推荐阅读:

我也体验了一把 ChatGPT 自动写程序,确实巴适的很!

一款可以代替 viso 的开源免费绘图神器,程序员必备!

互联网初中高级大厂面试题(9个G)
内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取!                                  朕已阅

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

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

相关文章

硬件大熊原创合集(2023/02更新)

技术2月份更新篇章&#xff1a; 问了ChatGPT几个硬件问题 智能开关保险丝选型&安规要求 智能墙壁开关电源篇——AC-DC概述 这个月花了很多的精力在梳理产品的技术架构&#xff0c;过程中总会发现很多自己尚且模棱两可的知识点&#xff0c;这让人有一种摸索的越多&#xff0…

足球、篮球、乒乓球的动作识别通用方案开源

北京冬奥会即将开幕&#xff0c;全民健身如火如荼。2020年夏季奥运会有46项体育项目&#xff0c;2022年冬奥会有15项体育项目&#xff0c;丰富的项目涉及的姿势标准也各有区别。运动员如何科学地进行体育锻炼、准确矫正健身动作&#xff1f;教练员如何借助技术提供更智能化的训…

电商导购CPS,淘宝联盟如何跟单实现用户和订单绑定

前言 大家好&#xff0c;我是小悟 做过自媒体的小伙伴都知道&#xff0c;不管是发图文还是发短视频&#xff0c;直播也好&#xff0c;可以带货。在你的内容里面挂上商品&#xff0c;你自己都不需要囤货&#xff0c;如果用户通过这个商品下单成交了&#xff0c;自媒体平台就会…

高考英语口语测试软件,练习英语口语的app有哪些

随着国际化的发展&#xff0c;英语越来越普遍。英语中口语也是很重要的成分之一。也是跟老外交流或者英语考试的重要考点之一。我们有很多方法锻炼口语。什么方法最快捷最有效方便&#xff1f;下面我们看看几款最受欢迎的英语口语练习app。 练习口语的app 1、口语侠 一款非常实…

几个常见的语音交互平台的简介和比较

1.概述 最近做了两个与语音识别相关的项目&#xff0c;两个项目的主要任务虽然都是语音识别&#xff0c;或者更确切的说是关键字识别&#xff0c;但开发的平台不同&#xff0c; 一个是windows下的&#xff0c;另一个是android平台的&#xff0c;于是也就选用了不同的语音识别平…

Chatbot UI老外在用的gpt网页版 搭建方法分享!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT资源 Chatbot UI 高仿ChatGPT官网&#xff0c;中文还支持贼好&#xff0c;界面美观度间距还需要打磨。是老外做的吗&#xff1f; ​ 环境部署 更新环境 apt update -y && apt upg…

小米多模网关通过telnet刷入改版固件,完美接入HASS

一、环境介绍 宿主机&#xff1a;树莓派3B Raspbian系统 HA安装方式&#xff1a;HASS系统使用hass.io一键脚本进行安装 多模网关&#xff1a;ZNDMWG03LM&#xff08;软件版本v1.4.5_0012&#xff09; 2、为什么要刷固件 A 、因为要把该多模网关接入到homeassistant&#xf…

国际交流学术英文写作hnu(仅供参考)

本文仅供参考&#xff0c;希望同学们继续加油&#xff01;

用letax写毕业论文-- 中英文封面

一、中文封面&#xff1a; 中文封面主要是 姓名、专业、指导教师、培养单位 这几项对齐这里比较麻烦&#xff0c; 我是用 tabular 来描述这个部分&#xff0c;然后字数不够的补空格 i.e. \hspace*{0.67em}. 具体实现代码如下&#xff1a; 二、 英文封面 英文封面跟中文封面类…

新手请看这里,如何撰写一篇英文论文

第一次写英文论文&#xff0c;无论是期刊论文、还是会议论文&#xff0c;都是很苦很累的一件事情。 查找文献、阅读文献&#xff0c;当然&#xff0c;主要都得是英文的&#xff0c;再加上真正动手撰写&#xff0c;这些环节都在考验我们的英文阅读和写作能力。 在科研这条路上…

【中英文论文写作——图片和表格】

1. 前言 前期讲了论文头部和正文&#xff0c;接下来分享论文写作之图片和表格&#xff0c;属于锦上添花部分&#xff01; 2. 图片和表格要求 图标要求&#xff1a;专业性&#xff0c;美观性&#xff0c;简洁性 Chart Suggestions: A Thought Starter (Andrew Abela) 3. 软件推…

ChatGPT能够帮留学生完成毕业论文写作吗?

ChatGPT采用交互式对话界面&#xff0c;根据用户输入的指令以近似人类交流的方式作出回应&#xff0c;自问世以来一直令世人为之惊叹。目前&#xff0c;ChatGPT已成为有史以来用户增长速度最快的应用程序。 与此同时&#xff0c;研究人员对学术写作的关注程度与日俱增。人工智能…

【论文写作】——设置中英文字体

打开文件 点击选项 选择高级 取消中文字体也应用于西文的勾选 然后选中全文&#xff0c;设置中文字体为宋体&#xff0c;设置英文字体为times new Roman。

谷歌学术中英文网址

之前用谷歌学术的时候一直用的是https://scholar.google.com/这个网址&#xff0c;这个是谷歌学术的国外版比较适合生成外文期刊格式的参考文献&#xff0c;如下图所示&#xff1a;   但国内写文献参考格式的时候大多是采用GPT格式&#xff0c;这个在谷歌学术国外版是直接生…

一个典型的语音识别系统

一个典型的语音识别系统 标签&#xff1a; 语音识别 2015-01-05 16:56 3966人阅读 评论(0) 收藏 举报 分类&#xff1a; 自然语言识别研究&#xff08;9&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 一、语音识别技术 转载请表…

语音识别系列1:语音识别Speech recognition综述

目录 1 什么是语声识别VOICE RECOGNITION&#xff1f; 2 语声识别&#xff08;VOICE RECOGNITION&#xff09;和语音识别(SPEECH RECOGNITION)有什么区别&#xff1f; 3 语声识别&#xff08;VOICE RECOGNITION&#xff09;系统的类型 4 语音识别系统的类型 5 语音识别简…

语音识别-特征提取 (一)

一&#xff0e;语音的产生简介 1.1 发音器官 人体的语音是由人体的发音器官在大脑的控制下做生理运动产生的。人体发音器官由三部分组成&#xff1a;肺和气管、喉、声道。 肺是语音产生的能源所在。气管连接着肺和喉&#xff0c;是肺与声道的联系通道。喉是由一个软骨和肌肉组…

分享本周所学——人工智能语音识别模型CTC、RNN-T、LAS详解

本人是一名人工智能初学者&#xff0c;最近一周学了一下AI语音识别的原理和三种比较早期的语音识别的人工智能模型&#xff0c;就想把自己学到的这些东西都分享给大家&#xff0c;一方面想用浅显易懂的语言让大家对这几个模型有所了解&#xff0c;另一方面也想让大家能够避免我…

如何跟踪语音领域的技术

语音顶会 ICASSP 所有年份论文集下载地址&#xff1a;https://ieeexplore.ieee.org/xpl/conhome/1000002/all-proceedings Interspeech 所有年份论文集下载地址&#xff1a;https://www.isca-speech.org/archive/ 期刊 IEEE Transactions on Audio, Speech and Language Proces…

语音识别(Speech Recognition)综述

文章目录 1. 语音识别的基本单位1.1 Phoneme&#xff08;音位&#xff0c;音素&#xff09;1.2 Grapheme&#xff08;字位&#xff09;1.3 Word&#xff08;词&#xff09;1.4 Morpheme&#xff08;词素&#xff09;1.5 bytes 2. 获取语音特征&#xff08;Acoustic Feature&…