[转帖]Redis 运维实战 第04期:AOF 持久化

redis,实战,aof,持久 · 浏览次数 : 0

小编点评

**AOF 持久化实战** **什么是 AOF?** AOF(Append Only File)日志是一种写后日志,Redis 会先执行命令,把数据写入内存,然后才记录日志。 **AOF 的优点:** - 避免了对当前命令的阻塞。 - 可以避免记录错误命令。 - 可以进行数据恢复。 **AOF 的缺点:** - 由于 AOF 日志是在主线程中执行的,如果写日志时磁盘 IO 压力较大,就会导致后续的写操作很慢,从而导致命令阻塞。 **AOF 重写机制:** AOF 重写机制是把 Redis 进程内的数据转化为写命令同步到新的 AOF 文件中。 **AOF 重写机制的关键参数:** - `auto-aof-rewrite-min-size`:表示运行 AOF 重写时文件的最小体积。 - `auto-aof-rewrite-percentage`:表示当前 AOF 重写时文件空间(aof_current_size)超过上一次重写后 AOF 文件空间(aof_base_size)的比值多少后会重写。 **总结:** 生成内容时需要带简单的排版,例如: ``` set aa 1 copy aa 1 tail -n 10 /data/redis6301/data/appendonly.aof ```

正文

Redis 运维实战 第04期:AOF 持久化
https://cloud.tencent.com/developer/article/1986824

 

Redis 有两种持久化方式:AOF 和 RDB。本节就先来聊聊 AOF。

AOF(Append Only File) 日志是写后日志,Redis 会先执行命令,把数据写入内存,然后才记录日志。

1 开启 AOF 日志

在 Redis 的配置文件中,设置以下两个参数即可开启 AOF:

appendonly yes
appendfilename "appendonly.aof"

appendonly:表示是否开启 AOF appendfilename:定义 AOF 文件名

2 AOF 的内容

AOF 里记录的是 Redis 收到的每一条写命令,这些命令是以文本形式保存的。我们就来通过一个实验看下 AOF 中的内容。首先连上本地 Redis(本节的版本为:5.0.7):

redis-cli -p 6301

执行

set aa 1

然后查看 AOF 文件的最后几行内容:

tail  /data/redis6301/data/appendonly.aof

如上图,其中 *3 表示当前命令有三个部分,每个部分从 $“数字”开始,数字表示这部分中命令、键或者值一同有多少字节。

3 为什么是 AOF 而不是 WAL

很多数据库都是采用的 Write Ahead Log(WAL)方式,其特点就是先把修改的数据记录到日志中,再进行写数据的提交,可以方便通过日志进行数据恢复。

但是 Redis 采用的却是 AOF,特点就是先执行写命令,把数据写入内存中,再记录日志。

那么 Redis 为什么考虑使用 AOF 而不是 WAL 呢?

这是因为先让系统执行命令,只有命令能执行成功,才会被记录到日志中。因此,Redis 使用写后日志这种形式,可以避免出现记录错误命令的情况。

另外还有一个原因就是:AOF 是在命令执行后才记录日志,所以不会阻塞当前的写操作。

4 AOF 文件同步策略

AOF 虽然避免了对当前命令的阻塞,但是可能阻塞下一个操作,这是因为 ,AOF 日志是在主线程中执行的,如果写日志时磁盘 IO 压力较大,就会导致后续的写操作很慢,从而导致命令阻塞。

那么 Redis 有没有类似 MySQL 中控制 redo log 落盘时机的参数呢?

有意思的是的确有类似参数 appendfsync,控制 AOF 缓冲区文件同步策略。该参数的可配置值如下:

可配置值

详解

Always

同步写回:每个写命令执行完,立马同步地将日志写回磁盘

Everysec

每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘

No

操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘

具体怎么配置,建议如下:

  • 如果对性能要求很高,而对数据可靠性要求不高,就选择 No 策略;
  • 如果想要得到高可靠性保证,就选择 Always 策略;
  • 如果允许数据有一点丢失,又希望性能别受太大影响的话,那么就选择 Everysec 策略。

5 AOF 重写机制

如果实例运行比较久,并且修改比较频繁,那么 Redis 的 AOF 文件很可能比较大,那怎么解决呢?

Redis 引入了 AOF 重写机制。

AOF 重写机制是把 Redis 进程内的数据转化为写命令同步到新的 AOF 文件中。并且重写的 AOF 文件可以变小,原因如下面几点:

  • 旧日志文件中的多条命令,在重写后的新日志中变成了一条命令。
  • 已经过期的 key 不再写入新的 AOF 文件中。

什么时候会触发 AOF 重写机制呢?

首先可以直接执行 bgrewriteaof 命令触发重写机制。

而自动触发涉及到几个参数

首先在 Redis 中执行

info persistence

其中:

  • aof_current_size:表示当前 AOF 文件空间
  • aof_base_size:表示上一次重写后 AOF 文件空间

而在配置文件中,AOF 重写涉及到以下两个参数:

  • auto-aof-rewrite-min-size: 表示运行 AOF 重写时文件的最小体积,默认为64MB
  • auto-aof-rewrite-percentage: 表示当前 AOF 重写时文件空间(aof_current_size)超过上一次重写后 AOF 文件空间(aof_base_size)的比值多少后会重写。

同时满足下面两个条件,则触发 AOF 重写机制:

  • aof_current_size 大于 auto-aof-rewrite-min-size
  • 当前 AOF 相比上一次 AOF 的增长率:(aof_current_size - aof_base_size) / aof_base_size 大于或等于 auto-aof-rewrite-percentage

与[转帖]Redis 运维实战 第04期:AOF 持久化相似的内容:

[转帖]Redis 运维实战 第04期:AOF 持久化

Redis 运维实战 第04期:AOF 持久化 https://cloud.tencent.com/developer/article/1986824 Redis 有两种持久化方式:AOF 和 RDB。本节就先来聊聊 AOF。 AOF(Append Only File) 日志是写后日志,Redis

[转帖]Redis 运维实战 第09期:Redis 规范

https://cloud.tencent.com/developer/article/1986835 这是专栏《Redis 运维实战》的最后一篇,感谢您的阅读。也感谢 9 篇文章的审稿人:无为,提出了多个修改建议,让文章内容更全面。 由于能力有限,系列文章难免会存在错误或者遗漏,如果您有任何建议,

[转帖]Redis 运维实战 第08期:监控

https://cloud.tencent.com/developer/article/1986832 Redis 在很多互联网公司都充当着非常核心的角色,因此,监控 Redis 以保证其稳定显得格外重要。这节内容就来聊聊 Redis 的一些常见监控项。 1 连接检测 连接失败检测:当监控组件无法连

[转帖]Redis 运维实战 第07期:Hotkey

https://cloud.tencent.com/developer/article/1986830 上一节,我们聊到了 Redis 的 Bigkey,这节内容我们聊聊同样需要引起重视的 Hotkey。 1 背景 Hotkey 指某个时间段访问频率比较高的键值,对应的业务比如热点话题或者热点商品。

[转帖]Redis 运维实战 第06期:Bigkey

https://cloud.tencent.com/developer/article/1986828 1 什么是 Bigkey 下面这两种情况,在很多互联网公司都被认为是 Bigkey: 字符串类型:一般认为超过 10 KB 就是 Bigkey 非字符串类型:哈希、列表、集合、有序集合,体现在元素

[转帖]Redis 运维实战 第05期:RDB 持久化

https://cloud.tencent.com/developer/article/1986826 前面一节,我们聊了 AOF,AOF 有个不足点就是:进行数据恢复时,需要逐一把日志都执行一遍,非常耗时间。 Redis 还有另外一种持久化方法:内存快照。指内存中的数据在某一时刻的状态记录,这个快

[转帖]Redis 运维实战 第02期:Redis Cluster

https://cloud.tencent.com/developer/article/1986819 Redis 最为突出的特性就是:执行命令的速度非常快(原因是所有数据都存放在内存中)。但是单机 Redis 总会遇到瓶颈的,比如:并发、流量、内存等。在 Redis 3.0 之前,官方并没有提供集

[转帖]Redis 运维实战 第01期:Redis 复制

https://cloud.tencent.com/developer/article/1986816 作者简介 马听,多年 DBA 实战经验,对 MySQL、 Redis、ClickHouse 等数据库有一定了解,专栏《一线数据库工程师带你深入理解 MySQL》作者。 从这篇文章开始,将出几期 R

[转帖]Redis学习四(运维指南).

阅读目录 一、上线规划 二、常见运维操作 三、测试方法 回到顶部 一、上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性。 redis 的运行机器 CPU 不求核数多,但求主频高,Cache大,因为 redis

[转帖]Redis大集群扩容性能优化实践

https://www.jianshu.com/p/1f5d2abbee7f 一、背景 在现网环境,一些使用Redis集群的业务随着业务量的上涨,往往需要进行节点扩容操作。 之前有了解到运维同学对一些节点数比较大的Redis集群进行扩容操作后,业务侧反映集群性能下降,具体表现在访问时延增长明显。 某