Redis数据持久化

news2024/9/24 11:29:21

数据持久化

RDB (Redis DataBase)

在指定的时间间隔内将内除中的数据集快照写入磁盘,即Snapshot快照。

备份如何执行

Redis会单独创建(fork)一个子进程来执行持久化,会先将数据写入到一个临时文件,待持久化过程结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不及逆行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加高效。

RDB缺点是最后一次持久化的数据可能丢失

Fork

  1. For的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

  2. 在Linux程序中,fork会产生一个和父进程完全相同的进程,但是子进程在此后多会exec系统调用,出于效率考虑,Linux引入了“写时复制技术

  3. 一般情况下父进程和子进程会公用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制给子进程

RDB持久化流程

在这里插入图片描述

dump.rdb文件

在redis中配置文件名称,默认为dump.rdb

配置位置

rdb文件的保存路径,也可以修改。默认为Redis启动时命令行所在的目录 dir ./

配置文件中默认的快照配置

在这里插入图片描述

命令 save 和 bgsave

save:save时只管保存,其它不管,全部阻塞。手动保存。

bgsave:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间

flushall

执行 flushall 命令,也会产生dump.rdb文件,但是内容为空。

SNAPSHOTTING快照

SAVE

格式:save 秒 写操作的次数

RDB是整个内存压缩过的Snapshot RDB数据结构,可以配置复合的快照触发条件

默认是1分钟内改了1万次 / 5分钟内改了10次 / 15分钟内改了1次

  • 禁用:不设置save指令,或者给save传入空字符串

stop-write-on-bgsave-error

当Redis无法写入磁盘的话,直接关掉Redis的写操作。 推荐 yes

rdbcompression压缩文件

对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果为yes,Redis会采用LZF算法进行压缩。

rdbchecksum检查完整性

在存储快照后,还可以让redis采用CRC64算法来进行数据校验,但是会增加大约10%的性能消耗。

RDB的备份

先通过 conf get dir 查询到 rdb文件目录

将 *.rdb 的文件拷贝到别的地方

rdb的恢复:

  • 关闭Redis
  • 先把备份的文件拷贝到工作目录 cp dump.rdb.bak dump.rdb
  • 启动Redis,备份数据会直接加载

优势

  • 适合大规模的数据恢复
  • 对数据的完整性和一致性要求不高更适合使用
  • 节省空间
  • 恢复速度快

劣势

  • Fork的时候,内存中的数据被克隆了一份,大约2倍的数据膨胀
  • 虽然Redis在Fork时使用了 写时复制技术,但是如果数据庞大时还是比较消耗性能
  • 在备份周期一定间隔时间做一次备份,所以如果Redis意外down掉,就会失去最后一次快照后的所有修改

停止

动态停止 RDB: redis-cli config set save “” # save后给空值,表示禁用保存策略

AOF(Append Only File)

以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来,只许追加文件但不可以改写文件,reids启动之初会读取该文件重新构建数据。redis重启就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

AOF持久化流程

  1. 客户端请求会被append追加到AOF缓冲区内
  2. AOF缓冲区根据AOF持久化策略[always、everysec、no]将操作sync同步到磁盘的AOF文件中
  3. AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量
  4. Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的

AOF默认不开启

可以在redis.conf中配置文件名称, 默认为appendonly.aof

AOF文件的保存路径同RDB的路径一致

AOF和RDB同时开启

AOF和RDB同时开启,系统默认读取AOF的数据(数据不会丢失)

AOF启动/修复/恢复

  • AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis的工作目录下,启动系统即加载
  • 正常恢复
    1. 修改默认的appendonly no 为 yes
    2. 将有数据的aof文件复制一份保存到对应的目录(查看目录 config get dir)
    3. 恢复:重启Redis后重新加载
  • 异常恢复
    1. 修改默认的appendonly no 为 yes
    2. 如遇到 AOF文件损坏,通过 /usr/local/bin/redis-check-aof --fix appendonly.aof进行恢复
    3. 备份被写坏的AOF文件
    4. 恢复:重启redis然后重新加载

AOF同步频率设置

appendfsync always

始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性较好

appendfsync everysec

每秒同步,每秒计入日志一次,如果宕机,本秒的数据可能丢失

appendfsync no

redis 不主动进行同步,把同步时机交给操作系统

Rewrite压缩

AOF采用文件追加方式,文件会越来越大为避免这种情况,增加了重写机制:当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF的内容压缩,只保留可以恢复数据的最小指令集,可以使用bgrewriteaof

重写原理

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

no-apendfsync-on-rewrite

如果no-appendfsync-on-rewrite=no,不写入aof文件只写入缓存,用户请求不会阻塞,但是如果在这段时间内宕机则会丢失这段时间内的缓存数据(降低数据安全性,提高性能)

如果no-appendfsync-on-rewrite=no,还是会把数据写入到磁盘,但是遇到重写操作,可能会发生阻塞(数据安全,但是性能降低)

触发机制,何时重写

Redis会记录上次重写时AOF大小,默认配置是AOF文件大小是上次rewrite后大小的一倍且大于64M时触发

重写虽热可以节省大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会重写

auto-aof-rewrite-pecentage:设置重写的基准值,文件达到100%时开始重写

auto-aof-rewrite-min-size:设置重写的基准值,最小文件64M,达到这个值开始重写

系统载入时或者上次重写完毕时,Redis会记录此时AOF的大小,设为base_size,如果Redis的 AOF当前大小 >= base_size + base_size * 100 %(默认)且当大小>=64M(默认)的情况下,Redis会对AOF进行重写

重写流程

  1. bgrewriteaof触发重写,判断是否当前有bgsave或bgwriteaof再运行,如果有,则等待该命令结束后再继续执行
  2. 主进程fork出子进程执行重写操作,保证主进程不会阻塞
  3. 子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证AOF文件完整以及AOF文件生成期间的新的数据修改动作不会丢失
  4. 子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息;主进程把aof_rewrite_buf中的数据写入到新的AOF文件
  5. 使用新的AOF文件覆盖旧的AOF文件,完成AOF重写

优势

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

劣势

  • 比起RDB占用更多的磁盘空间
  • 恢复备份速度要慢
  • 每次读写都同步的话,有一定的性能压力
  • 存在个别Bug,造成不能恢复

用哪个

官方推荐两个都启用

如果对数据不敏感,可以单独选用RDB

不建议单独用AOF,因为可能出现Bug

如果只是做单纯内存缓存,可以都不用

性能建议

  • 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。

  • 如果使用AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。

  • 代价,一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。

  • 只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。

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

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

相关文章

【嵌入式Linux环境搭建-02】虚拟机安装Ubuntu20系统

虚拟机安装 Ubuntu 系统 前面用的VMware15.5,安装完Ubuntu20.04报错,试了以下方法都不行。 建议直接安装VMware16.2,步骤和上面一样 报错 解决:VMware Workstation 与 Device/Credential Guard 不兼容_山顶夕景的博客-CSDN博客…

JS阻止事件冒泡的方法*基础原理与运用

目录 事件冒泡html布局css样式代码 非标准写法&#xff1a;IE6-8 利用事件对象cancelBubble属性 标准写法&#xff1a;利用事件对象里面的stopPropagation()方法 下拉菜单 操作方法 事件冒泡html布局css样式代码 首先创建三个嵌套的方块&#xff0c;便于案例分析 <div…

NewSQL如何解决高可用、分片?

1 什么是New SQL&#xff1f; 无论你其他方面做的比Old SQL好再多&#xff0c;SQL和ACID是刚需&#xff0c;这个命你革不掉的。你不支持SQL&#xff0c;就不会有多少人用。所以近几年很多之前不支持SQL的数据库&#xff0c;都开始支持SQL了&#xff0c;甚至于像Spark、Flink这…

自然语言处理 第十章 信息抽取 复习

信息抽取信息抽取复习重点&#xff1a;信息抽取概述从任务内容分为&#xff1a;从处理文档类型分为&#xff1a;从发展时间和处理文档分为&#xff1a;实体识别与抽取限定域命名实体识别基于规则或字典的方法 &#xff1a;规则模版&#xff08;字典&#xff09;匹配统计学习方法…

23.1、Java中的类加载器反射模块化

1.类加载器 1.1类加载 类加载的描述 当程序要使用某个类时&#xff0c;如果该类还未被加载到内存中&#xff0c;则系统会通过类的加载&#xff0c;类的连接&#xff0c;类的初始化这三个步骤来对类进行初始化。如果不出现意外情况&#xff0c;JVM将会连续完成这三个步骤&#…

spring boot 七:SpringBoot自定义配置Jackson的ObjectMapper

spring boot 七&#xff1a;SpringBoot2.5.4自定义配置Jackson的ObjectMapper 1 前言 SpringBoot底层默认使用的自动依赖注入&#xff0c;即spring-boot-autoconfigure包的META-INF下&#xff0c;存在spring.factories文件&#xff0c;里面有自动注入的jackson自动配置类。在…

[数据结构基础]栈和队列的结构及接口函数

一. 栈 1.1 栈的概念及结构 栈是一种特殊的线性表&#xff0c;其只允许在固定的一段进行插入和删除元素的操作。进行数据插入和删除的一端成为栈顶&#xff0c;另一端称为栈底。栈结构中的数据遵循先进后出原则&#xff08;LIFO&#xff1a;Last in First Out&#xff09;&am…

03 Hive概述

Hive概述1、什么是Hive2、Hive优缺点3、Hive架构原理4、Hive 和 数据库比较5、Hive计算引擎1、什么是Hive 由Facebook开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供 类SQ…

如何在外籍人员子女学校和同事有效工作

香港 (Xinwengao.com) — PD Academia 的 Henry Wong 在新加坡出生长大&#xff0c;在美国接受高等教育&#xff0c;现在在美国半退休。他在中国生活了16年。他与许多西方人和中国人一起工作。他始终将自己视为东方与西方的交汇点&#xff0c;是学术界与行政部门之间的桥梁。他…

刷油漆【中等】

在一个8 \times 8 的网格中&#xff0c;一些水平的行被涂成红色&#xff0c;一些垂直的列被涂成蓝色&#xff0c;条纹是按顺序画的&#xff0c;一个接着一个。绘制条纹时它会重新绘制它所经过的所有单元格。(原理跟刷油漆一样)现在你需要确定最后一个上色的是什么颜色红色条纹是…

静态路由配置

获取未知网段的路由信息&#xff1a; 静态路由&#xff1a;由网络管理员手工配置的路由条目 动态路由&#xff1a;所有路由器上开启同一种路由协议&#xff0c;之后&#xff0c;通过路由器之间沟通&#xff0c;协商&#xff0c;最终计算生成路由条目。 静态路由的优点&#xf…

MySQL2-初识MySQL

目录 1.数据库 1.1.什么是数据库? 1.2.为什么要用数据库&#xff1f; 1.2.1.数据存储的发展史 1.2.2.文件存储的缺点 1.3.数据库分类 1.3.1.关系型数据库&#xff08;RDBMS&#xff09; 1.3.2.非关系型数据库&#xff08;了解&#xff09; 1.3.3.关系型数据库和非关系…

STM32——TIM简介与TIM中断

文章目录一、TIM简介二、定时器类型基本定时器通用定时器高级定时器三、定时中断基本结构四、时序图预分频器时序计数器时序计数器无预装时序计数器有预装时序RCC时钟树五、定时器定时中断六、定时器外部时钟七、定时器库函数&#xff08;tim.h&#xff09;一、TIM简介 TIM&am…

【设计模式篇】设计模式3类23种

创建型模式 创建型模式提供了创建对象的机制&#xff0c; 能够提升已有代码的灵活性和可复用性。 这里面比较重要和经常用到时单例模式、工厂模式和原型模式。 单例模式 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问…

antd 动态增减表单项的使用

需求 首先这是基于antd的Form组件&#xff0c;需求1&#xff1a; 单选按钮组 选择设置时间 展示时间选择器需求2&#xff1a; 动态添加时间选择器(最多添加10个、时间为空校验、时间段重叠校验)需求3&#xff1a; 开关需求4&#xff1a;编辑时赋值 1. 单选钮组 <Radio.Gro…

4.6.1、路由选择协议概述

1、静态/动态路由 2、主要特点 因特网所采用的路由选择协议的主要特点 例如&#xff1a;一个较大的因特网提供商就可划分为一个自治系统 在自治系统内部和外部采用不同类别的路由选择协议&#xff0c;分别进行路由选择 3、分层次的路由选择协议 如下所示&#xff0c;将网络…

ArcGIS基础实验操作100例--实验44融合细碎多边形

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验44 融合细碎多边形 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

k8s基础

一、基本介绍 Kubernetes&#xff0c;简称K8s&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效(powerful) , Kubernetes提供了应用部署…

Linux 下 python3.9.8的安装

1. 准备安装环境 yum install gcc zlib* openssl* -y 2. linux 下 python 安装包的获取 官网下载地址: https://www.python.org/downloads/ 找到 自己想要的版本。 方式一&#xff1a;直接点击该链接下载&#xff0c;然后将安装包通过xftp 传送到远程服务器 的 /opt 路…

k8s之搭建单机集群

写在前面 本文一起看下如何在单机环境下搭建k8s集群。 基础环境准备参考这篇文章 。 1&#xff1a;k8s的前世今生 现在当我们提到容器技术时&#xff0c;首先想到的肯定是docker&#xff0c;但其实在docker之前&#xff0c;谷歌公司就已经有了类似的技术&#xff0c;我们知道…