Redis数据备份与恢复

Redis数据备份与恢复

{F574660, layout=center, size=full}

文章目录

  • Redis数据备份与恢复
    • 1. Redis备份的方式
    • 2. RDB持久化
      • 2.1 什么是RDB?
      • 2.2 Fork操作
      • 2.3 save VS bgsave
      • 2.4 关于RDB备份的一些配置项
      • 2.5 RDB的备份与恢复
      • 2.6 RDB的自动触发
      • 2.7 RDB的优势与劣势
    • 3. AOF持久化
      • 3.1 什么是AOF?
    • 3.2 AOF的启动/恢复/修复
    • 3.3 AOF同步频率设置
    • 3.4 AOF重写机制(Rewrite压缩)
      • 3.4.1 如何实现重写
      • 3.4.2 何时重写
      • 3.4.3 AOF重写流程
      • 3.4.4 AOF持久化流程
      • 3.4.5 AOF的优势与劣势

1. Redis备份的方式

Redis所有的数据都是保存在内存中, 但可以定期通过异步的方式将数据保存到磁盘上,这种方式叫半持久化RDB(Redis DataBase)模式。还有一种方式是保存每一次的数据变化(增量保存),是全持久化AOF(Append Only File)模式。

2. RDB持久化

2.1 什么是RDB?

RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,即snapshot快照,恢复时也是直接将快照文件读到内存中。

这个备份过程是如何实现的呢?

Redis会单独创建(fork)一个子进程来进行持久化,会先把数据写入到一个临时文件中,待持久化过程都结束后,再用这个临时文件替换上一个持久化完成的文件,即上一个快照文件。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是特别敏感,那么RDB的方式就比AOF的方式更加高效,RDB的一个缺点就是最后一次持久化的数据可能会丢失。

2.2 Fork操作

  • Fork操作的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
  • 在Linux系统下,fork()会产生一个和父进程完全相同的子进程,但子进程此后都会进行exec系统调用,影响效率。基于此,Linux中引入了写时复制(Copy On Write)技术。
  • 一般而言,父进程和子进程会共用段物理内存,只有进程空间的段内容要发生变化时,才会把父进程修改的内容复制一份给子进程。
    {F574739, layout=center,size=full}

由上图可以清晰地看到,Redis进行bgsave时,会先fork出一个子进程。子进程和父进程共享段内存,当主进程对键值对C的内容进行修改时,Linux会利用写时复制技术,为子进程复制出键值对C副本,子进程在向磁盘中写入快照文件时会读取该副本内容。

2.3 save VS bgsave

  • save:save时只管保存,其它不管,这会导致Redis主进程全部堵塞,无法响应客户端的请求,禁用
  • bgsave:Redis会在后台异步进行快照操作,快照操作的同时,主进程还可以响应客户端请求。可以通过lastsave命令获取最后一次成功快照的时间。
    有一点需要注意,虽然bgsave操作不会阻塞主进程,但是fork操作会阻塞主进程,频繁地进行快照同样会对Redis性能造成很大的影响。

2.4 关于RDB备份的一些配置项

  • dbfilename
    通常,RDB备份后产生的快照文件名为dump.rdb,这个可以在redis.windows.conf中进行修改,如下所示:
    在这里插入图片描述

  • stop-writes-on-bgsave-error
    当Redis无法写入磁盘时,服务器会直接关掉Redis的写操作,默认为Yes,推荐开启。

  • rdbcompression
    对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果该选项为yes,Redis会采用LZF算法进行压缩。
    如果不想消耗CPU进行压缩,也可以选择设置为no。

  • rdbchecksum检查完整性
    在快照存储后,可以让Redis使用CRC64算法进行数据校验,但是这样做会增加约10%的性能消耗。如果希望得到最大的性能提升,可以关闭,推荐开启。

2.5 RDB的备份与恢复

  • 先通过config get dir指令查询rdb文件的目录
  • 关闭redis服务
  • 将备份的快照文件(如dump.rdb)拷贝到查询出来的目录下
  • 启动Redis,备份的快照数据将会被直接加载

2.6 RDB的自动触发

  • 在redis.windows.conf中通过配置save 修改自动触发的时机。这条命令表示在seconds时间间隔内,触发了changes次修改,就会自动触发bgsave命令生成RDB快照文件。如save 1 400表示如果在1s内发生了400次修改,就会自动触发bgsave操作。
  • 主从复制时,当从节点从主节点进行全量复制时,会触发bgsave操作。主节点会生成快照文件并发送到从节点去。
  • 执行debug reload命令重新加载Redis时会触发bgsave命令。
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化,会触发bgsave命令。

2.7 RDB的优势与劣势

优势:

  • 适合大规模的数据恢复
  • 效率高,对数据完整性和一致性要求不高的场景可以直接使用
  • 节省磁盘空间,恢复速度快

劣势:

  • 虽然Linux使用写时复制技术,让子进程和父进程共享内存空间,只在写入的时候为子进程拷贝一份数据。但是当数据量庞大的时候,这个过程还是非常消耗性能。
  • 在备份周期一段时间内做一次备份,如果在这个过程中Redis出现了意外宕机,那么最后一次快照数据就会丢失。

3. AOF持久化

3.1 什么是AOF?

AOF即以日志的形式来记录每个操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不允许改写文件。
在Redis启动处会读取该文件重新构建数据,也就是Redis重启时会根据日志的内容将写指令从头到尾执行一次已完成数据恢复工作。
{F574962, layout=center, size=full}
注意,AOF默认不开启,可在配置文件中将appendonly改成yes去开启,同时备份的文件名也可以进行修改,如下图所示:
{F574854, size=full}

3.2 AOF的启动/恢复/修复

AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝备份文件到Redis工作目录下,启动Redis服务后会自动进行加载。

正常恢复:

  • 修改redis.windows.conf中的appendonly no,改为yes
  • 将有数据的aof文件复制一份到对应目录(利用config get dir查看目录)
  • 重启Redis重新加载即可自动恢复数据

异常恢复:

  • 修改redis.windows.conf中的appendonly no,改为yes
  • 如遇到AOF文件损坏,通过redis-check-aof --fix appendonly.aof进行恢复
  • 备份写坏的AOF文件
  • 重启Redis重新加载数据

3.3 AOF同步频率设置

AOF同步频率设置有三个选项,分别为alwayseverysecno

  • appendfsync always: 始终同步,每次Redis的写入操作执行完毕后都会立刻记入日志;性能较差但数据完整性比较好
  • appendfsync everysec: 每秒同步,每秒将写操作记入日志一次,如果Redis出现意外宕机,本秒的数据可能丢失
  • appendfsync no: Redis不主动同步,把同步的时机交给操作系统。如果Redis出现意外宕机,会丢失大量数据

3.4 AOF重写机制(Rewrite压缩)

AOF采用文件追加方式,文件会越来越大,而且AOF文件越大,恢复的时间就越长。AOF增加了重写机制,当AOF文件的大小超过所设定的阈值后,Redis就会启动AOF的文件内容压缩,只保留可以恢复数据的最小指令集,也可以使用指令bgrewriteaof

3.4.1 如何实现重写

AOF文件持续增长而过大时,会fork出一条新进程来将文件进行重写(先写临时文件最后再rename的方式);redis4.0后的重写,就是把rdb的快照,以二进制的形式附在新的aof头部,作为已有的历史数据,从而替换掉原先的写操作。

3.4.2 何时重写

Redis会记录上一次重写的AOF大小,默认配置时当AOF文件大小时上次rewrite后大小的已被且大于64M时触发。
重写虽然可以节约大量的磁盘空间,减少回复时间。但是每次的重写还是有一定负担的,因此Redis要满足一定的条件才会进行重写。

auto-aof-rewrite-percentage:设置重写的基准值,假设为x%,文件超过x%时才开始重写。
auto-aof-rewrite-min-size:设置重写的最小值,当AOF文件大小达到这个值且满足条件才能重写。

假设上次重写后AOF文件的大小为base_size,则满足以下式子时Redis才会进行AOF文件重写:
AOF当前大小 ≥ base_size * (1 + auto-aof-rewrite-percentage)
s.t. AOF当前大小 ≥ auto-aof-rewrite-min-size

3.4.3 AOF重写流程

{F575004, layout=center, size=full}

  • bgrewriteaof触发重写,首先判断当前是否有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行
  • 主进程fork出子进程执行重写操作,保证主进程不会被阻塞
  • 子进程遍历Redis内存中的数据到临时文件。为了保证重写阶段新的写操作也被记录,此时客户端的写请求会同时写入到aof_buf缓冲区和aof_rewrite_buf重写缓冲区,保证原AOF文件的完整以及新AOF文件生成期间新的数据修改动作不会丢失
  • 子进程写完AOF文件后,向主进程发信号,主进程统计信息
  • 主进程把aof_rewrite_buf中的数据写入到新的AOF文件
  • 使用新的AOF文件覆盖旧的AOF文件,完成AOF重写

3.4.4 AOF持久化流程

  • 客户端的请求写命令会被追加到AOF缓冲区内
  • AOF缓冲区根据AOF持久化策略【always、everysec、no】将操作同步到磁盘的AOF文件中
  • AOF文件大小超过重写策略或手动重写时,会对AOF文件进行rewrite,压缩AOF文件的容量
  • Redis服务启动时,会重新加载AOF文件中的写操作以达到数据恢复的目的

3.4.5 AOF的优势与劣势

优势:

  • 备份机制更文件,丢失数据概率更低
  • 可读的日志文本,通过操作AOF文件,可以处理误操作

劣势:

  • 比起RDB方式而言,AOF占用更多的磁盘空间
  • 恢复备份速度更慢
  • 每次读写都同步的话,有一定的性能压力
  • 存在个别bug会导致恢复问题

AOF和RDB同时开启,Redis恢复哪个?
AOF和RDB同时开启,Redis默认取AOF的数据(数据不会存在丢失)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP一个简单的网上教务系统模型的设计与实现

对于一个学校来说,大量教师信息,学生信息管理,学生成绩管理,基本数据的维护都难于通过传统的方法进行管理:这就迫切需要利用计算机技术来帮助学校管理者处理这些日常管理。本系统正是为了简化教学任务的管理&#xff0…

Python爬虫之多线程加快爬取速度

之前我们学习了动态翻页我们实现了网页的动态的分页,此时我们可以爬取所有的公开信息了,经过几十个小时的不懈努力,一共获取了 16万 条数据,但是软件的效率实在是有点低了,看了下获取 10 万条数据的时间超过了 56 个小…

Vue——组件基础

目录 定义一个组件​ 使用组件​ 传递 props​ 监听事件​ 通过插槽来分配内容​ 动态组件​ DOM 模板解析注意事项​ 大小写区分​ 闭合标签​ 元素位置限制​ 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应…

如何用 YonBuilder 构建线索管理应用

加速企业数智营销:如何用 YonBuilder 构建线索管理应用 如何用 YonBuilder 低代码开发线索管理应用? 线索管理是指通过各种渠道收集、筛选、打分、分配、跟进和培育潜在客户的信息,以便将其转化为成交客户的过程。 通过数智化手段实现良好…

00后整顿职场,我直呼太卷了....

内卷的来源 内卷最早的“出处”是几张名校学霸的图片。 大学生们刷爆朋友圈的几张“内卷”图片是这样的:有的人骑在自行车上看书,有的人宿舍床上铺满了一摞摞的书,有的人甚至边骑车边端着电脑写论文。这些图片最早在清华北大的学霸之间流传。…

C++学习从基础到高阶(基于黑马程序员教程)

视频链接:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难(52个小时) C语言中文网:http://c.biancheng.net/cplus/ Visual Studio 2022 下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ Visu…

JavaWeb - Web网站的组成,工作流程以及开发模式

一. Web Web:全球广域网,也称玩万维网(www Wrold Wide Web),就是能够通过浏览器访问的网站学习Web开发,其实就是要使用Java这门语言来开发这样的Web网站,这也是现在Java语言最主流的企业级应用方式。使用Java语言开发…

PERSIANN 降雨数据使用教程

一、前言PERSIANN,“使用人工神经网络从遥感信息中估算降水”,是一种基于卫星的降水检索算法,可提供近乎实时的降雨信息。该算法使用来自全球地球同步卫星的红外 (IR) 卫星数据作为降水信息的主要来源。 红外图像的降水基于云顶温度和降水率之…

一位腾讯在职7年测试工程师的心声...

作为一个在腾讯工作7年的测试工程师,今天就来聊聊腾讯工作压力到底从何而来。 压力的开始:时间回到7年前,我人生中的第一份实习工作,是在腾讯公司做一个自动化测试工程师。当时的我可谓意气风发,想要大干一场&#xf…

工厂模式白话 - 3种都有哦

前言 工厂模式(Factory Pattern)里所谓的“工厂”和现实生活中的工厂一样 主要作用都是生产产品 像食品厂、服装厂、汽车厂生产吃的、穿的、开的 设计模式里的工厂则是生产对象 划分 工厂模式可分为简单工厂、工厂方法、抽象工厂3种 有啥不同呢&a…

PyTorch笔记

Tensor torch中的Tensor是一种数据结构,使用上与Python的list、numpy的array、ndarray等数据结构类似,可以当成一个多维数组来用。 数学上对张量有特定定义,但通常理解为多维数组即可。 生成Tensor:torch包中提供了直接生成Tens…

【微信小程序】初识微信小程序组件

作者简介:一名C站萌新,前来进行小程序的前进之路博主主页:大熊李子🐻 一、组件的创建与引用 1.1 创建组件 在项目的根目录中,鼠标右键,创建 components -> test 文件夹在新建的 components -> test…

十分钟验证一个轻量化车联网解决方案

智能网联汽车在车联网的应用上,通常是以智能传感器、物联网、GIS技术为基础,结合大数据、人工智能技术,通过OT(Operation tecnology)和IT(information tecnology)融合的方式,实现智能…

2.3 连续性随机变量

思维导图: 学习目标: 我会按照以下步骤学习连续型随机变量: 复习概率论的基础知识,包括概率、期望、方差等概念和公式,以及离散型随机变量的概率分布函数和概率质量函数的概念和性质。 学习连续型随机变量的概念和性…

学生信息管理系统(student information manage system, SIMS)

一、前言 本项目为学生信息管理系统,使用C语言编写。 ★★★项目详见本人gitee仓库,地址 https://gitee.com/omnipotent-brother/student-information-manage-system.git ★★★ 二、项目介绍 开发环境: 基于windows 11系统下的Visual Studio…

YC-A11(原创)基于springboot,vue网上商城

绪论 课题的开发背景 随着计算机和网络的快速发展,并且越来越普及,互联网日益成为人们收集信息常用渠道,电子商务开始流行,一种全新的理念不断形成并且快速发展,像国内电商巨头淘宝、京东、苏宁易购、唯品会等电商平台…

【JavaScript】2.JavaScript函数

JavaScript 函数 1. 函数的概念 函数&#xff1a;就是封装了一段可被重复调用执行的代码块 通过此代码块可以实现大量代码的重复使用 2. 函数的使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta na…

前馈PID控制(热交换器/反应釜温度控制)

如何利用PID进行温度控制请参看下面博客文章: 博途PID 1200/1500PLC PID_Compact比例作用权重b微分作用权重c解读(PI-D控制器 I-PD控制器)_RXXW_Dor的博客-CSDN博客很多人会问PLC自带的PID指令和我们自己设计的PID有什么区别,这个问题要看你和什么PID控制器作对比,PID负反…

NDK RTMP直播客户端二

在之前完成的实战项目【FFmpeg音视频播放器】属于拉流范畴&#xff0c;接下来将完成推流工作&#xff0c;通过RTMP实现推流&#xff0c;即直播客户端。简单的说&#xff0c;就是将手机采集的音频数据和视频数据&#xff0c;推到服务器端。 接下来的RTMP直播客户端系列&#xff…

Redis用于全局ID生成器、分布式锁的解决方案

全局ID生成器 每个店铺都可以发布优惠卷 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增id就存在一些问题&#xff1a; 1.id的规律性太明显 2.受单表数据量的限制 全局ID生成器&#xff0c;是一种在分布式系…
最新文章