04 AOF日志:宕机了,Redis如何避免数据丢失
接下来两篇将记录Redis持久化存储两大技术:AOF日志、RDB快照
本篇重点
“AOF日志实现”
“AOF日志三种写回策略”
“AOF重写——避免日志过大的解决方案”
前言
Redis持久化存储两大技术:AOF日志、RDB快照
AOF: Append Only File
RDB: Redis DB
背景
Redis运行中,若突然宕机,存储在内存中的数据都会丢失。此时如果从后端数据库恢复数据,虽然可行,但也会导致效率问题:
- 频繁访问数据库增加数据库压力
- 慢速数据库读取导致Redis性能下降
因此,Redis实现数据持久化的方式,要避免从后端数据库中恢复数据,采用的方式就是AOF日志和RDB快照,本篇文章主要讨论AOF日志。
1. AOF日志实现
- 写后日志:先执行命令,数据写入内存;再记录日志
- 日志记录内容:Redis收到的每一条命令,记录格式如下:
"*+number"——当前命令有number个字段,后面内容是对应字段描述
"$+number"——表示当前字段占用的字节数,后面跟具体字段名称
例子:命令:
set testkey testvalue,写入AOF日志后的格式是*3 // 当前命令3个字段(分别是set testkey testvalue)
$3 // 第一个字段占3B
set // 第一个字段名:set
$7
testkey
$9
testvalue
- “写后日志”的原因
- Redis记录AOF日志时不会对命令进行语法检查(节省检查开销)
- 基于第一点,采用“写后日志”防止记录错误命令
- AOF日志在主线程中执行
- AOF不会阻塞当前写操作(先执行命令,后记录日志)
- AOF潜在风险:
- AOF存在阻塞下一个操作的风险(下个操作执行之前主线程写上一个操作的日志)
- 若Redis直接用作数据库,命令执行后系统宕机——AOF日志没记录导致数据丢失
以上的AOF潜在风险都与AOF日志写盘时间相关,解决方案——AOF三种写回策略
2. AOF日志三种写回策略——appendfsync参数的三个可选项
Always——同步写回:每个写命令执行后,同步写磁盘
Everysec——每秒写回:日志暂时写到AOF日志cache,每隔1s写盘
No——操作系统控制的写回:日志暂时写到AOF日志cache,由OS决定何时写盘
| 配置项 | 写回时机 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Always | 同步写回 | 可靠性高 数据基本不丢失 |
每个写操作都伴随写盘,性能影响较大 | 高可靠性 |
| Everysec | 每秒写回 | 性能适中 | 宕机时丢失1s内数据 | 允许少量数据丢失,同时性能影响较小 |
| No | OS控制写回 | 性能好 | 宕机时丢失数据较多 | 高性能 |
QA
Q: AOF文件过大带来的一系列性能问题?如何控制AOF文件过大?
A: 性能问题
- 文件系统本身文件大小的限制
- 文件太大时,追加命令记录效率变低
- 宕机后,AOF文件中的命令挨个重新执行的导致的故障恢复过程缓慢
解决方案:AOF重写机制
3. AOF重写——避免AOF日志过大
- AOF重写:Redis根据数据库现状,创建一个新的AOF文件
- 原理:“多变一”——某个KV被多条命令反复修改
- AOF重写是否会阻塞主线程?AOF重写机制。
- AOF日志由主线程写盘
- AOF重写日志由后台子进程bgrewriteaof执行
- 重写过程——“一个拷贝,两处日志”
- “一个拷贝”:主线程fork bgrewriteaof子进程,通过拷贝页表(OS的“写时复制”原则)访问主线程的内存数据
- “两处日志”:写操作发生时,AOF日志与AOF重写均先将操作记录到各自日志cache中,随后fork bgrewriteaof子进程进程重写日志操作
- AOF非阻塞的重写过程

结尾
AOF故障恢复需要运行所有操作记录,即“重放”过程很慢,既能避免数据丢失,又能更快恢复数据的方法——“RDB快照”
图片来源于极客时间专栏《Redis核心技术与实战》
04 AOF日志:宕机了,Redis如何避免数据丢失的更多相关文章
- Redis 日志篇:无畏宕机快速恢复的杀手锏
特立独行是对的,融入圈子也是对的,重点是要想清楚自己向往怎样的生活,为此愿意付出怎样的代价. 我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机,内存中的数据全部丢失,假如 ...
- Redis基础篇(三)持久化:AOF日志
Redis是内存数据库,但是一旦服务器宕机,内存中的数据将会全部丢失. 最简单的恢复方式是从后端数据库恢复,但这种方式有两个问题: 频繁访问数据库,会给数据库带来巨大的压力: 从数据库中读取相比从Re ...
- Redis宕机的问题
在主从模式下宕机要分为区分来看: slave从redis宕机 在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据: 如果从数据库实现了持久化,只要重新假如到主从架构中会实现增 ...
- 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...
- Redis生产环境节点宕机问题报错及恢复排错
Redis故障发现 主观下线 当cluster-node-timeout时间内某节点无法与另一个节点顺利完成ping消息通信时,则将该节点标记为主观下线状态. 客观下线 当某个节点判断另一个节点主观下 ...
- Redis的持久化的两种方式drbd以及aof日志方式
redis的持久化配置: 主要包括两种方式:1.快照 2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...
- [转帖]Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案
Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案 https://www.cnblogs.com/xlecho/p/11834011.html echo编辑整理,欢迎转载,转 ...
- linux 双Redis + keepalived 主从复制+宕机自主切换
主要核心思想,如果master 和 salve 全部存活的情况,VIP就漂移到 master.读写都从master操作,如果master宕机,VIP就会漂移到salve,并将之前的salve切换为ma ...
- 宕机了,Redis数据丢了怎么办?
持续原创输出,点击上方蓝字关注我 目录 前言 什么是AOF? 三种写回策略 日志文件太大怎么办? AOF重写会阻塞主线程吗? AOF的缺点 总结 什么是RDB? 给哪些数据做快照? 快照时能够修改数据 ...
随机推荐
- 不是都需要ARM吗?
不是都需要ARM吗? ARM系统架构简介 什么是ARM处理器,为什么没有听说? ARM-缩写:Advanced RISC Machines 该处理器起源于1984年的英格兰.在成立之初,ARM代表Ac ...
- Selenium-python 之 frame定位元素
定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了frame或者放到窗口了,只要我们切入进去就可以很容易定位到元素. 处理frame时主要使用到sw ...
- 【VBA】模块更新方法
删除模块,重新导入 1 Sub 更新模块() 2 With ThisWorkbook.VBProject 3 .VBComponents.Remove .VBComponents("模块1& ...
- JavaScript 沙盒模式
微前端已经成为前端领域比较火爆的话题,在技术方面,微前端有一个始终绕不过去的话题就是前端沙箱 什么是沙箱 Sandboxie(又叫沙箱.沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程 ...
- 将Flink计算完毕后的数据Sink到Nebula
Flink是目前流计算的隐形王者,在国际国内有有庞大的拥趸. Nebula是国产图数据库的后起之秀,在DBEngines中排名也逐年上升. 将两者进行结合,可以产生很多应用场景:比如实时计算服务链路调 ...
- Redis计数信号量
计数信号量是一种锁,它可以让用户限制一项资源最多能够同时被多少个进程访问,通常用于限定能够同时使用的资源数量.你可以把Redis分布式锁里面创建的锁看作是只能被一个进程访问的信号量. 计数信号量和其他 ...
- 温故知新,.Net Core利用UserAgent+rDNS双解析方案,正确识别并反爬虫/反垃圾邮件
背景 一般有价值的并保有数据的网站或接口很容易被爬虫,爬虫会占用大量的流量资源,接下来我们参考历史经验,探索如何在.Net Core中利用UserAgent+rDNS双解析方案来正确识别并且反爬虫. ...
- 07 修改JumpServer网页信息
1.7.修改JumpServer网页信息 注意:在修改相关配置文件之前要先进行备份,防止文件修改错误无法恢复. 1.Luna图标: /opt/luna/static/imgs/logo.png 2.j ...
- 33、awk命令详解
33.1.命令介绍: awk不仅仅是linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告. awk的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,aw ...
- 16、编译安装ansible
16.1.python版本说明: Ansible是一种批量部署工具,现在运维人员用的最多的三种开源集中化管理工具有:puppet,saltstack,ansible,各有各的优缺点, 其中saltst ...