当前位置: 首页 > news >正文

【redis】持久化:RDB和AOF

redis的持久化指将数据写入可靠内存中,如ssd。Redis提供了4种持久化策略

  • RDB:Redis Database,周期性的将某个时间点的数据集快照持久化
  • AOF:Append Only File,每次redis服务接收到写操作(修改内存的操作),都会将命令写入文件,这些操作可以在redis重启后被重新执行来重建数据集。这些指令的存储格式和redis本身的协议相同。
  • No persistence:不进行持久化,在某些缓存情况下使用。
  • RDB+AOF:两种持久化策略可以组合使用。

RDB优点

  • RDB文件是一个紧凑的单个文件,十分适合做备份。比如可以在24小时内每个小时都归档rdb文件,并且在30天内每天都保存rdb快照,这样在恢复的时候可以选择不同版本的数据。
  • RDB适合做灾备恢复,一个单个紧凑的文件很容易转储到其他数据中心,或者存储在云平台上。
  • RDB最大限度提升redis性能,在持久化过程种redis主进程只需要fork一个子进程,剩余的持久化工作都由子进程来完成,主进程永远不会执行磁盘I/O等操作。
  • 相比于AOF,RDB的重启恢复更快
  • 在主备模式下,RDB支持重启和故障切换后的部分重新同步。

RDB的缺点

  • 如果你想在redis故障的时候最小化数据丢失,RDB不适合。你可以设置不同的保存点(例如至少5分钟和100次写操作之后保存)。但是通常我们的保存间隔不会太短,所以redis宕机之后可能会丢失几分钟的数据。
  • RDB会经常使用fork来创建子进程。如果数据集过大的话fork可能会占用较多时间。如果数据集较大且cpu性能不好的话可能会造成redis的短暂不可用。AOF也需要fork但是频率较低。

AOF优点

  • AOF更加可靠,aof可以设置不同的fsync(刷盘)策略:1.不刷盘,缓冲区满自动刷盘,2.每秒刷盘,3.每次请求都刷盘。默认策略是每秒刷盘,写入性能依旧很高。fsync是由后台线程进行的,在未执行fsync的时候主线程会持续的执行写入,因此最多丢失1秒的数据。
  • AOF是追加日志文件,因此不需要磁盘寻址,断电等情况下也不会造成数据错乱。即使日志中最后保存的指令只写入了一半,redis-check-aof也能修复。
  • 当AOF文件过大的时候,redis会在后台自动重写AOF文件。AOF重写是完全安全的,因为在创建新aof文件(根据当前数据集)的同时,redis还会持续写入到旧文件,一旦写入完成redis就会切换两个文件,并开始在新文件上追加日志。
  • AOF文件包含一条接一条的指令,这些指令非常容易理解和解析,也很容易导出。如果你不小心flushall了所有数据,只要还没发生重写,你就可以停掉redis,并删除aof文件最后的flushall指令,然后重启redis就可以恢复所有数据。

AOF缺点

  • AOF通常比RDB更大
  • 根据刷盘策略的不同,AOF可能比RDB更慢。通常设置每秒刷盘的情况下性能依旧很高,如果设置不刷盘则理论上和RDB一样快,即使是在高负载下。但是RDB可以保证最大延迟。
如果redis版本<7.0
  • AOF可能占用很多内存,在重写时新的写入指令会保存在内存缓存中,并在新文件创建完成后追加到末尾。
  • 重写期间所有的写入指令都会在磁盘上写入两次。
  • redis可能会停止写入并将这些写入指令刷到新的aof文件中。

应该使用哪种

一般情况下,如果你希望有PostgreSql一样的数据安全性的话,你应该两种都使用。

如果你很关心你的数据,但是可以忍受几分钟的数据丢失的话,可以单独使用RDB。

很多用户单独使用AOF,但是我们不建议这样做。因为用RDB做数据备份、快速启动恢复很好,也可以防止AOF引擎出现错误。

快照

默认情况下,RDB将数据集快照存储在磁盘上的dump.rdb文件中。你可以设置rdb在至少有M个key发生变化时每N秒保存一次,或者可以使用save或bgsave命令手动调用保存。

例如,这个命令表示如果至少有1000个key发生变化,每60秒保存一次

save 60 1000

实现原理

  • fork一个子进程
  • 子进程开始将数据写入到临时文件中
  • 当子进程完成新的rdb文件的写入后,用新文件替换旧文件

这种方法可以让redis使用写时复制技术。

写时复制指的是对于一个文件对象,不同的进程映射到虚拟地址空间的都是同一个物理内存,只有某个进程试图修改数据时,才会在物理内存中拷贝一份数据。

追加文件

快照并不是很可靠。如果你的redis服务停止了,或者断电了,或者你不小心杀掉了进程,那么最近的数据就会丢失。虽然对某些应用来说问题不大,但是有些应用缺不能接收,所以单独使用RDB不得行。

AOF是一个完全可靠的持久化方案,在1.1版本中推出。

你可以在配置文件中打开AOF

appendonly yes

现在开始,每次redis接收到一个写指令的时候都会追加到aof文件中。当你重启redis的时候就会重新执行aof文件来恢复到之前的状态。

从7.0开始,redis使用多个aof文件机制。原来的一个aof文件会分割为一个base文件(最多一个)和incremental文件(增量文件,可能有多个)。base文件代表重写时的最初的数据集快照,增量文件保存了base文件创建之后追加的指令。这些文件分布在不同的目录下并且被manifest文件追踪。

日志重写

随着写操作的增加,aof文件会越来越大。比如我们执行了100次的自增操作,那么redis中只有一个key,但是aof中有100条指令。其中99条都是无用的。

重写过程是绝对安全的。在重写时redis会持续写入旧文件,并根据当前数据集创建一个最小指令的新文件。一旦新文件准备就绪,redis就会切换两个文件,并在开始在新文件后追加指令。

所以redis提供一个有趣的特性:它能够在后台重写AOF而不中断对客户端的服务。当你执行bgrewriteaof命令时,redis会根据当前数据集创建一个最小化的aof文件。如果你使用的是2.2版本,那么你需要时不时的调用bgrewriteaof。从2.4开始redis会自动重写aof。

从7.0版本开始,当AOF重写被调度的时候,父进程会开启一个增量文件并将接下来的指令写入进去,子进程会执行重写逻辑并生成一个新的base文件。redis会用临时的manifest文件来追踪新创建的base和增量文件。当这些文件准备好的时候,redis会执行一个原子性的替换操作来让临时manifest文件生效。为了避免在AOF重写重复失败和重试时创建许多增量文件的问题,Redis引入了AOF重写限制机制,以确保以越来越慢的速度重试失败的AOF重写。

AOF的持久性

你可以设置fsync的策略,有3种模式:

  1. always:每次新指令追加到aof文件时都执行fsync。这种模式很慢也很安全。在从多个客户端或pipeline接收到一系列指令之后,这写指令会追加到aof种,这意味着只有一次写入和同步(在同步给副本之前)
  2. everysecond:每秒同步一次。足够快(在2.4版本之后可以与快照一样快),你可能最多会丢失1秒的数据
  3. no:从不fsync,数据都交给操作系统处理。最快且最不安全的模式。正常情况下linux会30秒同步一次,取决于内核

推荐的和默认的模式是每秒同步。速度和安全性都有保障。always策略在实践表现很慢,但是支持分组提交,redis会执行单次fsync。

如果AOF被truncate怎么办

这可能发生在重写时redis崩溃,或者重写时aof文件所在的磁盘满了。当这种情况发生时,AOF仍然包含表示数据集的给定时间点版本的一致数据(使用默认AOF fsync策略,该数据集可能早到一秒),但AOF中的最后一个命令可能会被截断。Redis的最新主要版本无论如何都可以加载AOF,只需丢弃文件中最后一个格式不正确的命令即可。在这种情况下,服务器将发出如下日志:

* Reading RDB preamble from AOF file...
* Reading the remaining AOF tail...
# !!! Warning: short read while loading the AOF file !!!
# !!! Truncating the AOF at offset 439 !!!
# AOF loaded anyway because aof-load-truncated is enabled

如果AOF文件被破坏了怎么办

如果aof文件的字节序列在中间发生错误,情况会比truncate更复杂。redis会在启动时报出:

* Reading the remaining AOF tail...
# Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

最好的办法是运行redis-check-aof,不使用–fix选项。然后分析问题,找到给出的文件offset处,并查看是否可以手动修复aof文件:aof文件使用和redis一样的协议,很容易理解和修复。否则可以让工具为我们修复,但是这可能丢失从错误开始到文件结尾的部分,如果错误发生在很靠前的位置,可能丢失大量的数据。

实现原理

aof重写和快照一样使用了写时复制技术:

7.0版本后
  • fork创建子进程
  • 子进程开始写入新的base文件到一个临时文件中
  • 父进程打开一个新的增量文件并将接下来的指令写入。如果重写失败,则旧base+旧增量+新增量文件代表全部的数据,因此是安全的。
  • 如果子进程重写完成,父进程会接收到一个信号,使用新打开的增量文件和子进程创建的base文件来构建一个临时的manifest文件并持久化。
  • redis对manifest文件做一个原子性的替换操作,新的aof文件生效。redis也会清理旧的base文件和用不到的增量文件。
7.0版本前
  • fork子进程
  • 子进程开始重写新的aof文件到临时文件
  • 父进程将接收到的指令写入内存缓冲区和旧的aof文件中,如果重写失败的话数据也是安全的。
  • 当子进程重写完成,父进程收到一个信号,将缓冲区中的数据同步到新创建的aof文件中。
  • redis原子性的将新文件重命名为旧文件,并开始向新文件中追加指令。

如果我正在使用RDB快照,如何切换到AOF

这个问题在2.2之前和之后的版本不一样,可以理解为2.2版本之后更简单且完全不需要重启。

2.2版本后
  • 创建一个dump.rdb文件的备份
  • 把这个备份保存到安全的地方
  • 执行下面的命令
  • redis-cli config set appendonly yes
  • redis-cli config set save “”
  • 确保数据库中的key数量和aof中的key数量相同
  • 确保新的指令正确的追加到aof文件中

第一条命令打开aof
第二条命令关闭快照持久化,这个命令的是可选的,如果你希望使用两种策略的话。
PS:不要忘记修改配置文件,否则重启之后上面的配置会失效并依然使用旧的配置文件中的配置。

2.0版本
  • 创建一个dump.rdb文件的备份
  • 把这个备份保存到安全的地方
  • 停止服务的所有写入指令
  • 执行redis-cli BGREWRITEAOF,这回创建aof文件
  • 生成完aof文件后停止redis服务
  • 编辑redis.conf文件开启aof
  • 重启服务
  • 确保包含的key和修改前的一致
  • 确保新的指令正确的追加到aof文件中

RDB和APOF的影响

redis以后的版本会避免rdb执行期间触发aof重写,或者在aof重写时使用bgsave保存rdb。这可以避免redis的后台进程执行过重的磁盘I/O。

当后台正在执行rbd快照保存,用户明确使用bgrewriteaof指令时,服务会返回ok告诉用户重写操作已加入调度,一旦rdb完成就会立刻执行aof。

如果AOF和RDB都打开了,redis重启时会使用aof来重新构建数据,因为aof能保证数据更完整。

备份redis数据

redis的备份功能很友好,因为redis运行时可以复制rdb文件:rdb一旦创建就不会再更改,新的rdb会保存再临时文件里,新的文件准备就绪时就会原子性的重命名为旧的文件名。

这意味这redis运行时复制rdb文件是安全的,我们建议:

  • 创建一个定时任务,每小时都保存一个rdb快照到一个目录下,然后每天保存一个rdb快照到另一个目录下。
  • 每次定时脚本运行时,确保调用find命令来保证过旧的rdb文件被删除:例如你可以48小时内每小时都保存快照,且1-2个月内每天都保存快照。确保用日期和时间来命名快照。
  • 每天至少将RDB快照转移一次,至少不能在redis运行的物理机中。

备份aof

如果你的redis只使用了aof,也可以备份。7.0开始,aof分为多个文件,这些文件保存在appenddirname配置的目录下。通常情况下你需要做的就是复制或者打包这些文件作为备份。使用这种方式备份要确保备份时关闭aof重写:

  • 关闭aof重写命令:
    CONFIG SET auto-aof-rewrite-percentage 0
    确保不会手动调用aof重写(bgrewriteaof)
  • 检查是否正在重写
    INFO persistence
    并且确定aof_rewrite_in_progress为0,如果为1意味着正在重写,需要等一会
  • 现在可以安全的复制目录下的文件
  • 重新打开aof
    CONFIG SET auto-aof-rewrite-percentage <prev-value>

原文档:redis持久化

相关文章:

【redis】持久化:RDB和AOF

redis的持久化指将数据写入可靠内存中&#xff0c;如ssd。Redis提供了4种持久化策略 RDB&#xff1a;Redis Database&#xff0c;周期性的将某个时间点的数据集快照持久化AOF&#xff1a;Append Only File&#xff0c;每次redis服务接收到写操作(修改内存的操作)&#xff0c;都…...

2023Python接口自动化测试实战教程,附视频实战讲解

这两天一直在找直接用python做接口自动化的方法&#xff0c;在网上也搜了一些博客参考&#xff0c;今天自己动手试了一下。 一、整体结构 上图是项目的目录结构&#xff0c;下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类&#xff0c;比如数据库sql…...

【原创】java+swing+sqlserver药品管理系统设计与实现

之前数据库都是用的mysql&#xff0c;今天我们使用sqlserver在配合swing来开发一个药品管理系统。方便医院工作人员进行药品的管理&#xff0c;基础功能基本都是一些增删改查操作。 功能分析&#xff1a; 药品管理系统主要提供给管理员和员工使用&#xff0c;功能如下&#x…...

软考高级信息系统项目管理师系列之二十七:信息文档管理与配置管理

软考高级信息系统项目管理师系列之二十七:信息文档管理与配置管理 一、信息文档管理与配置管理内容整理二、信息系统文档管理1.信息系统文档概念2.软件文档分类与质量等级三、配置管理1.配置管理2.典型配置项3.配置项4.配置项操作权限5.配置项状态6.配置项版本号7.配置项版本管…...

软考高级-信息系统管理师之项目管理基础(最新版)

项目管理基础 项目管理特点战略管理三个过程IT项目特点项目管理概念项目管理特点软技能PRINCE2的四个要素组织结构职能型组织优缺点职能型组织优点同时,职能型组织也存在着如下缺点:项目型组织优缺点项目型组织优点项目型组织也存在着如下缺点:矩阵型组织优缺点矩阵型组织的优…...

leetcode240+Search a 2D Matrix II+从右上角开始

链接 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if(matrix.size()0 || matrix[0].size()0) return false;int i0, jmatrix[0].size()-1; //从右上角开始while (i<matrix.size()&&j>0) {int x mat…...

0xL4ugh 2023

这回跟着个队伍跑&#xff0c;不过还是2X以后的成绩&#xff0c;前边太卷了。自己会的部分&#xff0c;有些是别人已经提交了的。记录一下。Cryptocrypto 1给了一些数据&#xff0c;像这样就没有别的了ct [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 1…...

Mybatis(4)之跟着老杜做一个简单的银行转账会话

这是个MVC项目&#xff0c;我不一定可以完整的实现这个项目&#xff0c;但力求把这个复现出来&#xff0c;尽量的复现细节。 第一步&#xff1a;创建数据库 表 创建表如下&#xff1a; 我们使用 int 是为了方便 然后采用 demcial&#xff0c;精确度较高 添加两个用户 然后…...

VBA提高篇_ 22 事件处理

文章目录1.事件编程2.常用工作簿事件名称与对应处理过程名称示例3. 事件编程的步骤4&#xff0e;工作簿事件4.1 Open4.2 BeforeClose4.3 NewSheet5&#xff0e;工作表事件6&#xff0e;变量和过程函数的作用域1.事件编程 写在事件发生地(对应工作簿或工作表) 2.常用工作簿事…...

【蓝桥杯集训·周赛】AcWing 第91场周赛

文章目录第一题 AcWing 4861. 构造数列一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4862. 浇花一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4861. 构造数列一、题目1、原题…...

【人工智能AI】三、NoSQL 实战《NoSQL 企业级基础入门与进阶实战》

帮我写一篇介绍NoSQL的技术文章&#xff0c;文章标题是《NoSQL 实战》&#xff0c;不少于3000字。这篇文章的目录是 3.NoSQL 实战 3.1 MongoDB 入门 3.1.1 MongoDB 基本概念 3.1.2 MongoDB 安装与配置 3.1.3 MongoDB 数据库操作 3.2 Redis 入门 3.2.1 Redis 基本概念 3.2.2 Red…...

platform 总线

驱动的分离与分层思想 分离&#xff1a;硬件信息分离&#xff1b; 在编写硬件驱动的时候&#xff0c;需要操作许多硬件寄存器。比如gpio 驱动&#xff0c;你需要知道gpio控制器 寄存器的地址&#xff0c;你想要哪个gpio输出&#xff1f;或是输入? 这些操作最终都是靠设置寄存…...

2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了

2023第10届生物发酵展3月30-4月1号山东济南开展&#xff0c;参观路线来了&#xff01;展会时间&#xff1a;2023年3月30日-4月1日展馆地址&#xff1a;山东国际会展中心&#xff08;济南市槐荫区日照路1号&#xff09;展馆&#xff1a;4号馆、5号馆BIO CHINA生物发酵展&#xf…...

RK356x U-Boot研究所(命令篇)3.6 fdt命令的用法

平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3文章目录 一、fdt命令的配置二、fdt命令的定义三、fdt命令的用法3.1 fdt list3.2 fdt rm3.3 fdt set一、fdt命令的配置 .config配置文件需要有以下配置: rk3568_defconfig默认已使能。 二、fdt命令的定义 usb命令定义在cm…...

2023年社工工资多少钱一月 能领多少补贴

2023年社会工作者人员的待遇还算可以&#xff0c;每月的全额工资一共5000多&#xff0c;扣完五险一金以后每月的到手工资一共4000多&#xff0c;不同地区薪资也是不同的&#xff0c;一线城市会在7千元以上&#xff0c;还可以领取几百到几千元不等的补贴。 12023年社工工资多少钱…...

面试攻略,Java 基础面试 100 问(十一)

抽象类&#xff08;abstract class&#xff09;和接口&#xff08;interface&#xff09;有什么异同? 抽象类和接口都不能够实例化&#xff0c;但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现&#xff…...

接口测试(Fiddler工具)

目录 1.Fiddler是什么&#xff1f; 2.Fiddler的原理 3.Fiddler安装 4.Fiddler界面 4.1.常用工具 4.2 会话列表 4.3 状态栏 4.4 内容显示区 1.Fiddler是什么&#xff1f; Fiddler是客户端与服务器之间的HTTP代理&#xff0c;是当前最常用的HTTP协议抓包工具。 主要功能&a…...

Debian/Ubuntu 安装和使用 perf 调试工具

为操作系统安装基本依赖环境&#xff1a;apt-get update -y apt-get upgrade -y apt-get install lrzsz zip unzip libkrb5-dev libicu-dev screen iftop openssl libssl-dev libunwind8 iftop net-tools gcc gdb cmake curl wget -y apt-get install gcc gdb cmake python-dev…...

【Python语言基础】——Python NumPy 数组连接

Python语言基础——Python NumPy 数组连接 文章目录 Python语言基础——Python NumPy 数组连接一、Python NumPy 数组连接一、Python NumPy 数组连接 连接 NumPy 数组 连接意味着将两个或多个数组的内容放在单个数组中。 在 SQL 中,我们基于键来连接表,而在 NumPy 中,我们按…...

解决IDEA报错:无效的目标发行版: 17

解决IDEA报错&#xff1a;无效的目标发行版: 17 目录解决IDEA报错&#xff1a;无效的目标发行版: 17报错由来解决报错【1】检查setting设置&#xff0c;查看编译器编译模块的编译版本是否是你需要的【2】尝试去修改当前项目的启动设置&#xff0c;设置JRE为你需要的版本。【3】…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...