redis aof 备份和恢复_Redis 持久化机制的介绍,了解这些流程很重要

我们已经知道对于一个企业级的redis架构来说,持久化是不可减少的。

企业级redis集群架构:海量数据、高并发、高可用

持久化主要是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去,比如你redis整个挂了,然后redis就不可用了,你要做的事情是让redis变得可用,尽快变得可用。此时你需要重启redis,尽快让它对外提供服务,但是如果你没做数据备份,这个时候redis启动了,里面也是没有数据的所以一样也用不了,也没办法向外提供服务。所以当此刻有大量的请求过来,缓存全部无法命中,在redis里根本找不到数据,这个时候系统,缓存雪崩问题,所有请求,没有在redis命中,就会去mysql数据库这种数据源头中去找,一下子mysql承接高并发,然后就挂了。mysql挂掉,你都没法去找数据恢复到redis里面去,redis的数据从哪儿来?从mysql来。具体的完整的缓存雪崩的场景,还有企业级的解决方案,会在后面的文章中解释。

如果你把redis的持久化做好,备份和恢复方案做到企业级的程度,那么即使你的redis故障了,也可以通过备份数据,快速恢复,一旦恢复立即对外提供服务。

1、RDB和AOF两种持久化机制的介绍

redis持久化:RDB,AOF

1)、RDB持久化机制,对redis中的数据进行周期性的持久化。

2)、AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集。

3)、通过RDB或AOF,都可以将redis内存中的数据给持久化到磁盘上,然后可以将这些数据备份到别的地方,比如说阿里云,华为云等云服务。此时如果redis挂了,服务器上的内存和磁盘上的数据都丢了,可以从云服务上拷贝回来之前的数据,放到指定的目录中,然后重新启动redis,redis就会自动根据持久化数据文件中的数据,去恢复内存中的数据,继续对外提供服务。

751e771fff187b109545b7d38c8ae287.png

注意 1、:如果同时使用RDB和AOF两种持久化机制,那么在redis重启的时候,会使用AOF来重新构建数据,因为AOF中的数据更加完整(优先加载)

注意 2、:如果我们想要redis仅仅作为纯内存的缓存来用,那么可以禁止RDB和AOF的持久化机制

2、RDB持久化机制的优点

1)、RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去,比如华为云、阿里云等云存储上,按照制定好的备份策略来定期备份redis中的数据。

2)、RDB这种持久化机制对redis对外提供的读写服务,影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可。

3)、相对于AOF持久化机制来说,直接基于RDB这种持久化机制生成的数据文件来重启和恢复redis进程更加快速,因为不像AOF那样需要一步一步的回放之前的操作指令之后,再进行恢复。(容易发生问题,难免出错)

3、RDB持久化机制的缺点

1)、如果想要在redis发生故障时,尽可能少的丢失数据,那么RDB持久化机制没有AOF持久化机制好。通常情况下,RDB持久化机制产生的数据快照文件,都是每隔5分钟,或者更长时间生成一次,如果这个时候就redis进程宕机的话,那么就难免会丢失最近5分钟的数据。

2)、RDB这种持久化机制每次在fork子进程来执行RDB快照数据文件生成的时候,如果需要备份的数据文件特别大的话,可能会导致redis对客户端提供的服务暂停数毫秒,或者甚至数秒,造成不好的用户体验。

9c9b03588ad4328783e8e9a5a569fb06.png

4、AOF持久化机制的优点

1)、相比RDB的这种持久化机制来说AOF可以更好的保护数据的完整性,一般AOF持久化机制会每隔1秒,通过一个后台线程执行一次fsync操作,所以redis出现问题最多会丢失1秒钟的数据。

2)、AOF持久化机制生成的日志文件是以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。

3)、AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在rewrite log的时候,会对其中的指令进行压缩,创建出一份需要恢复数据的最小日志出来。在创建新日志文件的时候,老的日志文件还是照常写入。当新的merge后的日志文件ready的时候,再交换新老日志文件即可。(就是把当前老的日志数据压缩一下,生成新的日志,新来的数据还是继续往老的日志文件写,之后等新的数据压缩完之后,把老日志中新写入的数据写入再新的日志,之后新的日志文件替换掉老的日志文件即可)。

4)、AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。

5、AOF持久化机制的缺点

1)、对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大。

2)、当AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的。(QPS只每秒支持的访问请求)。

5192abcfb9cc355978ba2444296ad1bd.png

3)、如果AOF发生bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。所以说,类似AOF这种较为复杂的基于命令日志merge回放的方式,比基于RDB每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易出现bug。不过AOF就是为了避免rewrite过程导致的bug,因此每次rewrite并不是基于旧的指令日志进行merge的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

6、RDB和AOF到底该如何选择

1)、不要仅仅使用RDB的持久化机制,因为那样会导致你丢失很多数据。

2)、也不要仅仅使用AOF的持久化机制,因为那样有两个问题:

第一、你通过AOF做冷备,没有RDB做冷备来的恢复速度更快; 第二、RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug;

3)、综合使用AOF和RDB两种持久化机制:

第一、用AOF来保证数据不丢失(数据丢失相对较少),作为数据恢复的第一选择; 用RDB来做不同程度的冷备;第二、在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复

end:如果你觉得本文对你有帮助的话,记得关注点赞转发,你的支持就是我更新动力。

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

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

相关文章

oracle 作业已存在,ORA-31634: 作业已存在

服务器上数据泵定时备份任务失败,查看日志报错如下:[oraclehs02 log]$ more expdp_bi_2019-11-02.logExport: Release 11.2.0.4.0 - Production on 星期六 11月 2 00:00:03 2019Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights res…

最近公共祖先_leetcode No.236 二叉树的最近公共祖先

承接二叉搜索树的最近公共祖先。题目链接:二叉树的最近公共祖先 - 力扣(LeetCode)​leetcode-cn.com题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T…

python methodtype_Python的实例定属性和方法或类绑定方法

一、给实例对象绑定属性和方法:1、给实例绑定属性:先定义一个Student类#!/usr/bin/pythonclass Student(object):pass然后绑定属性:s Student()s.name AAA # 动态给实例绑定一个属性print(s.name)#输出AAA2、给实例绑定方法:先定…

oracle 时间间隔,ORACLE JOB间隔时间参考

关键字: oracle job 间隔时间 trunc假设你的存储过程名为PROC_RAIN_JM再写一个存储过程名为PROC_JOB_RAIN_JM内容是:Create Or Replace Procedure PROC_JOB_RAIN_JM Is li_jobno Number; Begin DBMS_JOB.SUBMIT(li_jobno,PROC_RAIN_JM;,SYSDATE,TRU…

canvas画布会黑屏吗_Android SurfaceView 黑屏问题

说一个真实的案例。其中需求要做一个绘图功能,一听到绘图,自然而然就像到了SurfaceView这个类。所以我就用了。android:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical" &g…

oracle连续周数,详细讲解Oracle数据库的“周数计算”

详细讲解Oracle数据库的“周数计算”以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!——日期计算 算第n周的第一天及最后一天是几号 by keynes—— ww的算法为每年 月 日为第一周开始 date …

probe request帧结构_WLAN 无线网络 09 - 管理帧

0000,Association request:关联请求帧认证成功后,STA就会进入关联阶段, 这个交互的目的是为了加入这个BSS 并获取一个AID。通过Association Request携带的信息,使AP了解STA的相关能力信息,这样 AP就可以决定…

oracle 31640,导数据时ora-31640报错

单实例数据库10.2.0.4,目标数据库11.2.0.3 rac,目标准备将单实例上的数据导入到rac数据库。在导入过程中报错如下:Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA. . imported "LBSBUS"."T_MSG_SEND_DETAIL" …

oracle rman备份spfile,RMAN备份恢复之SPFILE的恢复(一)

缺少初始化文件,数据库是无法启动的。如果通过RMAN备份了初始化参数,那么可以通过RMAN对初始化参数进行恢复。这篇文章简单介绍CATALOG方式下初始化参数的恢复问题。初始化参数的丢失和损坏,并不会造成太严重的问题,即使是最坏的情…

c# 获取路径的盘符_c#获取驱动器盘符

在编写某些Windows管理应用程序时,能够从自定义的驱动器选择列表框中进行选择无疑是非常专业的,使用Delphi或者C的早期版本时我们都必须使用Win32所提供的许多关于获取磁盘信息的API函数来分别获取像卷标、序列号以及剩余空间等信息,现在我们…

php fckeditor demo,如何使用PHP添加fckeditor

[更新答案]你需要把你的fckeditor代码放在 标签而不是在顶部。此外,$_POST["FCKEditor"]需要放进去$oFCKeditor->Value变量。这样做:它在我的机器上工作正常,并在fckeditor文本区域内显示格式化的HTML:EditorTitle : include("fckeditor.php");$sBaseP…

php 命名空间通俗易懂_PHP进阶由浅入深掌握面向对象开发

视频教程出自黑马程序员PHP基础_由浅入深掌握面向对象开发【讲解方式】系统梳理和分解知识,各个点逐步讲解,由浅入深,通俗易懂,层层深入【课程亮点】1,已经完成PHP基础知识学习的朋友有帮助2,生动形象&…

qt读oracle时间戳,QT利用QDateTime获取当前时间戳的方法toTime_t

1.toTime_t()把2014年12月19日10:24:40这样的QDateTime的格式转变为1418955940这样的时间戳QDateTime time QDateTime::currentDateTime(); //获取当前时间int timeT time.toTime_t(); //将当前时间转为时间戳2.与toTime_t()功能相反的是fromTime_…

怎么查看父子级目录linux,如何查找linux中特定父目录的所有文件?

如何在linux命令终端中找到具有特定父目录的所有文件?我知道找到所有的文件,使用这样查找:find . -name filename.extension但是可以找到所有filename.extension文件与父目录的文件夹名吗?我尝试了以下操作,但这不行:find . -name…

如何在matlab里输入复杂公式_在MATLAB作图中输出漂亮的公式

函数语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{T}\sinh g\cosh h\tanh i\operatorname{sh}j\operatorname{argsh}k\operatorname{ch}h\operatorname{argch}l\operatorname{th}i\operatorname{argth}mk(x)\l…

ln -s命令 linux,Linux下 ln -s 软链接用法

NAMEln - make links between filesSYNOPSISln [OPTION]... TARGET [LINK_NAME]ln [OPTION]... TARGET... DIRECTORYln [OPTION]... --target-directoryDIRECTORY TARGET...软链接用法是: ln -s 实际存在的目标目录 链接名称(不存在的) 。[rootDMDIDATAGUARD /]# cd…

cryptapi双向认证_[加密解密]CryptoAPI简介

CryptoAPI概述Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂…

vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决

最近学习使用vuejs前后端分离,重构一个已有的后台管理系统,遇到了下面这个问题:实现跨域请求时,每次ajax请求都是新的session,导致无法获取登录信息,所有的请求都被判定为未登陆。1、 vuejs ajax跨域请求最…

win10时间和linux不同步时间,ubuntu16和windows10的时间同步问题

一句话搞定sudo hwclock --localtime --systohc命令: hwclock全称: hardware clock硬件时钟作用: Query or set the hardware clock.Functions:-h, --help show this help text and exit-r, --show read hardware clock and print result--get re…

linux直接用iso文件装服务,linux系统安装iso文件方法

摘要:linux系统下怎么安装iso文件?安装步骤:1、在/mnt目录下,创建相应的iso文件夹,例如iso。2、运行以下命令,挂载iso文...安装步骤:1、在/mnt目录下,创建相应…