我的编程空间,编程开发者的网络收藏夹
学习永远不晚

宕机了,Redis数据丢了怎么办?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

宕机了,Redis数据丢了怎么办?

  •  前言
  •  什么是AOF?
    •  三种写回策略
    •  日志文件太大怎么办?
    •  AOF重写会阻塞主线程吗?
    •  AOF的缺点
    •  总结
  •  什么是RDB?
    •  给哪些数据做快照?
    •  快照时能够修改数据吗?
    •  多久做一次快照?
    •  增量快照
    •  AOF和RDB混合使用
    •  总结
  •  总结

前言

Redis作为内存型的数据库,虽然很快,依然有着很大的隐患,一旦「服务器宕机」重启,内存中数据还会存在吗?

很容易想到的一个方案是从后台数据恢复这些数据,如果数据量很小,这倒是一个可行的方案。但是如果数据量过大,频繁的从后台数据库访问数据,压力很大;另外一方面恢复数据的时间极慢。

对于Redis来说,实现数据的持久化和快速恢复是至关重要。

今天这篇文章就来介绍一下Redis持久化的两种机制AOF日志、RDB快照。 

什么是 AOF 日志?

AOF(Append Only File)日志称之为「写后日志」,即是命令先执行完成,把数据写入内存,然后才会记录日志。

AOF日志(文本形式)会将收到每一条的命令且执行成功的命令以一定的格式写入到文本中(追加的方式)。

「写后日志有什么好处呢?」 如下:

  1.  对于写前日志无论命令是否执行成功都会被记录,但是Redis的写后日志则只有命令执行成功才会被写入日志,避免了日志中存在错误命令;
  2.  同时由于是命令执行成功之后才会写入日志,因此不会阻塞当前命令的执行。

但是AOF日志也有「潜在的风险」,分析如下:

     1.  由于是写后日志,如果在命令执行成功之后,在日志未写入磁盘之前服务器突然宕机,那重启恢复数据的时候,这部分的数据肯定在日志文件中不存在了,那么将会丢失。(无法通过后台数据库恢复的情况下)

    2.  虽然不会阻塞当前命令的执行,由于记录日志也是在主线程中(Redis是单线程),如果日志写入磁盘的时候突然阻塞了,肯定会影响下一个命令的执行。

为了解决上面的风险,AOF日志提供了三种回写策略。

三种写回策略

AOF机制提供了三种回写策略,这些都在appendfsync配置,如下:

  1.  Always(同步写回):命令执行完成,立马同步的将日志写入磁盘
  2.  Everysec(每秒写回):命令执行完成后,先将日志写入 AOF 文件的内存缓冲区,每隔一秒把缓冲区中内容写入磁盘。
  3.  No(操作系统控制的写回):每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。

其实这三中写回策略都无法解决主线程的阻塞和数据丢失的问题,分析如下:

  1.  同步写回:基本不丢失数据,但是每步操作都会有一个慢速的落盘操作,不可避免的影响主线程性能。
  2.  每秒写回:采用一秒写一次到 AOF 日志文件中,但是一旦宕机还是会丢失一秒的数据。
  3.  操作系统控制的写回:在写完缓冲区之后则会写入磁盘,但是数据始终在缓冲区的时间内一旦宕机,数据还是会丢失。

以上三种策略优缺点总结如下表:

日志文件太大怎么办?

随着数据量的增大,AOF日志文件难免会很大,这样将会导致写入和恢复数据都将变得非常慢。此时AOF提供了一种「重写机制」解决这一问题。

❝重写机制理解起来很简单,即是Redis会创建一个新的AOF日志文件,将每个键值对最终的值用一条命令写入日志文件中。

比如读取了键值对key1:value1,重写机制会在新的AOF日志文件中记录如下一条命令: 

  1. set key1 value1 

其实即是记录多次修改的最终的值记录在新的AOF日志文件中,这样当恢复数据时可直接执行该命令。

「为什么重写机制能够缩小文件呢?」 当一个键值被多次修改后,AOF日志文件中将会记录多次修改键值的命令,重写机制是根据这个键值最新状态为它生成「写入」命令,这样旧文件中的「多条」命令在重写后的新日志中变成了「一条」命令。

作者画了一张重写流程图,仅供参考,如下:

重写机制流程

AOF重写会阻塞主线程吗?

AOF重写虽然能够缩减日志文件的大小,达到减少日志记录和数据恢复的时间,但是在数据量非常的大情况下把整个数据库重写后的日志写入磁盘是一个非常耗时的过程,难道不会阻塞主线程吗?

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

其实重写的过程分为两个阶段:「一个拷贝,两处日志」。

「一个拷贝」:指每次执行重写时,主线程都fork一个子线程bgrewriteaof,主线程会把内存数据拷贝一份到子线程,此时子线程中包含了数据库的最新数据。然后子线程就能在不影响主线程的情况下进行AOF重写了。

「两处日志」是什么?如下:

  1.  第一处日志:子线程重写并未阻塞主线程,此时主线程仍然会处理请求,此时的AOF日志仍然正在记录着,这样即使宕机了,数据也是齐全的。第一处日志即是值主线程正在使用的日志。
  2.  第二处日志:指新的AOF重写日志;重写过程中的操作也会被写到重写日志缓冲区,这样重写日志也不会丢失最新的操作。等到拷贝数据的所有操作记录重写完成后,重写日志记录的这些最新操作也会写入新的 AOF 文件,以保证数据库最新状态的记录。此时,我们就可以用新的 AOF 文件替代旧文件了。

❝「总结」:Redis在进行AOF重写时,会fork一个子线程(不会阻塞主线程)并进行内存拷贝用于重写,然后使用两个日志保证重写过程中,新写入的数据不会丢失。

AOF的缺点

虽说进行了日志重写后,AOF日志文件会缩减很多,但是在数据恢复过程中仍然是一条命令一条命令(由于单线程,只能顺序执行)的执行恢复数据,这个恢复的过程非常缓慢。

总结

AOF这种通过逐一记录操作命令的日志方式,提供了三种写回策略保证数据的可靠性,分别是Always、Everysec和No,这三种策略在可靠性上是从高到低,而在性能上则是从低到高。

为了避免日志文件过大,Redis提供了重写的机制,每次重写都fork一个子线程,拷贝内存数据进行重写,将多条命令缩减成一条生成键值对的命令,最终重写的日志作为新的日志。

什么是RDB?

RDB(Redis DataBase)是另外一种持久化方式:内存快照。

❝RDB记录的是「某一个时刻」的内存数据,并不是操作命令。

这种方式类似于拍照,只保留某一时刻的形象。内存快照是将某一时刻的状态以文件的形式写入磁盘。这样即使宕机了,数据也不会丢失,这个快照文件就称为RDB文件。

❝由于记录的是某个时刻的内存数据,数据恢复非常快的,不需要像AOF日志逐一执行记录的命令。

给哪些数据做快照?

为了保证数据的可靠性,Redis执行的「全量快照」,也就是把内存中的所有数据都写到磁盘中。

随着数据量的增大,一次性把全部数据都写到磁盘中势必会造成线程阻塞,这就关系到Redis的性能了。

针对线程阻塞的问题Redis提供了两个命令,如下:

  1.  save:在主线程中执行,会导致主线程阻塞。
  2.  bgsave:fork一个子进程,专门用于写入RDB文件,避免了主线程的阻塞,这是Redis的默认配置。

这样就可以使用bgsave命令执行全量快照,既可以保证数据的可靠性也避免了主线程的阻塞。

快照时能够修改数据吗?

子线程执行全量快照的同时,主线程仍然在接受着请求,读数据肯定没有问题,但是如果个修改了数据,如何能够保证快照的完整性呢?

「举个栗子」:我在T时刻进行全量快照,假设数据量有8G,写入磁盘的过程至少需要20S,在这20S的时间内,一旦内存中的数据发生了修改,则快照的完整性就破坏了。

但是如果在快照时不能修改数据,则对Redis的性能有巨大的影响,对于这个问题,Redis是如何解决的呢?

❝Redis借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。

其实很简单,bgsave命令会fork一个子线程,这个子线程共享所有内存的数据,子线程会读取主线程内存中的数据,将他们写入RDB文件。

写时复制保证数据可修改

如上图,对于键值对A的读取并不会影响子线程,但是如果主线程一旦修改内存中一块数据(例如键值对D),这块数据将会被复制一个副本,然后bgsave子线程会将其写入RDB文件。

多久做一次快照?

快照只是记录某一时刻的数据,一旦时间隔离很久,则服务器一旦宕机,则会丢失那段时间的数据。

比如在T1时间做了一次快照,在T1+t时又做了一次快照,如果在t这个时间段内服务器突然宕机了,则快照中只保存了T1时刻的快照,在t时间段内的数据修改未被记录(丢失)。如下图:

t时刻宕机,未执行快照

从上图明显可以看出,「RDB并不是一个完美的日志记录方案」,只有让t时间逐渐缩小,才能保证丢失的数据缩小。

「那么问题来了,时间能够缩短1秒吗?」 即是每秒执行一次快照。

❝全量快照是记录某一个时刻的「全部」内存数据,每秒执行一次的对Redis性能影响巨大,于是「增量快照」就出来了。

增量快照

「增量快照是指做了一次全量快照之后,后续的快照只对修改的数据进行快照记录」,这样可以避免每次都全量快照的开销。

增量快照的前提是Redis能够记住修改的数据,这个功能其实开销也是巨大的,需要保存完整的键值对,这对内存的消耗是巨大的。

❝为了解决这个问题,Redis使用了AOF和RDB混合使用的方式。

AOF和RDB混合使用

这个概念是在Redis4.0提出的,简单的说就是「内存快照以一定的频率执行,比如1小时一次,在两次快照之间,使用AOF日志记录这期间的所有命令操作。」

❝混合使用的方式使得内存快照不必频繁的执行,并且AOF记录的也不是全部的操作命令,而是两次快照之间的操作命令,不会出现AOF日志文件过大的情况了,避免了AOF重写的开销了。

这个方案既能够用到的RDB的快速恢复的好处,又能享受都只记录操作命令的简单优势,强烈建议使用。

总结

RDB内存快照记录的是某一个时刻的内存数据,因此能够快速恢复;AOF和RDB混合使用能够使得宕机后数据快速恢复,又能够避免AOF日志文件过大。 

总结

本文介绍了两种数据恢复和持久化的方案,分别是AOF和RDB。

AOF介绍了什么?如下:

    1.  AOF是写后日志,通过记录操作命令持久化数据。

    2.  由于AOF是在命令执行之后记录日志,如果在写入磁盘之前服务器宕机,则会丢失数据;如果写入磁盘的时候突然阻塞,则会阻塞主线程;为了解决以上问题,AOF机制提供了三种写回的策略,每种策略都有不同的优缺点。

    3.  AOF日志文件过大怎么办?AOF通过fork一个子线程重写一个新的日志文件(共享主线程的内存,记录最新数据的写入命令),同时子线程重写,避免阻塞主线程。

RDB介绍了什么?如下:

  1.  RDB是内存快照,记录某一个时刻的内存数据,而不是操作命令。
  2.  Redis提供了两个命令,分别是save、bgsave来执行全量快照,这两个命令的区别则是save是在主线程执行,势必会阻塞主线程,bgsave是在fork一个子线程,共享内存。
  3.  RDB通过操作系统的「写时复制技术」,能够保证在执行快照的同时主线程能够修改快照。
  4.  由于两次快照之间是存在间隔的,一旦服务器宕机,则会丢失两次间隔时刻的数据,Redis4.0开始使用AOF日志记录两次快照之间执行的命令(AOF和RDB混合使用)。 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

宕机了,Redis数据丢了怎么办?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

宕机了,Redis数据丢了怎么办?

今天这篇文章就来介绍一下Redis持久化的两种机制AOF日志、RDB快照。

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

对于Redis来说,实现数据持久化以避免从后端数据库进行恢复是至关重要的。目前,Redis实现数据持久化主要依靠两种机制,即AOF(Append-Only File)日志和RDB快照。

redis宕机怎么办

redis 宕机处理指南:诊断问题: 检查进程运行状态、日志错误,通过命令检查状态。恢复数据: 从备份、aof 或 rdb 文件恢复。防止数据丢失: 启用持久化,使用复制,配置自动故障转移。优化性能: 调整配置,使用模块,监控指标。避免宕机
redis宕机怎么办
2024-06-03

redis连接数满了宕机怎么解决

当 redis 连接数满了导致宕机时,可以考虑以下解决方案:改变 redis 的配置:尝试增加 redis 的最大连接数限制,可以通过修改 redis 的配置文件来增加连接数限制,例如修改 maxclients 参数。优化客户端程序:检查客
redis连接数满了宕机怎么解决
2024-03-12

宕机了,缓存数据没了。。。

试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了吗?

云服务器宕机了怎么办

如果您的云服务器宕机了,可能有以下几种情况:数据库连接中断:这种情况下,您需要尝试恢复数据库连接以解决问题。在重新启动服务器之后,可以通过命令行或远程控制台执行如下命令来恢复数据库连接:/usr/local/data/restore-db-p"/data/server/"-vsync-frestoredatabase.log数据库访问权限问题:如果您的云服务器使用了某些第三方的服务,这些服务可能无法访问您的数据库中的数据,从而导致宕机。在重新启动服务器之后,可以通过命令行或远...
2023-10-27

亚马逊云服务器aws宕机了怎么办

查看故障报告:如果您的云服务器发生故障,您可以立即检查故障报告,以找出问题。您可以在AWS控制台中查看故障报告,也可以在AWS文档中查看故障报告。重启服务器:有时故障只是由于连接问题导致的,因此您可以尝试重启您的服务器。这可能需要您的计算机完全重新启动,这可能会导致暂时的故障。检查网络连接:如果您的服务器连接到互联网,则可能会发生故障。您可以检查您的网络连接,以确保它是稳定的。检查日志文件:如果您...
2023-10-27

香港阿里云服务器宕机了怎么办

如果您的香港阿里云服务器出现了宕机,您可以尝试以下步骤来解决此问题:检查服务器是否出现了停机问题:首先请检查服务器是否已经达到了最大配置,如是否有足够的磁盘空间、是否有足够的带宽和电力来支持服务器运行。确认问题是否已经被正确修复:确认问题是否已经修复,如已经修复但服务仍然停机,请联系阿里云客服,阿里云将尽快为您提供恢复服务。重新启动服务器:重启服务器可以使问题尽快得到解决,但需要注意的是重启之后可能会出现更...
2023-10-26

服务中断、系统宕机...GitLab崩了怎么办?

面对可能出现的中断、甚至是灾难情况,本文和您讨论了制定GitLab备份与恢复策略的基本要点。

Redis挂了,流量把数据库也打挂了,怎么办?

Redis 挂了,不就是缓存都没了吗?缓存都没了,不就是缓存雪崩了吗?缓存雪崩了,不就导致数据库挂了吗?一提到“缓存雪崩”这四个字,缓存穿透、缓存击穿这几兄弟,是不是就立马条件反射的出现在你的脑海里面了,还顺带着对应的几套解决方案。

香港阿里云服务器宕机了怎么办啊

首先,我们需要明确事件的原因和背景。香港阿里云服务器宕机的原因可能是多种多样的,包括自然灾害、人为操作失误等。此次事件的背景是香港天文台发出了台风预警,并且在短时间内遭受了暴雨袭击。这次事件对阿里云的服务器稳定性造成了影响,可能是因为在高海拔地区的天气变化对服务器的影响更大。对于这次事件,阿里云的回应是及时和透明的。阿
2023-10-27

软考证书弄丢了怎么办?

  软考证书弄丢了怎么办?软考证书弄丢了有什么影响?软考证书丢失是可以补办的,考生可根据当地发证单位的要求提交申请,并提供相应材料完成补办程序。  软考证书由各省、自治区、直辖市人事部门颁发人事部统一印制,人事部、信息产业部共同用印的《中华人民共和国计算机专业技术资格(水平)证书》。该证书在全国范围有效。  一、软考证
软考证书弄丢了怎么办?
2024-04-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录