前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis的AOF持久化机制

Redis的AOF持久化机制

作者头像
别团等shy哥发育
发布2023-02-25 15:14:21
3810
发布2023-02-25 15:14:21
举报
文章被收录于专栏:全栈开发那些事

文章目录

  Redis提供了两种持久化的方式,分别是AOF(Append Only File,只追加文件)和RDB(Redis DataBase,基于Redis数据库)。

1、AOF是什么?

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

2、AOF持久化流程

(1)客户端的请求写命令会被append追加到AOF缓冲区内; (2)AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中; (3)AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量; (4)Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;

在这里插入图片描述
在这里插入图片描述

2、AOF配置文件的说明

2.1 AOF默认是不开启的

可以在redis.conf配置文件里修改appendonly参数来开启。 也可以设置配置文件名称,默认为appendonly.aof。 AOF文件的保存路径,同RDB的路径一致。

在这里插入图片描述
在这里插入图片描述

2.2 AOF启动/修复/恢复

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

正常恢复

  • 修改默认的appendonly no,改为yes
  • 将有数据的aof文件复制一份保存到对应目录(查看目录:config get dir)
  • 恢复:重启redis然后重新加载

异常恢复

  • 修改默认的appendonly no,改为yes
  • 如遇到AOF文件损坏,通过/usr/local/bin/redis-check-aof–fix appendonly.aof进行恢复
  • 备份被写坏的AOF文件
  • 恢复:重启redis,然后重新加载

2.3 AOF同步频率设置

代码语言:javascript
复制
appendfsync always

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

代码语言:javascript
复制
appendfsync everysec

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

代码语言:javascript
复制
appendfsync no

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

2.4 Rewrite压缩

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

2.4.1 重写原理,如何实现重写

  AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),redis4.0版本后的重写,是指上就是把rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。   可以通过如下三个参数来定义重写时的策略。 no-appendfsync-on-rewrite: 如果 no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)如果 no-appendfsync-on-rewrite=no, 还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低) auto-aof-rewrite-percentage: 设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发) auto-aof-rewrite-min-size: 设置重写的基准值,最小文件64MB。达到这个值开始重写。

2.4.2 重写流程

(1)bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。 (2)主进程fork出子进程执行重写操作,保证主进程不会阻塞。 (3)子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。 (4)1).子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。2).主进程把aof_rewrite_buf中的数据写入到新的AOF文件。 (5)使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。

在这里插入图片描述
在这里插入图片描述

3、AOF持久化实战

在这里插入图片描述
在这里插入图片描述

3.1 启动redis服务并用客户端连接

代码语言:javascript
复制
 redis-server redis.conf
 redis-cli
在这里插入图片描述
在这里插入图片描述

3.2 设置几个键值对

在这里插入图片描述
在这里插入图片描述

查看appendonly.aof

在这里插入图片描述
在这里插入图片描述

3.3 模仿断电,我们直接shutdown关闭redis服务器

在这里插入图片描述
在这里插入图片描述

3.4 再次打开redis服务器并用客户端连接

在这里插入图片描述
在这里插入图片描述

3.5 测试持久化是否成功(查看断电之前的数据还在不在)

在这里插入图片描述
在这里插入图片描述

  可以看到,持久化机制已经生效,每秒会同步持久化文件,是因为我们配置文件中的持久化策略为 appendfsync everysec

在这里插入图片描述
在这里插入图片描述

3.6 修复appendonly.aof文件

如果appendonly.aof文件损坏怎么办呢?

代码语言:javascript
复制
 redis-check-aof --fix appendonly.aof
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1、AOF是什么?
  • 2、AOF持久化流程
  • 2、AOF配置文件的说明
    • 2.1 AOF默认是不开启的
      • 2.2 AOF启动/修复/恢复
        • 2.3 AOF同步频率设置
          • 2.4 Rewrite压缩
            • 2.4.1 重写原理,如何实现重写
            • 2.4.2 重写流程
        • 3、AOF持久化实战
          • 3.1 启动redis服务并用客户端连接
            • 3.2 设置几个键值对
              • 3.3 模仿断电,我们直接shutdown关闭redis服务器
                • 3.4 再次打开redis服务器并用客户端连接
                  • 3.5 测试持久化是否成功(查看断电之前的数据还在不在)
                    • 3.6 修复appendonly.aof文件
                    相关产品与服务
                    云数据库 Redis
                    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档