redis持久化之AOF(Append Only File)

news2024/11/16 7:38:03

1 : AOF 是什么

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

2 : AOF持久化流程

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

在这里插入图片描述

3 : AOF默认不开启

可以在 redis.conf 文件中对AOF进行配置

1. appendonly no # 是否开启AOF,yes:开启,no:不开启,默认为no
2. appendfilename “appendonly.aof” # aof文件名称,默认为appendonly.aof
3. dir ./ # aof文件所在目录,默认./,表示执行启动命令时所在的目录,比如我们在/opt目录中,去执行
4. redis-server /etc/redis.conf 来启动redis,那么dir此时就是/opt目录

4 : 、AOF和RDB同时开启,redis听谁的?

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

5 : 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 进行
恢复

6 : AOF同步频率设置

可以在redis.config中配置AOF同步的频率
在这里插入图片描述

appendfsync always:每次写入立即同步

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

appendfsync everysec:每秒同步

每秒同步,每秒记录日志一次,如果宕机,本秒数据可能丢失;更新的命令会放在内存中AOF缓冲区,每秒将缓冲区的命令追加到AOF文件

appendfsync no:不主动同步

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

7 : rewrite压缩(AOF文件压缩)

7.1rewrite压缩是什么?

AOF采用文件追加方式,文件会越来越大,为了避免出现此情况,新增了重写机制,当AOF文件的大小
超过锁审定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使 用命令bgrewriteaof触发重写。

7.2重写原理,如何实现重写?

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

7.3触发机制,何时重写?

bgrewriteaof:手动触发重写

从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, bgrewriteaof 仅仅用于手动触发重写操作。
redis会记录上次重写的aof大小,默认配置是当aof文件大小是上次rewrite后大小的2倍且文件大于64M 时触发。
重写虽然可以节约大量磁盘空间,减少恢复时间,但是每次重写还是有一定负担的,因此设置redis满足 一定条件才会进行重新。

7.4 auto-aof-rewrite-percentage:设置重写基准值

设置重写的基准值,默认100,当文件达到100%时开始重写(文件是原来重写后文件的2倍时重写)。

7.5 auto-aof-rewrite-min-size:设置重写基准值

设置重写的基准值,默认64MB,AOF文件大小超过这个值开始重写。

举个例子

文件达到70MB开始重写,降到50MB,下次什么时候开始重写?100MB
系统载入时或者上次重写完毕时,redis会记录此时AOF大小,设置base_size。
如果Redis的AOF当前大小>=base_size+base_size*100%( auto-aof-rewrite-percentage
默认值) 且 当 前大小>=64mb( auto-aof-rewrite-min-size 默认值)的情况下,redis会对AOF进行重写

8 重写流程

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

在这里插入图片描述

no-appendfsync-on-rewrite:重写时,不会执行appendfsync操作

该参数表示在正在进行AOF重写时不会将AOF缓冲区中的数据同步到旧的AOF文件磁盘,也就是说在进
行AOF重写的时候,如果此时有写操作进俩,此时写操作的命令会放在aof_buf缓存中(内存中),而不
会将其追加到旧的AOF文件中,这么做是为了避免同时写旧的AOF文件和新的AOF文件对磁盘产生的压 力。

默认是ON,表示关闭,即在AOF重写时,会对AOF缓冲区中的数据做同步磁盘操作,这在很大程度上保 证了数据的安全性。

但在数据量很大的场景,因为两者都会消耗磁盘IO,对磁盘的影响较大,可以将其设置为“yes”减轻磁盘
压力,但在极端情况下可能丢失整个AOF重写期间的数据。

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

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

9 : AOF优势

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

10 : 劣势

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

小总结 :

1. AOF文件是一个只进行追加的日志文件
2. edis可以在AOF文件体积变得过大时,自动地在后台对AOF文件进行重写
3. AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以redis协议的格式保存,因此
AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松。
4. 对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积
5. 根据所使用的fsync策略,AOF的速度可能会慢于RDB

总结 : 用哪个好?

  1. 官方推荐2个都启用。
  2. 如果对数据不敏感,可以单独用RDB。
  3. 不建议单独使用AOF,因为可能会出现BUG。
  4. 如果只是做纯内存缓存,可以都不用。

官方建议 :

在这里插入图片描述

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

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

相关文章

【Linux】IP协议

文章目录 📖 前言1. 网络层2. IP协议格式3. IP报文分片和组装3.1 如何分片和组装:3.2 组装的衍生问题: 4. 网段划分(重点)4.1 子网掩码:4.2 IP地址的数量限制:4.3 私有IP地址和公网IP地址&#…

读高性能MySQL(第4版)笔记19_云端和合规性

1. 如何构建数据库环境 1.1. 托管MySQL 1.2. VM上构建 1.3. 天下没有免费的午餐,每一个选择都伴随着一系列的权衡 2. 托管MySQL 2.1. 服务商提供了一个可访问的数据库设置程序,而不需要用户深入了解MySQL的具体细节 2.2. 使用托管MySQL将缺乏很多的…

vueDay03——计算属性

一、一般场景 当我们需要对某个数据进行简单判断渲染的时候&#xff0c;我们通常会使用如下方法 <div>nginx当前状态&#xff1a;{{ openNginx true ? true : false}} </div> 但是这样就很影响观感&#xff0c;因为渲染出来的只有openNginx的值&#xff0c;而…

微信小程序投票管理系统:打造智能、便捷的投票体验

前言 随着社交网络的兴起和移动互联网的普及&#xff0c;人们对于参与和表达意见的需求越来越强烈。在这个背景下&#xff0c;微信小程序投票管理系统应运而生。它为用户提供了一个智能、便捷的投票平台&#xff0c;使用户可以轻松创建和参与各种类型的投票活动。本文将详细介…

【C++学习笔记】类和对象(上)

目录 1. 面向对象和面向过程的初步认识 2. 类的引入 3. 类的定义 3.1 类的两种定义方式 3.1.1声明和定义全部放在类体中 3.1.2.类声明放在.h文件中&#xff0c;成员函数定义放在.cpp文件中 4. 类的访问限定符及封装 4.1 访问限定符 4.2 面试题&#xff1a;C中struct…

百度文心一言4.0——使用及API测试

登录百度智能云&#xff1a;百度智能云 文心一言4.0使用 开通付费&#xff1a; 创建应用&#xff1a; 自行创建应用名称&#xff1a; 对话测试&#xff1a; API测试 ERNIE-Bot-4 API&#xff1a;ERNIE-Bot-4 打开链接查看自己的API Key&#xff0c;Secret Key。 可参…

Python手搓C4.5决策树+Azure Adult数据集分析

前言 课上的实验 由于不想被抄袭&#xff0c;所以暂时不放完整代码 Adult数据集可以在Azure官网上找到 Azure 开放数据集中的数据集 - Azure Open Datasets | Microsoft Learn 数据集预处理 删除难以处理的权重属性fnlwgt与意义重复属性educationNum去除重复行与空行删除…

从一个页面跳转到目标页面之后,对应的顶部路由高亮

需求&#xff1a;页面跳转到目标页面之后&#xff0c;对应的顶部路由高亮 上面的更多 跳转到 学情分析下面的学生分析 <template><div class"topBar" ref"topBar" v-loading.fullscreen.lock"fullscreenLoading"><div class&quo…

dc9靶机攻略

dc9 扫描 扫描结果如图 nmap 目录扫描 指纹扫描 渗透 访问首页 该处发现搜索框&#xff0c;正常搜名字可以直接返回该用户的信息&#xff0c;怀疑sql注入&#xff0c;使用单引号注入&#xff0c;发现没反应&#xff0c;再使用一下万能注入语句1 or 11 使用sqlmap sqlmap -…

什么是蓝桥杯?什么是蓝桥STEMA考试?

第十五届蓝桥大赛赛事安排? STEMA考试11月(考试时间11月26日) STEMA考试1月(2024年1月) STEMA考试3月(2024年3月) 第十五届蓝桥杯省赛(2024年4月待定) 第十五届蓝桥杯国赛(2024年5月待定) 注:以上时间具体以组委会官方发布为准。 01.蓝桥杯 蓝桥杯全国软件和…

【每日一题】掷骰子等于目标和的方法数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 1155. 掷骰子等于目标和的方法数 题目解读 你手里有 n 个一样的骰子&#xff0c;每个骰子都有 k 个面&#xff0c;分别标号 1 到 n。给定三个整数 n&#xff0…

部署基于efk+logstash+kafka构建日志收集平台并对nginx日志进行分析

文章目录 1.1 安装zookeeper集群1.2 安装kafka集群1.3 部署filebeat服务1.4 部署logstash1.5 部署es和kibana服务1.6 配置kibana ui界面1.7 对nginx进行日志分析 Filebeat采集日志kafka topic存起来日志->logstash去kafka获取日志&#xff0c;进行格式转换->elasticsearc…

【计算机网络笔记】网络应用进程通信

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【RocketMQ系列十四】RocketMQ中消息堆积如何处理

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

Elasticsearch分词器-中文分词器ik

文章目录 使用standard analysis对英文进行分词使用standard analysis对中文进行分词安装插件对中文进行友好分词-ik中文分词器下载安装和配置IK分词器使用ik_smart分词器使用ik_max_word分词器 text analysis 使用standard analysis对英文进行分词 ES默认使用standard analys…

【Java】智慧医院绩效考核系统源码

医院绩效考核系统使用JAVA语言开发&#xff0c;采用B/S架构模式设计&#xff0c;后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信…

【MySQL架构篇】逻辑架构

逻辑架构 文章目录 逻辑架构1. 服务器处理客户端请求2. Connectors3. 第一层&#xff1a;连接层4. 第二层&#xff1a;服务层5. 第三层&#xff1a;存储引擎6. 存储层7. 小结 1. 服务器处理客户端请求 首先 MySQL 是典型的 C/S 架构&#xff0c;即 Client/Server 架构&#xf…

idea 基础设置

1、设置 IDEA 主题 2、自动导包和优化多余的包 3、同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;导包合并为* 4、显示行号 &#xff0c; 方法和方法间的分隔符&#xff1a; 5、忽略大小写&#xff0c;进行提示 6、多个类不隐藏&#xff0c;多行显示 7、设置默认的…

2023高频前端面试题-CSS

1. CSS 选择器的优先级是怎么样的&#xff1f; CSS 选择器的优先级顺序&#xff1a; 内联样式 > ID选择器 > 类选择器 > 标签选择器 优先级的计算&#xff1a; 优先级是由 A、B、C、D 四个值来决定的&#xff0c;具体计算规则如下 A{如果存在内联样式则为 1&…

计算机网络-计算机网络体系结构-应用层

目录 一、网络应用模型 客户/服务器模型(Client/Server) P2P模型(Peer-to-peer) 二、域名解析系统(DNS) 域名 域名服务器 解析过程 三、文件传输协议(FTP) FTP控制原理 四、电子邮件 组成结构 协议 SMTP MIME POP3 IMAP 五、万维网和HTTP协议 概述 HTTP 报…