真枪实弹:AOF 持久化配置和数据恢复

大家好,我是悟空呀。

如果你曾经背过 RDB 和 AOF 的面试八股文,那么对 AOF 肯定不陌生,但如果只停留在应付面试阶段,对于提高自己的技术是远远不够的,今天,悟空就带大家来真枪实弹来看看 AOF 的持久化是怎么配置的,以及如何应用 AOF 文件进行数据恢复。

开启持久化配置

什么是 AOF 持久化

  • 以独立日志的方式记录每次写命令。
  • 重启时再执行 AOF 文件中的命令达到恢复数据的目的。
  • 解决什么问题:解决了数据持久化的实时性。

开启持久化配置 appendonly

AOF 持久化配置默认是关闭的,所以需要手动打开。打开后就可以写入持久化文件 appendonly.aof 中,当然这个文件名字也是可以通过配置项 appendfilename 来设置的。

按照如下配置即可打开:

appendonly yes复制复制失败复制成功

对于生产环境来说,推荐打开,除非系统不关心丢失数据。

AOF 持久化流程

分为四个部分:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)

  • 命令写入:所有的写入命令会追加到 aof_buff 缓冲区中。
  • 文件同步:AOF 缓冲区会根据对应的策略向硬盘做同步操作。
  • 文件重写:当 AOF 文件越来越大时,需要定期对 AOF 文件进行重写,达到压缩的目的。
  • 重启加载:当 Redis 服务器重启时,可以加载 AOF 文件进行数据恢复。

同步写盘配置

将 aof_buf 中的数据 同步到磁盘的配置项是:appendfsync,有三种配置西昂:Always、Everysec、No。

Always,同步写回:每个写命令执行完,立马同步地将日志写回磁盘;数据基本不丢失,性能较差。

Everysec,每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;宕机时丢失 1s 内的数据,性能较好。

No,操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘;宕机时丢失数据较多。通常同步周期最长 30 秒。

持久化数据恢复

开启 AOF 持久化配置

先开启 AOF 持久化配置,并设置每秒同步 aof_buf 中的数据到磁盘。

appendonly yes复制复制失败复制成功

在我配置的环境下,这个配置文件的路径如下:

/etc/redis/6379.conf复制复制失败复制成功

开启同步配置

appendfsync 默认配置是 everysec

appendfsync everysec复制复制失败复制成功

然后重启 Redis

redis-cli shutdown
cd /etc/init.d
./redis_6379 start
ps -ef | grep redis
复制复制失败复制成功

重启后,会自动生成 appendonly.aof 文件。

插入一些数据

redis-cli
set key10 100
set key11 110
复制复制失败复制成功

检查 AOF 文件

进入到存放持久化文件的目录:

cd /var/redis/6379
ll
cat appendonly.aof 文件
复制复制失败复制成功

生成了 appendonly.aof 文件。我们也可以看下这个文件里面存放了什么。

强制退出 Redis

强制退出 Redis 时,不会生成 RDB 文件,而且还没有到 RDB 的检查点,所以 RDB 快照不会重新生成。所以 key8 和 key 9 不存在 RDB 的快照 dump.rdb 文件中。

重启时,Redis 直接从 append.aof 文件中读取日志,恢复 Redis 内存数据。

强制和退出的步骤如下:

首先获取 Redis 的进程 id

ps -ef | grep redis复制复制失败复制成功

Redis PID=1570,然后用 kill -9 干掉 Redis 进程:

kill -9 1570复制复制失败复制成功

干掉 Redis 进程时,不会自动生成 dump.rdb 文件。

然后重启 Redis

cd /var/run
rm -rf redis_6379.pid
cd /etc/init.d
./redis_6379 start
复制复制失败复制成功

检查重启后,数据是否恢复

redis-cli
get key10
get key11
复制复制失败复制成功

key10 和 key11 都有数据,如下图如下:

检查 RDB 持久化文件

我们用 notepad++ 工具打开 dump.rdb 文件,可以看出确实没有 key10 和 key11。

AOF 文件重写

AOF 日志就一个,AOF 日志的大小会不断增加,如果不即时清理,将会达到很大,下次重启时,通过 AOF 日志恢复内存数据是很慢的ige过程。

Redis 重写策略:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
复制复制失败复制成功

流程:

(1)当 Redis 日志的大小超过 64 MB,且超过上次日志文件大小时,Redis 父进程 fork 一个子进程。这两个值都可以通过命令 info persistence 获取到。如下图所示:

(2)Redis 父进程 fork 一个子进程后,父进程继续响应其他命令。修改命令还是写入到 AOF 缓冲区,并根据 appendfsync 策略同步到磁盘,保证原来的 AOF 机制正常执行。

(4)新写入的命令,会通过 AOF 重写缓冲区来记录。

(5)子进程根据内存快照,按照命令合并规则写入到新的 AOF 文件。

(6)父进程把 AOF 重写缓冲区的数据追加写入到新的 AOF 文件。

AOF 文件损坏

如果 Redis 在 append 数据到 AOF 日志文件中时,机器突然宕机了,可能导致 AOF 日志文件不完整,也就是 AOF 文件损坏。

我们可以先对错误格式的 AOF 文件,先进行备份,然后使用 redis-check-aof --fix 命令来进行修复。然后使用 diff -u 对比数据的差异,查出丢失的数据。

实验步骤:

(1)拷贝一份 AOF 日志文件,这个文件是正常的文件。

cd /var/redis/6379
cp appendonly.aof /var/local/appendonly_copy.aof
复制复制失败复制成功

(2)然后用 redis-check-aof 工具检查拷贝的 AOF 文件是否完整

cd /usr/local/redis-3.2.8
redis-check-aof ../../apendonly_copy.aof
复制复制失败复制成功

提示 AOF 文件是有效的,占用 176 个字节,完整的字节也是 176 个,不完整的的字节为 0 个。

AOF analyzed: size=176, ok_up_to=176, diff=0
AOF is valid
复制复制失败复制成功

然后编辑 appendonly_copy.aof,删掉最后的两行,使日志不完整。

再次用检查工具检查,提示 AOF 无效,总字节 167 个,完整的字节是 143 个,不完整的字节是 24 个:

AOF analyzed: size=167, ok_up_to=143, diff=24
AOF is not valid
复制复制失败复制成功

我们再用检查工具修复下:

./redis-check-aof --fix ../../appendonly_copy.aof 复制复制失败复制成功

提示是否修复 AOF 文件,输入 y,最后会把文件从 167 字节截取为 143 字节,因为只有 143 字节是完整的记录:

AOF analyzed: size=167, ok_up_to=143, diff=24
This will shrink the AOF from 167 bytes, with 24 bytes, to 143 bytes
Continue? [y/N]: y
Successfully truncated AOF
复制复制失败复制成功

我们打开日志文件也会发现不完整的 key11 的操作命令被删掉了:

另外也可以通过配置 aof-load-truncated 配置来兼容这种破损情况,默认是开启的。

AOF 和 RDB 同时存在

AOF 和 RDB 是可以同时工作的,只是会有限制条件:

  • 同时生成了 RDB 和 AOF 文件,先使用 AOF 进行数据恢复。
  • 如果 RDB 正在生成快照文件,而用户又在执行 AOF 重写命令,那么需要等到 RDB 快照生成之后,才会执行 AOF 重写。
  • 如果 RDB 正在生成快照文件,那么 Redis 不会去执行 AOF 重写,相反也是。

Redis 实战(一)AOF 持久化配置和数据恢复的更多相关文章

  1. Docker下redis的主从、持久化配置

    Docker下redis的主从.持久化配置 redis是k-v型nosql数据库,支持字符串(string).列表(list).集合(set).散列(hash).有序集合(zset:形如member: ...

  2. 搞懂Redis RDB和AOF持久化及工作原理

    前言 因为Redis的数据都储存在内存中,当进程退出时,所有数据都将丢失.为了保证数据安全,Redis支持RDB和AOF两种持久化机制有效避免数据丢失问题.RDB可以看作在某一时刻Redis的快照(s ...

  3. 图解 Redis | 不就是 AOF 持久化嘛

    AOF 日志 试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了 ...

  4. Redis实现之AOF持久化

    AOF持久化 除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Red ...

  5. 四十一.redis主从复制 RDB/AOF持久化 数据类型

    把redis集群里的主机 恢复为独立的redis服务器(51-58) ]# redis-cli  -h 192.168.4.51 -p 6351 shutdown ]# rm -rf /var/lib ...

  6. 部署Redis4.x单机版及配置RDB和AOF持久化

    一.环境及软件 OS soft version  CentOS 7.5   redis-4.0.12(目前是4.x最新) 二.下载及编译Redis [root@localhost ~]# wget h ...

  7. Redis 中的数据持久化策略(AOF)

    上一篇文章,我们讲的是 Redis 的一种基于内存快照的持久化存储策略 RDB,本质上他就是让 redis fork 出一个子进程遍历我们所有数据库中的字典,进行磁盘文件的写入. 但其实这种方式是有缺 ...

  8. 03.AOF持久化机制配置与工作流程

    一.AOF持久化的配置 配置文件redis.conf,AOF持久化默认是关闭的,默认是打开RDB持久化 appendonly yes     二.工作流程: 打开AOF持久化机制之后,redis每次接 ...

  9. Redis数据持久化之AOF持久化

    一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...

  10. redis实战之事务与持久化

    1. 事务描述 (1)什么是事务 事务,就是把一堆事情绑在一起,按顺序的执行,都成功了才算完成,否则恢复之前的样子 事务必须服从ACID原则,ACID原则分别是原子性(atomicity).一致性(c ...

随机推荐

  1. Redis 源码解读之 Rehash 的调用时机

    Redis 源码解读之 Rehash 的调用时机 背景和问题 本文想要解决的问题 什么时机触发 Rehash 操作? 什么时机实际执行 Rehash 函数? 结论 什么时机触发 Rehash 操作? ...

  2. RocketMQ - 生产者最佳实践总结

    相对消费者而言,生产者的使用更加简单,一般关注消息类型.消息发送方法和发送参数,即可正常使用RocketMQ发送消息 常用消息类型 消息类型 优点 缺 点 备注 普通消息(并发消息) 性能最好.单机T ...

  3. Cesium给3dtileset中的每个瓦片添加一个billboard/label(六)

    2023-01-14 改了下思路,直接根据点击的位置转换为世界坐标系再添加label console.log(`鼠标点击位置为:${click.position}`); var cartesian = ...

  4. Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'xxx' in 'where clause'

    在使用Ruoyi管理系统中出现这个问题 Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column ...

  5. [代码审计基础 02]-SQL注入和预编译和预编译绕过

    SQL注入 thinkphp基本没得SQL注入,除非魔改 ORM框架的错误使用 一个专门用来防御SQL注入的框架 错误写法-java/mybatis <select id = "fin ...

  6. mysql怎么设计库、设计表

    一. 设计表/库 设计思想就是要分析表每个字段的具体参数,包括但不限于以下几点: 约束? NOT NULL, PRIMARY KEY, UNIQUE KEY, DEFAULT, FOREIGN KEY ...

  7. JZOJ 4754.矩阵

    \(\text{Problem}\) \(\text{Solution}\) 纪念我考场正解被二分暴力暴踩... 首先二分的话,显然可以二分出答案,然后数矩阵和大于等于本矩阵的是否有 \(k\) 个 ...

  8. JZOJ 2020.07.30【NOIP提高组】模拟

    总结 本场比赛很不负责对待 暴力都没怎么打 一个半小时后才开始打题 很悲剧的只有 \(23+11+36=70\) 分 \(T1\) 4300. 装饰大楼 题目 略 思路 很无聊的找规律题 考场弃疗 \ ...

  9. yile接口

    后台接口: ---------------------------更改订单状态接口(需要主站长账号权限,主站要有接口权限)更改订单状态(可批量更新),如需退款/退单请用订单退款退单接口,如需更新订单数 ...

  10. 常见的git操作

    git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a查看所有的分支 git branch -r 查看远程所有分支 git ...