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

尚硅谷redis7 41-46 redis持久化之AOF异常恢复演示

AOF每一秒钟写入一次。当内容才写了一小半,没有写完整时,突然,redis挂了,导致aof文件错误。

故意乱写正常的AOF文件,模拟网络闪断文件写error
重启 Redis 之后就会进行AOF文件的载入,发现启动都失败


首先cd /usr/local/bin 异常修复命令:redis-check-aof -- fix 进行修复

不需要三个都修复,修复incr即可。


重新OK

42 redis持久化之AOF优缺点案例总结

AOF优势

1.使用AOF Redis更加持久:您可以有不同的fsync【写回】策略:根本不fsync、每秒fsync、每次查询时fsync。使用每秒fsync的默认策略。写入性能仍然很棒。fsync是使用后台线程执行的,当没有fsync正在进行时,主线程将努力执行写入,因此您只能丢失一秒钟的写入【最差的情况就是丢失1秒】。

2.AOF日志是一个仅附加日志,因此不会出现寻道问题,也不会在断电时出现损坏问题。即使由于某种原因(磁盘已满或其他原因)日志以当一半的命令结尾,redis-check-aof 工具也能够轻松修复它。

仅附加日志:AOF 文件在记录数据变更时是追加写入(append-only)的。每次执行写命令(如 SET, DEL, INCR 等),Redis 都会把这个命令的文本形式写入到 AOF 文件的末尾。

  • 不会修改已有的数据内容。

  • 类似于一个不断增长的操作历史记录。

寻道问题:传统关系型数据库(如 MySQL、PostgreSQL)使用的是复杂的数据结构和存储策略,比如:B+树索引结构。写入一条记录可能要更新记录页,索引页等等,这些页通常分散在磁盘的不同位置,因此需要多次寻道来定位并修改。而AOF因为只做追加写入,文件指针总是在文件末尾,不需要频繁地移动文件指针来读写不同位置(这就叫“寻道”)。

为什么不会在断电时出现损坏问题?

由于 AOF 是顺序写,且每条写命令在写入前可以通过 fsyncfdatasync 确保刷入磁盘,即使突然断电:

  • 只可能丢失“最后一条命令”,而不是导致整个文件损坏。

  • 不会出现“中间内容被破坏”的问题。

3.当AOF变得太大时,Redis能够在后台自动重写AOF,重写是完全安全的,因为当Redis继续附加到旧文件时,会使用创建当前数据集所需的最少操作集生成一个全新的文件,一旦第二个文件准备就绪,Redis就会切换两者并开始附加到新的那一个。

4.·AOF以易于理解和解析的格式依次包含所有操作的日志。您甚至可以轻松导出AOF文件。例
如,即便您不小心使用该FLUSHALL命令刷新了所有内容,只要在此期间没有执行日志重写,您
仍然可以通过停止服务器、删除最新命令并重新启动Redis来保存您的数据集。

进入aof文件存储的路径

vim appendonly.aof.1.incr.aof

删除最后一条FLUSHALL命令

总结:更好的保护数据不丢失,性能高,可做紧急恢复

AOF缺点

1.AOF文件通常比相同数据集的等效RDB文件大。
2.根据确切的fsync策略,AOF可能比RDB慢。一般来说,将fsync设置为每秒性能仍然非常高,并且在禁用fsync的情况下,即使在高负载下它也应该与RDB一样快。即使在巨大的写入负载的情况下,RDB仍然能够提供关于最大延迟的更多保证。

总结:

相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

43 redis持久化之AOF重写机制案例

由于AOF持久化是Redis不断将写命令记录到AOF文件中,随着Redis不断的进行,AOF的文件会越来越大。文件越大,占用服务器内存越大以及AOF恢复要求时间越长。

为了解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的峰值时,Redis就会自动启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集或者可以手动使用命令 bgrewriteaof 来重新。

自动触发

auto- aof- rewrite- percentage 100
auto- aof- rewrite-mil size 64mb

满足配置文件中的选项后,Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时才会自动触发

注意,同时满足,且的关系才会触发
1 根据上次重写后的aof大小,判断当前aof大小是不是增长了1倍
2 重写时满足文件大小

为什么需要压缩?

启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

举个例子:比如有个key
一开始你 set k1 v1
然后改成 set k1 v2
最后改成 set k1 v3
如果不重写,那么这3条语句都在aof文件中,内容占空间不说启动的时候都要执行一遍,共计3条命令;
但是,我们实际效果只需要set k1 v3这一条,所以,开启重写后,只需要保存set k1 v3就可以了只需要保留最后一次修改值,相当于给aof文件瘦身减肥,性能更好。

AOF重写不仅降低了文件的占用空间,同时更小的AOF也可以更快地被Redis加载。

案例实施

前期配置

开启aof

appendonly yes

重写峰值修改为1k

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1k

关闭redis和aof混合,设置为no 

aof-use-rdb-preamble no

删除之前的全部aof和rdb,清除干扰项

PS:如果按照视频操作之后,并没有生成aof文件可以尝试如下操作

1.可以连接redis后 检查一下aof是否开启:config get appendonly

2.如果返回no就是开启失败。也可以不修改redis.conf文件。手动设置开启:redis-cli CONFIG SET appendonly yes  【这并不是永久开启aof。仅限于当前进程】

或者是因为重新启动redis.conf文件时还有redis进程在运行,所以开启失败。

1.查找reids运行的进程  ps aux | grep redis  或者 使用 pidof 查找 Redis 主进程 PID  pidof redis-server

2.再kill 返回的PID

3.再redis-server redis.conf 【一般这个时候就会加载成功】

自动触发

完成上述正确配置,重启redis服务器,执行set k1 v1查看aof文件是否正常

查看三大配置文件

几种类型文件的前缀,又追有关序列和类型的附加信息
appendfilename "appendonly.aof"

新版本端加的目录配置项目
appenddirname "appendonlydir"

如有下的aof文件存在
1. 基本文件
appendonly.aof.1.base.rdb
2. 增量文件
appendonly.aof.1.incr.aof
appendonly.aof.2.incr.aof
3. 清单文件
appendonly.aof.manifest

I

k1不停1111111111111111111暴张

重写触发 :超过1k之后,发现文件压缩变小。

手动触发重写

客户端向服务器发送bgrewriteaof命令

总结

AOF文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的AOF文件。

AOF文件重写触发机制:通过redis.conf 配置文件中的auto-aof-rewrite-percentage:默认值为100,以及auto-aof-rewrite-min-size:64mb配置,也就是说默认Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。

44 redis持久化之AOF小总结

45 redis持久化之RDB+AOF混合持久化

rdb vs aof

问题

可否共存?AOF 和 RDB 持久化可以同时启用,不会有任何问题。如果在启动时启用了 AOF,Redis 会加载 AOF 文件,因为它提供了更好的数据持久性保障。

数据恢复顺序和加载流程【面试】

在同时开启rdb和aof持久化时,重启时只会加载aof文件不会加载rdb文件

怎么选?用哪个?

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.

同时开启两种持久化的方式

在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?
作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),留着rdb作为一种以防万一的手段

RDB+AOF混合持久化方式

结合了RDB和AOF的优点,既能快速加载又能避免丢失过多数据

1 开启混合方式设置
设置aof-use-rdb-preamble的值为yes yes表示开启,设置为no表示禁用
2 RDB+AOF的混合方式 --------- >结论:RDB镜像做全量持久化,AOF做增量持久化
先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。

简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式。 ---- 》AOF包括了RDB头部+AOF混写

46 redis持久化之纯缓存模式only

在 Redis 的持久化配置中,“纯缓存模式”(persistence-only 模式 / cache-only 模式),通常是指 禁用所有持久化机制(RDB 和 AOF),让 Redis 只作为内存缓存来使用。

纯缓存的作用

作用说明
 更快的性能无磁盘 I/O,适合对延迟极其敏感的应用。
 节省磁盘资源不产生 dump.rdb / appendonly.aof 等文件。
容器化部署与容器生命周期一致,重启就清空数据,适合短生命周期或临时环境。
作为纯粹的缓存使用比如配合数据库使用,仅缓存热点数据,宕机没关系,下次可重新加载。

关闭RDB和AOF

修改redis.conf配置文件

关闭rdb: save "" 禁用rdb。禁用rdb持久化模式下,我们仍然可以使用命令save,bgsave生成rdb文件。

关闭aof:appendonly no禁用aof。禁用aof持久化模式下,我们仍然可以使用命令bgrewriteao生成aof文件。

http://www.xdnf.cn/news/675235.html

相关文章:

  • 从零开始理解机器学习:知识体系 + 核心术语详解
  • 从中控屏看HMI设计的安全与美学博弈
  • FileZillaServer(1) -- 记录
  • Git 克隆别人的远程仓库以后,推到自己的远程仓库
  • BSRN地表基准辐射网数据批量下载
  • SQL基础教程:第一章与第二章内容总结(新手入门指南)
  • 文档注释:删还是不删
  • 关于 smali:3. Smali 与 APK 结构理解
  • LWIP 中,lwip_shutdown 和 lwip_close 区别
  • 深入剖析Java CompletableFuture:原理、陷阱与高并发场景优化指南
  • R语言基础| 可视化初探(ggplot2)
  • 预测式外呼与自动外呼的区别
  • 【博客系统】博客系统第十弹:实现对数据库存储的用户密码进行加密功能、更新登录接口的密码校验功能
  • 【监控】pushgateway中间服务组件
  • openresty+lua+redis把非正常访问的域名加入黑名单
  • threejs顶点UV坐标、纹理贴图
  • SQL Server 和 MySQL 对比
  • 实现单例模式的6种方法(Python)
  • 开源多模态新标杆——BAGEL本地部署教程:7B参数撬动万亿数据
  • 《算法和数据结构》算法篇
  • 车载通信网络 --- OSI模型:网络层
  • SQL 查询慢的常见原因分析
  • 【新品发布】嵌入式人工智能实验箱EDU-AIoT ELF 2正式发布
  • 机器学习-决策树
  • 洛谷 P5091:【模板】扩展欧拉定理
  • MacOS内存管理-删除冗余系统数据System Data
  • 第六章 文件的其他操作命令
  • 计算机组成原理——CISC与RISC
  • 【基于STM32的新能源汽车智能循迹系统开发全解析】
  • 什么是DevOps的核心目标?它如何解决传统开发与运维之间的冲突?​