本文学习redis7两大持久化技术之一:AOF(Append Only File)日志追加方式持久化备份与还原,重写以及AOF方式的优缺点

1. AOF相关配置

首先我们先简单了解下Redis7中AOF相关配置

// 开启AOF方式持久化,默认no
appendonly yes
// AOF持久化名称
appendfilename "appendonly.aof"
// AOF持久化文件存储目录
appenddirname "appendonlydir"
// fsync数据到磁盘策略:默认每秒everysec
appendfsync everysec
// AOF重写时不进行fsync操作,防止redis长时间阻塞
no-appendfsync-on-rewrite no
// AOF重写最小大小为64M,当AOF文件大小扩展一倍时触发重写:如128M, 192M
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
// 当AOF结尾异常,Redis加载时截取正确部分,恢复时不报错,仅仅日志提示
aof-load-truncated yes
// append-only基础文件采用RDB格式
aof-use-rdb-preamble yes
// AOF记录命令执行时间戳,默认no
aof-timestamp-enabled no

2. AOF备份还原实践

2.1 AOF文件正常情况下还原

修改配置文件为appendonly yes,并启动redis

可以看到redis7中,在appendonlydir目录下生成了

  • rdb基础文件
  • incr增量文件
  • manifest管理文件

继续执行以前的测试文件

@SpringBootTest
public class RedisTest {@Autowiredprivate RedissonClient redissonClient;@Testpublic void testRdb() throws InterruptedException {RMap<String, String> rMap = redissonClient.getMap("rdb");for (int i = 0; i < 10020; i++) {rMap.put(i + "", i + "");}Thread.sleep(60000);for (int i = 0; i < 80; i++) {rMap.put(i + "ok", i + "ok");}}
}

操作后我们尝试修改appendonlydir目录名,发现只读不允许修改,我们复制一份重命名为appendonlydirbak模拟备份文件,然后执行

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> shutdown

然后我们删除appendonlydir目录,重命名appendonlydirbak为appendonlydir,然后启动redis, 执行hkeys rdb如图所示,key数量为10100未丢失

我们同时配置了RDB与AOF,但redis会已AOF为准进行恢复

2.2 AOF异常状况下进行还原

我们关闭redis服务器,执行命令破坏incr.aof文件

/data # echo 'HELLO WORLD' >> /data/appendonlydir/appendonly.aof.1.incr.aof

当我们重启redis发现无法正常启动,我们使用redis-check-aof工具检查错误

/data # redis-check-aof  /data/appendonlydir/appendonly.aof.1.incr.aof
Start checking Old-Style AOF
AOF /data/appendonlydir/appendonly.aof.1.incr.aof format error
AOF analyzed: filename=/data/appendonlydir/appendonly.aof.1.incr.aof, size=492735, ok_up_to=492723, ok_up_to_line=90906, diff=12
AOF /data/appendonlydir/appendonly.aof.1.incr.aof is not valid. Use the --fix option to try fixing it.
/data # redis-check-aof --fix /data/appendonlydir/appendonly.aof.1.incr.aof
Start checking Old-Style AOF
AOF /data/appendonlydir/appendonly.aof.1.incr.aof format error
AOF analyzed: filename=/data/appendonlydir/appendonly.aof.1.incr.aof, size=492735, ok_up_to=492723, ok_up_to_line=90906, diff=12
This will shrink the AOF /data/appendonlydir/appendonly.aof.1.incr.aof from 492735 bytes, with 12 bytes, to 492723 bytes
y // 输入y才弹出来Continue,然后继续输入y
Continue? [y/N]: Successfully truncated AOF /data/appendonlydir/appendonly.aof.1.incr.aof

修复aof文件后,可以观察到appendonly.aof.1.incr.aof中HELLO WORLD被移除,并可以正常重新启动redis

3. AOF持久化原理

3.1 AOF持久化三大步骤

我们采用伪代码来表示持久化实现的三大步骤:命令追加至aof_buf缓冲区、aof_buf缓冲写入aof文件、fsync文件同步[说白点类似将word中写入的值点击保存至磁盘]

def evenLoop():while True:// 处理文件事件,接受命令请求以及发送命令回复// 处理写请求追加到aof_buf缓冲区processFileEvents()// 处理时间事件processTimeEvents()// 根据持久化策略,也就是appendfsync的配置选择是否将aof_buf缓冲写入并保存到aof文件flushAppendOnlyFile()

redis进程就是一个事件循环(loop),循环中的文件事件负责处理客户端请求并响应,当AOF配置appendonly打开时,文件事件处理完写命令后,会将写命令已redis协议格式追加到aof_buf缓冲区末尾【如上图所示】;对于时间事件,则运行定时函数;

3.2 文件写入与同步策略

对于flushAppendOnlyFile()函数,也就是文件写入与同步步骤是由appendfsync配置决定

  • appendfsync everysec: 每个事件循环都要将aof_buf缓冲值写入aof文件,每秒fsync同步至磁盘
  • appendfsync always: 每个事件循环都要将aof_buf缓冲值写入aof文件,并立即fsync同步至磁盘,效率最低,三者中也最安全
  • appendfsync no: 每个事件循环都要将aof_buf缓冲值写入aof文件,由操作系统决定何时 fsync同步至磁盘,一般30s,效率最高,三者中最不安全

4. AOF重写实践与流程

当redis写命令越来越多,aof会越来越大,达到重写配置条件,或者手工执行bgrewriteaof时会触发重写机制已减少aof大小

// AOF重写时不进行fsync操作,防止redis长时间阻塞
no-appendfsync-on-rewrite no
// AOF重写最小大小为64M,当AOF文件大小扩展一倍时触发重写:如128M, 192M
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
4.1 AOF重写实践

我们先记录下.incr.aof文件当前的行数为90805,再次执行上述java批量写入命令,我们发现目前行数增加至181810行,体积变为900K,现在我们执行BGREWRITEAOF重写后,我们发现incr.aof为空了,且base.rdb文件大小由1K增加156K

127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started


4.2 AOF重写流程

当redis版本>=7时,流程如下:

  • redis fork出子进程,此时存在父进程与子进程
  • 子进程开始重写一个新的base aof文件【我们刚重写的是2.base.rdb】到临时文件
  • 父进程打开一个新的incr.aof增量文件【2.incr.aof文件】处理客户端写请求,即使重写失败,manifest文件指向1.base.rdb+2.incr.aof增量文件,所以安全性有保障
  • 当子进程重写完base aof文件,父进程会接收到信号,会使用新的base aof文件和新的incr.aof增量文件来构建一个临时manifest文件,并将manifest、2.base.rdb临时文件持久化
  • redis现在原子性替换manifest文件已使得AOF重写生效,并清理旧的1.base.rdb文件和无用增量文件[1.incr.aof]

当然在低于7版本是通过AOF重写缓冲区实现的,在此不在讨论

5. AOF优缺点

优点:

  • 相对于rdb而言,提供了三种fsync同步策略,数据备份更加安全
  • AOF仅仅追加写命令,不会因为断电寻道导致文件损坏,即使损坏也很容易恢复
  • 当AOF文件过大时,redis能够在后台自动重写
  • AOF协议文本格式易于理解操作,即使flushall删库,只要没有发生重写,仍然可以停止服务器,删除incr.aof中flushall命令,重启数据库来还原

缺点:

  • AOF文件通常比RDB快照文件大
  • AOF数据还原可能比RDB慢,取决于具体fsync策略,禁用fsync策略高负载下也同样和rdb一样快,everysec性能仍然非常高
  • 低于redis7版本时,AOF重写可能会使用大量内存

欢迎关注公众号 算法小生 获取更多精彩内容

18.Redis系列之AOF方式持久化相关推荐

  1. Redis系列-第四篇持久化与事务

    一.持久化 Redis是一个内存数据库,为了保证数据的持久性,它提供了两种持久化方案: RDB方式(默认) AOF方式 持久化功能有效地避免因进程退出造成的数据丢失问题, 当下次重启时利用之前持久化的 ...

  2. 17.Redis系列之快照RDB方式持久化

    本文学习redis两大持久化技术之一:RDB(redis database)快照方式持久化备份与还原,以及RDB方式的优缺点 1. RDB相关配置 首先我们先简单了解下Redis7中RDB相关配置 / ...

  3. Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)

    1. 持久化 所谓持久化是指将数据从内存中以某种形式同步到硬盘中,在 Redis 重启后能够根据硬盘中的记录恢复数据.Redis 持久化有两种方式,分别为 RDB(redis data base) [ ...

  4. redis 系列17 持久化 AOF

    redis 系列17 持久化 AOF 原文:redis 系列17 持久化 AOF 一.概述 除了上篇介绍的RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能. ...

  5. 吃透Redis系列(五):RDB和AOF持久化详细介绍

    Redis系列文章: 吃透Redis系列(一):Linux下Redis安装 吃透Redis系列(二):Redis六大数据类型详细用法 吃透Redis系列(三):Redis管道,发布/订阅,事物,过期时 ...

  6. Redis的持久化机制-RDB方式和AOF方式

    场景 Redis的持久化策略 持久化可以理解为存储,就是将数据存储到一个不会丢失的地方. 如果把数据存储在内存中,电脑关闭或者重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘中就算是一种 ...

  7. 峰Redis学习(8)Redis 持久化AOF方式

    第三节:Redis 的持久化之AOF 方式 AOF方式:将以日志,记录每一个操作 优势:安全性相对RDB方式高很多: 劣势:效率相对RDB方式低很多: 1)AOF方式需要配置: # Please ch ...

  8. redis的基本操作And数据持久化方式以及redis实现mybatis缓存

    Redis 1.NoSql # NoSql(Not Only Sql),不仅仅是sql,泛指非关系型数据库 2.NoSql的诞生 随着互联网web2.0网站的兴起,传统的关系型数据库在高并发和特大规模 ...

  9. Redis AOF 全持久化

    简介: Redis AOF 持久化,将每次接收到更改 redis 数据的操作都记录到一个 aof 文件,当服务器意外宕机或 redis 服务器非法关闭时,不会丢失数据. 可以做到数据安全化,但是性能会 ...

最新文章

  1. Python json和list互相转换
  2. list循环赋值_一步一步学Python3(小学生也适用) 第十七篇:循环语句for in循环
  3. 封装各种生成唯一性ID算法的工具类
  4. UVa439 Knight Move 骑士的移动(bfs)
  5. 这是一个沙雕题II(思维好题)
  6. R-CNN , Fast R-CNN , Faster R-CNN原理及区别
  7. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)
  8. docker harbor 域名_docker registry harbor
  9. [BZOJ5302][HAOI2018]奇怪的背包(DP)
  10. autojs控制台美化
  11. c语言单片机编程教学大纲,单片机应用技术[C语言]教学大纲.doc
  12. KW代码检查规则-RLK.JNDI
  13. android n beta,谷歌发布Android N(安卓7.0) Beta5开发者预览版固件更新
  14. 【Oracle】并行等待之PX Deq: Execute Reply
  15. 北上资金 python_股票数据抓取——北上基金持股数据(selenium抓取数据),爬取,之,北向,资金,通过...
  16. MATLAB深度学习入门之旅
  17. 如何迅速打造敏捷团队
  18. vue.js 表格表单序号
  19. Mysql 密码忘记了,呃呃呃
  20. linux smit工具,Aix操作系统SMIT工具

热门文章

  1. 医学生应如何运用计算机课程,医学生学习计划(通用3篇)
  2. 字幕通-字幕翻译工具
  3. 程明明:“生活歌者,一路向前”
  4. 头脑风暴-记一道有趣的问题
  5. 城市智慧交通系统总体解决方案
  6. MATLAB slice函数绘制三维n×m×k矩阵的立体图或剖面图 —可视化四维数据
  7. Snippet Store 0.2.11 汉化版
  8. 服务器运行过程中跳线,服务器内部跳线地址原理
  9. 税控服务器管理系统打印,工行南昌北西支行“营改增”税控服务器管理系统成功上线...
  10. 【基础】什么是三维向量