Redis(二十六)-持久化操作之AOF

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 上一篇文章我们介绍了 Redis(二十五)-持久化操作之RDB ,这篇文章接着来介绍另一种持久化的方式AOF。

1. 简介

上一篇文章我们介绍了 Redis(二十五)-持久化操作之RDB ,这篇文章接着来介绍另一种持久化的方式AOF。

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

2. AOF 持久化流程

客户端的请求写命令会被append追加到AOF缓冲区内

AOF缓冲区根据AOF持久化策略(always,everysec,no) 将操作sync 同步到磁盘的AOF文件中。

AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量。

Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的

3. 开启AOF

AOF默认不开启,可以在redis.conf中配置文件名称,默认为appendonly.aof。AOF文件的保存路径,同RDB的路径一致。与AOF相关的配置有两个:

# appendonly 用于指定是否开启AOF,默认为no,我们可以改成yes
appendonly yes
# appendfilename 用于指定aof文件名,默认名称为:appendonly.aof,路径是启动redis-server的路径
appendfilename "appendonly.aof"

将配置 appendonly改成yes之后 ,重启redis服务器。可以在启动路径下看到 appendonly.aof 文件。

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

AOF文件的格式;

可以在AOF文件中看到set命令的key以及value。

4. AOF启动/修复/恢复

AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作和RBD一样,都是拷贝备份文件, 需要恢复时在拷贝到Redis工作目录下,启动Redis系统即加载。

4.1. 正常恢复

修改默认的 appendonly no,改为yes。

备份原来的 appendonly.aof 文件为 appendonly.aof.bak,删除最新的 appendonly.aof

将appendonly.aof.bak 重命名回appendonly.aof。重启Redis服务器。

4.2. 异常恢复

修改默认的appendonly no,改为yes

如遇到AOF文件损坏,通过/usr/local/bin/redis-check-aof --fix appendonly.aof 进行恢复

备份被写坏的AOF文件

恢复:重启redis,然后重新加载。

5. AOF同步频率设置

appendfsync always

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

appendfsync everysec

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

appendfsync no

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

6. Rewrite 压缩

Rewrite压缩是什么?

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

重写原理,如何实现重写

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

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

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


auto-aof-rewrite-percentage: 设置重写的基准值,文件达到100% 时开始重写(文件是原来重写后文件的2倍时触发)

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

例如:文件达到70MB开始重写,降到50MB,下次就是100MB的时候开始重写。

7. AOF的优缺点

7.1 优点

备份机制更稳健,丢失数据概率更低

可读的日志文件,通过操作AOF文件,可以处理误操作。

7.2 劣势

1、比起RDB占用更多的磁盘空间

2. 恢复备份速度更慢

3. 每次读写都同步的话,有一定的性能压力。

8. 总结

官方推荐两个都启用

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

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

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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
15天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
1月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
1月前
|
存储 NoSQL Redis
Redis 文件总大小问题之计算待加载AOF文件总大小如何解决
Redis 文件总大小问题之计算待加载AOF文件总大小如何解决
|
1月前
|
NoSQL Redis
Redis AOF重写问题之减少CPU和fork开销如何解决
Redis AOF重写问题之减少CPU和fork开销如何解决
|
1月前
|
NoSQL Redis
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
|
1月前
|
NoSQL Redis 数据库
Redis AOF重写问题之同一数据产生两次磁盘IO如何解决
Redis AOF重写问题之同一数据产生两次磁盘IO如何解决
Redis AOF重写问题之同一数据产生两次磁盘IO如何解决
|
1月前
|
监控 NoSQL Redis
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
|
2月前
|
NoSQL Redis 数据库
redis 持久化机制及配置
redis 持久化机制及配置
67 4
|
1月前
|
NoSQL Redis
Redis AOF重写问题之产生过多INCR AOF文件如何解决
Redis AOF重写问题之产生过多INCR AOF文件如何解决