Redis 实战(一)AOF 持久化配置和数据恢复
真枪实弹: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 持久化配置和数据恢复的更多相关文章
- Docker下redis的主从、持久化配置
Docker下redis的主从.持久化配置 redis是k-v型nosql数据库,支持字符串(string).列表(list).集合(set).散列(hash).有序集合(zset:形如member: ...
- 搞懂Redis RDB和AOF持久化及工作原理
前言 因为Redis的数据都储存在内存中,当进程退出时,所有数据都将丢失.为了保证数据安全,Redis支持RDB和AOF两种持久化机制有效避免数据丢失问题.RDB可以看作在某一时刻Redis的快照(s ...
- 图解 Redis | 不就是 AOF 持久化嘛
AOF 日志 试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了 ...
- Redis实现之AOF持久化
AOF持久化 除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Red ...
- 四十一.redis主从复制 RDB/AOF持久化 数据类型
把redis集群里的主机 恢复为独立的redis服务器(51-58) ]# redis-cli -h 192.168.4.51 -p 6351 shutdown ]# rm -rf /var/lib ...
- 部署Redis4.x单机版及配置RDB和AOF持久化
一.环境及软件 OS soft version CentOS 7.5 redis-4.0.12(目前是4.x最新) 二.下载及编译Redis [root@localhost ~]# wget h ...
- Redis 中的数据持久化策略(AOF)
上一篇文章,我们讲的是 Redis 的一种基于内存快照的持久化存储策略 RDB,本质上他就是让 redis fork 出一个子进程遍历我们所有数据库中的字典,进行磁盘文件的写入. 但其实这种方式是有缺 ...
- 03.AOF持久化机制配置与工作流程
一.AOF持久化的配置 配置文件redis.conf,AOF持久化默认是关闭的,默认是打开RDB持久化 appendonly yes 二.工作流程: 打开AOF持久化机制之后,redis每次接 ...
- Redis数据持久化之AOF持久化
一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...
- redis实战之事务与持久化
1. 事务描述 (1)什么是事务 事务,就是把一堆事情绑在一起,按顺序的执行,都成功了才算完成,否则恢复之前的样子 事务必须服从ACID原则,ACID原则分别是原子性(atomicity).一致性(c ...
随机推荐
- FTP客户端c代码功能实现
现在市面上有很多免费的FTP软件:如FileZilla ,那如果想自己在代码中实现与ftp服务器的上传下载文件该如何实现那? 本质上ftp协议就是TCP基础上建立的一种协议,具体如下. FTP 概述 ...
- 把 URL 中文和一堆百分号转换成字符串
https://www.cnblogs.com/Enziandom/tag/Web%20%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91 JS 有解析这样的 URL 的函数,主 ...
- 自定义顺序表ArrayList
1.简介 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通 ...
- 回顾——Dom节点类型
DOM 节点 在 HTML DOM 中,所有事物都是节点.DOM 是被视为节点树的 HTML. 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 整个文档是一个文档节点 ...
- Redis Stream类型的使用详解
目录 一.背景 二.redis中Stream类型的特点 三.Stream的结构 四.Stream的命令 1.XADD 往Stream末尾添加消息 1.命令格式 2.举例 2.XRANGE查看Strea ...
- Git安装,配置、基本使用
p.p1 { margin: 0; font: 12px ".PingFang SC" } p.p2 { margin: 0; text-align: justify; font: ...
- 淘宝sign算法和使用教程
前言 最新写的淘宝热卖插件系列里面有涉及到淘宝sign算法加密,这里博主分享一下之前找到算法和修改后的算法以及使用教程.在此希望能帮助更多的人,欢迎各位加入我的交流Q群:468458543,群内不定时 ...
- react项目打包后点击index.html页面出现空白
当本地打包后的文件,直接通过文件路径访问,出现空白或者,提示打包后的build内的js,css文件路径错误,有以下两种方式 方式一(无网络限制的情况下使用): 1.全局安装serve启动本地服务: n ...
- vue element 日期范围选择器限制:只能选今天之前的时间 || 只能选今天之后的时间 || 选取今天往后三天内
举例:只能选今天或者今天之后的时间(如下图) <el-date-picker clearable v-model="form.limitTime" type="da ...
- 32位机转化11位手机号以及BLE与USB的切换
目录 用现有的资源,去实现本应该用更多资源来实现的需求,是一件很有意思的事情.不是说提倡这样使用,而是换一种思路解决问题比较新奇,或是在很多限制既定的情况下可以应急. 比如说,582m芯片,默认用32 ...