Redis7.0以后AOF底层原理变更图解

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: Redis7.0以后AOF底层原理变更图解

Redis官方:Redis persistence | Redis

注:这里只说AOF工作原理,AOF其他功能请查阅官方文档

RedisAof是什么?

AOF(仅追加文件):
AOF 持久性记录服务器收到的每个写入操作。然后可以在服务器启动时再次重播这些操作,重建原始数据集。命令的记录格式与 Redis 协议本身相同。

AOF优点

官方原话:

AOF优势

  • 使用 AOF Redis 更加持久:您可以拥有不同的 fsync 策略:完全没有 fsync,每秒 fsync 一次,每次查询时 fsync。使用每秒 fsync 的默认策略,写入性能仍然很高。fsync 是使用后台线程执行的,当没有 fsync
    正在进行时,主线程将努力执行写入,因此您只能丢失一秒钟的写入。
  • AOF 日志是仅追加日志,因此在断电时不会有寻道或损坏问题。即使由于某种原因(磁盘已满或其他原因)日志以半写命令结束,redis-check-aof
    工具也可以轻松修复它。
  • Redis 能够在 AOF 变得太大时在后台自动重写它。重写是完全安全的,因为当 Redis 继续追加到旧文件时,会使用创建当前数据集所需的最少操作集生成一个全新的文件,一旦第二个文件准备就绪,Redis
    就会切换两者并开始追加到新文件。
  • AOF 以易于理解和解析的格式包含所有操作一个接一个的日志。您甚至可以轻松导出 AOF 文件。例如,即使您使用 `FLUSHALL`
    命令意外刷新了所有内容,只要在此期间没有重写日志,您仍然可以通过停止服务器、删除最新命令并重新启动 Redis 来保存数据集。

AOF缺点

  • AOF 文件通常大于同一数据集的等效 RDB 文件。
  • AOF 可能比 RDB 慢,具体取决于确切的 fsync 策略。一般来说,将 fsync 设置为每秒性能仍然非常高,并且在禁用 fsync 的情况下,即使在高负载下,它应该与 RDB一样快。尽管如此,RDB仍然能够提供更多关于最大延迟的保证,即使在巨大的写入负载的情况下也是如此。
  • 而且在Redis Version < 7.0 如果在重写期间对数据库进行了写入,则 AOF 可能会使用大量内存(这些写入缓存在内存中并在最后写入新的 AOF)。重写期间到达的所有写入命令将写入磁盘两次。Redis 可以在重写结束时冻结写入并将这些写入命令同步到新的 AOF 文件。(注:这个问题在Redis > 7.0得到了解决

优缺点总结:

优点:

  • 每一次修改都同步,文件的完整性会更好
  • 每秒同步一次,最多丢失一秒数据
  • 从不同步策略,效率最高

缺点:

  • 相对数据文件来说,AOF文件永远大于RDB数据文件这个可以做限制,比如只保存100mb,也可以联合RDB一起使用来保证只记录最近一个时间节点的数据,修复的速度也比RDB慢。
  • AOF运行效率要比RDB慢(这个在Redis7.0之后拥有不输于RDB的运行效率,但是RDB还是更有优势,这个官方有说明),所以Redis默认配置就是RDB持久化

AOF原理

在Redis版本7.0之前

1-> 开启一个Fork子进程

2-> 子进程创建了一个新的临时AOF文件,读取内存这个中数据快照,写入重构数据库状态指令

3->父进程将所有新增更改命令写入到内存缓冲区中(同时,它将新增更改命令写入旧的AOF文件中,仅追加文件)

4-> 子进程写入完毕,通知父进程进行下一步处理

5-> 父进程收到子进程信号,将缓存中的命令追加到临时AOF文件

6-> 父进程修改临时AOF文件名称为正式AOF文件

7-> 父进程将后续新的更改命令追加到正式AOF文件

在Redis版本7.0之后

1-> 父线程开启Frok子进程

2-> 子进程执行重写逻辑并生成新的基本AOF文件

3-> 当子进程重写时,父进程会打开一个新的增量 AOF 文件以继续写入

4-> 当子进程写入完毕后,通知父进程

5-> 父进程收到信号,读取增量AOF和基本AOF文件生成文件清单

6->  父进程读取文件清单,重写基础AOF文件,并对其进行原子交换,确保重写成功

7-> 父进程清理旧的基本文件和任何未使用的增量文件


在redis.conf启动AOF之后,可以在Redis的默认工作目录看到一个appenddir目录,其中存放了增量AOF、基础AOF、文件清单。

基础AOF文件中存放了每次增量AOF和临时AOF生成文件清单后重写的AOF数据

文件清单中存储了base.rdb和incr.aof的名字


7.0之前与7.0之后Redis读取文件的区别

在Redis7.0之前,Redis启动时会去优先读appendonly.aof文件(在AOF和RDB同时存在的时候)来重构数据库状态

在Redis7.0之后,Redis启动时会去优先读appendonly.aof.1.base.rdb文件(在AOF和RDB同时存在的时候)来重构数据库状态

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
18天前
|
缓存 NoSQL Apache
【Redis】布隆过滤器原理与应用
【Redis】布隆过滤器原理与应用
24 1
|
18天前
|
存储 NoSQL Redis
保障数据安全,提升性能:探秘Redis AOF持久化机制在在线购物网站的应用
保障数据安全,提升性能:探秘Redis AOF持久化机制在在线购物网站的应用
|
5天前
|
存储 NoSQL 程序员
Redis(持久化 -- RDB & AOF)
Redis(持久化 -- RDB & AOF)
21 2
|
14天前
|
存储 缓存 NoSQL
由菜鸟到大神,谈谈redis的概念、实战、原理、高级使用方法
【5月更文挑战第18天】Redis是一个开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合、有序集合等。
25 10
|
18天前
|
负载均衡 NoSQL 关系型数据库
深入浅出Redis(六):Redis的主从架构与主从复制原理
深入浅出Redis(六):Redis的主从架构与主从复制原理
|
18天前
|
缓存 NoSQL 关系型数据库
深入浅出Redis(四):Redis基于RDB、AOF的持久化
深入浅出Redis(四):Redis基于RDB、AOF的持久化
|
18天前
|
NoSQL 算法 关系型数据库
Redis持久化 RDB & AOF
Redis持久化 RDB & AOF
18 0
|
18天前
|
消息中间件 NoSQL Kafka
从 Redis 开源协议变更看开源软件与云计算巨头之间的竞争博弈
Redis将从BSD许可证转向RSALv2和SSPLv1的双重许可,以应对云时代挑战,保护开源精神,防止云厂商垄断。这一变化旨在确保开源软件的公平竞争,类似过去IE浏览器与操作系统绑定的情况。Redis的CEO指出,旧开源概念已不合时宜,云厂商应为使用开源项目做出贡献。AutoMQ作为云原生Kafka,采用BSL协议,旨在平衡开源与商业竞争,坚持可持续发展和开源初心。
31 2
从 Redis 开源协议变更看开源软件与云计算巨头之间的竞争博弈
|
18天前
|
监控 NoSQL 算法
深入剖析Redis哨兵模式的原理和应用
Redis的哨兵模式是实现高可用性和自动故障转移的机制,当主服务器故障时,哨兵能自动检测并进行故障转移,确保服务连续和稳定性。哨兵模式通过监控主从服务器状态、自动故障转移、防止数据不一致,提高容错能力和负载均衡,降低运维成本,实现高可用性。哨兵通过检测主观下线和客观下线状态,以及选举Leader Sentinel来协调故障转移。Raft算法在其中用于领导者选举和状态一致性。哨兵模式通过综合考虑多种因素选举新主服务器并执行故障转移,保障集群稳定运行。
137 0
深入剖析Redis哨兵模式的原理和应用
|
18天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
34 0