【Redis】持久化机制详解:从RDB到AOF,你需要知道的一切

news2024/9/28 13:27:01

本文目录

RDB(默认)

自动触发 🆚 手动触发

优点

缺点

何时会触发RDB快照

AOF

启用 AOF

配置路径

AOF 文件📃

AOF 的写回策略

AOF 的重写机制

优点

缺点

RDB & AOF 优先级

终极方案:RDB + AOF 混合方式

补充:纯缓存模式(无持久化需求+提升性能)


形容Redis的持久化其实就4个单词: write data to dist

持久化主要是为了加强数据安全

Redis支持两种不同的持久化机制,RDB 和 AOF

RDB(默认)

RDB(Redis Database)持久化机制是将Redis在内存中的数据快照(snapshot)保存到磁盘上。该机制可以在指定的时间间隔内将内存中的数据保存到磁盘上(📃dump.rdb二进制备份文件),以便在Redis重启后恢复数据。RDB机制能够快速进行备份和恢复操作,并且对于大规模数据的恢复速度比AOF方式更快,但可能会丢失最后一次快照之后的所有更改。

自动触发 🆚 手动触发

按照时间修改频次的自动触发

Redis 7.0(括号内为6.2以前的版本)RDB持久化机制的配置文件redis.conf里配置的选项如下:

save 900 1 (3600 1) 
save 300 10 (300 100) 
save 60 10000(60 10000)

其中,每行配置项表示一个“保存条件”,分别为:

  • save { seconds} {changes}:在 {seconds} 秒内,如果发生了 {changes} 次修改,则进行持久化。

注意⚠️

  • 物理恢复,服务一定要和备份分机隔离

  • 如果dump.rdb文件报错,可以使用redis-check-rdb /myredis/dumpfiles/dump6379.rdb 命令进行修复(/myredis/dumpfiles/dump6379.rdb需要替换为自己的真实路径)

顺便介绍下配置文件redis.conf中RDB相关的其他配置

  • snapshotting模块中的配置项

    • dbfilename 配置dump.rdb的文件名(建议可以加上端口号)

    • dir 配置dump.rdb的路径

    • stop-write-on-bgsave-error 配置当快照写入失败时,Redis是否继续接受新的写请求

      • 默认yes,即不会,保证数据一致性

    • rdbcompression 配置是否进行压缩存储

      • 默认yes,会采用LZF算法进行压缩

    • rdbchecksum 配置是否进行数据校验

      • 默认yes,会使用CRC64算法来进行数据校验,这样会增加约10%的性能消耗,希望提升性能可以关闭此功能

    • rdb-del-sync-files 配置是否允许在没有持久性的情况下删除复制中使用的RDB文件

      • 默认no

  • 如何禁用快照

    • 取消配置文件redis.conf中的# save ""的注释(永久)

    • 也可以通过redis-cli config set save ""动态停止RDB保存(重启后失效)

立刻执行的手动触发

  • save 同步,主程序会阻塞,不再对外提供缓存功能,直到完成文件备份(线上不会使用)

  • bgsave 异步,不阻塞,备份由后台异步完成,会fork一个子进程由子进程复制持久化过程

    • fork 为当前进程制作一个副本

    • lastsave 查看最后一次成功执行快照的时间

    • COW 写时复制技术Copy On Write

优点

  • RDB在保存RDB文件时父进程唯一要做的就是fork出一个子进程,接下来的操作都交由子进程来做,父进程无需进行其他任何IO操作,所以RDB持久化方式可以最大化redis的性能

  • 格式紧凑,并且RDB文件在内存中加载速度要比AOF快很多

  • 可以按照业务定时备份,适合大规模的数据恢复,以及对数据完整性和一致性要求不高的场景

缺点

  • 数据丢失风险大

    • 在一定间隔时间做一次备份,所以如果redis意外down掉的话就会丢失从当前时间到最近的一次快照期间的数据

  • 数据量太大时会影响服务性能

    • RDB是内存数据的全量同步,如果数据量太大,I/O操作会严重影响数据库性能

    • RDB依赖于主进程的fork,fork的时候内存中的数据被克隆了一份,数据集较大会导致占用内存较高,导致服务请求瞬间延迟

何时会触发RDB快照

  • 符合配置文件中的快照配置

  • 执行save/bgsave命令

  • 执行flushall/flushdb命令(会清空)

  • 执行shutdown并且没有开启AOF持久化

  • 主从复制时,主节点会自动触发

AOF

AOF(Append Only File)持久化机制是指将Redis服务器接收到的每一条写命令(例如 SET、LPUSH等)都写入到一个追加的日志文件中,以此记录所有对数据集的修改。当Redis服务器重新启动时,它会从日志文件中读取所有写命令,并重新执行它们,以此将数据集恢复到重启前的状态。该机制的优点是在故障恢复时数据丢失较少,但相对于RDB方式,AOF方式的恢复速度可能会比较慢。

启用 AOF

如果要启用Redis AOF持久化机制需要在配置文件redis.conf中开启(默认no,开启改为yes)

appendonly yes

配置路径

指定AOF日志文件的名称为

appendfilename "appendonly.aof"

指定AOF日志文件的路径(注意这个路径是拼在上面介绍RDB时介绍的dir后面的)

appenddirname "appendonlydir"

按照上述配置 dir / appendonlydir / appendfilename,如果dir配置的是/myredis,那么AOF日志文件的完整路径为 /myredis/appendonlydir/appendonly.aof

如果你不知道自己的配置文件在哪里,可以通过命令行或者其他工具🔧进行查询,示例如下:

sudo find / -name '*redis.conf*'

tips:在vim的编辑模式下,可以使用:set nu显示行号,使用/+搜索内容快速定位查询内容

AOF 文件📃

Redis 7.0 有个新特性 Multi-part AOF ,即把原本单个的AOF文件拆成了多个AOF文件,在MP-AOF中,有三种类型的AOF:

  • BASE:基础文(只有一个)

    • appendonly.aof.1.base.rdb

  • INCR:增量文件(有多个)

    • appendonly.aof.1.incr.aof

    • appendonly.aof.2.incr.aof

  • mainfest:清单文件

    • appendonly.aof.mainfest

AOF 的写回策略

配置文件redis.conf中的appendfsync是配置AOF的写回策略的,即指定何时将日志数据写入磁盘,可选值为 no、always 和 everysec,默认如下:

appendfsync everysec
  • always 同步写会,每个写命令执行完立刻同步地将日志写回磁盘

  • everysec (默认项)每秒写回, 每个写命令执行完只会先写到AOF文件的内存缓冲区中,每隔1秒地将日志写回磁盘(是性能和数据安全性的折中方案)

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

表示写期间是否同步,默认no

no-appendfsync-on-rewrite no

AOF 的重写机制

由于AOF持久化是Redis不断将写命令记录到AOF文件中,随着Redis的不断运行,AOF的文件会越来越大,文件越大,占用服务内存越大以及AOF恢复的时间需要越长,重写机制就是解决这个问题的

重写机制主要有两种实现方式:

  • 自动执行

    auto-aof-rewrite-percentage 100 # 当前aof文件的大小比上次重写时增加了100% 
    auto-aof-rewrite-min-size 64mb # 重写时aof文件的大小需要大于64mb
    • 在配置文件redis.conf中进行配置,当AOF文件的大小超过所设定的峰值时,Redis就会自动启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集

    • 注意:需要同时满足上面两条才会触发

      • auto-aof-rewrite-percentage 表示当前aof文件的大小比上次重写时增加的百分比

      • auto-aof-rewrite-min-size 表示重写时满足的aof文件的大小

  • 手动执行

    • 使用命令bgrewriteaof

总的来说,AOF重写机制并不是对原文件进行重新整理🔄,而是直接读取服务器现有键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件然后去替换原来的AOF文件。可以降低文件的占用空间,同时更小的AOF也可以更快的被Redis加载

优点

  • 使用AOF更加持久

    • 可以定制fsync策略,最多丢失1秒数据

  • AOF是个仅附加日志,不会出现寻道问题,也不会出现在断电时出现损坏的问题,即使出于某种原因(磁盘已满等)日志以写一半的命令结尾,也可以使用redis-check-aof工具进行修复

  • 当AOF变得太大时,Redis能够在后台自动重写AOF

    • 这个重写个是完全安全的,因为当Redis继续附加到旧文件时,会使用创建当前数据集所需要的最少操作集生成一个全新的文件,一旦第二个文件准备就绪,Redis就会切换两者并开始附加到新的那一个

  • AOF以利于理解和解析的格式依次包含所有的操作日志。即使对数据库进行了清空操作,只要在此期间没有执行日志重写,就可以通过停止服务器、删除最新的清空操作,重新启动Redis来恢复数据集

总的来说就是:更好的保护数据不丢失、性能高、可做紧急恢复

缺点

  • AOF通常比相同数据集的等效RDB文件更大,并且恢复速度慢于RDB

  • AOF运行效率要慢于RDB(RDB是内核级别的命令),一般来讲如果fsync(同步策略)设置为每秒,性能较高,不设置则和RDB一样

    • 但RDB能够提供关于延迟的更多保证

RDB & AOF 优先级

由配置文件(下图)可以看出,RDB和AOF是可以共存的,并且当两者都被开启时,Redis会优先加载AOF文件

同时开启时的加载流程

同时开启RDB和AOF持久化时

  1. 重启时判断是否存在AOF文件,

    1. 存在,加载AOF文件 -> 3

    2. 不存在 -> 2

  2. 判断RDB文件是否存在

    1. 存在,加载RDB文件 -> 3

    2. 不存在 -> 3

  3. 完成启动(成功/失败)

终极方案:RDB + AOF 混合方式

结合RDB和AOF各自的优点:快速加载+避免丢失过多的数据

设置方式:

  1. 开启appendonly

    appendonly yes
  2. 开启aof-use-rdb-preamble

    aof-use-rdb-preamble yes

RDB做全量持久化,AOF做增量持久化,即先使用RDB进行快照存储,然后用AOF持久化所有写操作,当重写策略满足或者手动触发重写的时候,会将RDB中没有,只被AOF持久化的写操作(即最新的数据)存储为新的RDB记录📝,简单理解就是,混合模式下生成的AOF文件包含两部分:一部分是RDB文件的内容,另一部分是在重写时,由AOF储存的写操作生成的RDB纪录

补充:纯缓存模式(无持久化需求+提升性能)

同时关闭RDB和AOF

  1. 关闭RDB:save ""

  2. 关闭AOF:appendonly no

值得注意的是,上述方式都只是关闭了自动触发的机制,我们仍然可以通过手动的方式生成RDB/AOF文件

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

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

相关文章

城市轨道交通自动售检票系统

概述 城市轨道交通自动售检票系统(AFC)是基于计算机、通信、网络、自动控制等技术,实现轨道交通售票、检票、计费、收费、统计、清分、管理等全过程的自动化系统。可以提高轨道交通的运营效率,满足乘客的快速出行需求&#xff0c…

看完张一鸣近十年微博,我总结了这些成长特质

从程序员到 CEO 关注我的朋友,很多都是技术背景,之前在一个知乎回答里提到过,技术人在创业过程中并不占优势。 编程和创业是两个不同的体系,大部分技术工程师在工作中,解决的往往是一个限定的问题,而创业是…

【分享】ChatGPT的key,用key免费使用ChatGPT(每天更新)

1、ChatGPT用法总结: 自动化文本生成:可以用GPT生成文章、新闻、文本摘要,甚至小说、诗歌等文学作品。语音生成:结合语音合成技术,GPT可以生成自然流畅的语音,可以用于语音助手、交互式语音应用等。问答系统…

MobileViT神经网络模型

官方源码(Pytorch实现) : https://github.com/apple/ml-cvnets 原文链接:https://blog.csdn.net/qq_37541097/article/details/126715733 霹雳吧啦Wz从ml-evnets仓库中剥离的代码: deep-learning-for-image-processing/pytorch_classification/MobileViT at master…

AWE 2023:科技与艺术的结晶 三星展台亮点回顾

2023年4月27~30日,AWE 2023中国家电及消费电子博览会在上海新国际博览中心盛大举行。 作为全球三大消费电子展之一,每一年的AWE都汇聚了全球家电及消费电子领域最前沿、最尖端的科技和产品,因而向来都被业界人士视为整个行业的风向标。本届AW…

【读书笔记】《深入浅出数据分析》

我最大的收获 试想你在经历一场英语考试,还有两分钟就要交卷了,而你还没有开始写作文。此时,你会怎么做? 利用2分钟时间写出的第一段,还是只写关键句子,搭出文章的开头、过程、结尾? 后者更加明…

【LeetCode】91. 解码方法

91. 解码方法(中等) 思路 这其实是一道字符串类的动态规划题,不难发现对于字符串s的某个位置i而言,我们只关心「位置 i 自己能否形成独立 item」和「位置 i 能够与上一位置(i-1)能否形成item 」&#xff0c…

无人机测试二维码降落。

一、首先要做的就是让NX板卡驱动usb摄像头: 1. 下载usb_cam软件包 sudo apt install ros-melodic-usb-cam2. 启动相机节点: A. 查找摄像头接口 ls /dev/video*B. 在该路径下修改launch文件,换成你自己的摄像头接口 我这里的摄像头接口为…

PySpark基础入门(3):RDD持久化

RDD的持久化 RDD 的数据是过程数据,因此需要持久化存储; RDD之间进行相互迭代的计算,新的RDD的生成代表着旧的RDD的消失;这样的特性可以最大化地利用资源,老旧地RDD可以及时地从内存中清理,从而给后续地计…

电脑发挥极致,畅游永恒之塔sf

随着22寸显示器的普及,玩永恒之塔势必会对显示卡造成了很大负担。不要说效果全开,就连简洁的玩,都成了问题,那是不是就要重金把才买的显示卡又要拿掉呢? 最出众的解决办法,是超频。 主要就具有以下条件最佳…

Azure DevOps Server 数据还原方式三:增量还原

Contents 1. 概述2. 操作方式 2.1 创建共享文件夹,并将备份文件复制到共享文件夹中2.2 还原数据3 验证还原的数据库 3.1 方式一:核对工作项所在的表的数据3.2 方式二:将数据库配置到应用层,在应用中验证数据4. 常见问题&#xff1…

FAST协议解析1 通过输入输出逆解析

一、前言 FAST协议可以支持金融机构间高吞吐量、低延迟的数据通讯,目前我知道的应用领域是沪深交易所的Level-2行情传输。网络上无论是FAST协议本身,还是使用相关工具(openfast、quickfast)对FAST行情进行解析,相关的…

MC9S12G128开发板—解决小车九宫格方位移动功能实现遇到的一些问题

接着我的上一篇文章:MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能。本篇文章主要记录下在实现小车九宫格方位移动功能过程中,遇到的一些程序问题以及解决措施。 1. 上位机小车响应开发板按键CAN报文指令的响应出错问题 问题现象描述&#x…

自动驾驶行业观察之2023上海车展-----车企发展趋势(1)

新势力发展趋势 小鹏汽车:发布新车G6(中型SUV),将于2023年年中上市 发布新车G6:车展上,小鹏G6正式首发亮相,定位中型SUV,对标Tesla Model Y,将于2023年年中上市并开始交…

基于web的商场商城后台管理系统

该系统用户分为两类:普通员工和管理员。普通员工是指当前系统中的需要对商品和客户的信息进行查询的人。此类用户只能查看自己的信息,以及对商品和客户的信息进行查看。管理员用户可以对自己和他人的信息进行维护,包括对商品入库、销售、库存…

Redis缓存过期淘汰策略

文章目录 1、如何设置 Redis 最大运行内存?2、过期删除策略3、内存淘汰策略 1、如何设置 Redis 最大运行内存? 在配置文件 redis.conf 中,可以通过参数 maxmemory 来设定最大运行内存,只有在 Redis 的运行内存达到了我们设置的最…

代码命名规范

日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢? Java项目的代码结构,能够体现它的设计理念。Java采用长命名的方式来规范类的命名,能够自己表达…

消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务

根据国外科技媒体 iMore 报道,基于消息源 analyst941 透露的信息,苹果公司目前并未开发 MFi 限制。 根据推文信息内容,两款 iPhone 15 机型的最高充电功率为 20W,而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…

Python趋势外推预测模型实验完整版

趋势外推预测模型实验完整版 实验目的 通过趋势外推预测模型(佩尔预测模型),掌握预测模型的建立和应用方法,了解趋势外推预测模型(佩尔预测模型)的基本原理 实验内容 趋势外推预测模型 实验步骤和过程…

第4章-虚拟机栈(多使用到jclasslib工具查看字节码)

虚拟机栈 简介 虚拟机栈的出现背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架…