接下来两篇将记录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如何避免数据丢失的更多相关文章

  1. Redis 日志篇:无畏宕机快速恢复的杀手锏

    特立独行是对的,融入圈子也是对的,重点是要想清楚自己向往怎样的生活,为此愿意付出怎样的代价. 我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机,内存中的数据全部丢失,假如 ...

  2. Redis基础篇(三)持久化:AOF日志

    Redis是内存数据库,但是一旦服务器宕机,内存中的数据将会全部丢失. 最简单的恢复方式是从后端数据库恢复,但这种方式有两个问题: 频繁访问数据库,会给数据库带来巨大的压力: 从数据库中读取相比从Re ...

  3. Redis宕机的问题

    在主从模式下宕机要分为区分来看: slave从redis宕机 ​ 在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据: ​ 如果从数据库实现了持久化,只要重新假如到主从架构中会实现增 ...

  4. 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据

    任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...

  5. Redis生产环境节点宕机问题报错及恢复排错

    Redis故障发现 主观下线 当cluster-node-timeout时间内某节点无法与另一个节点顺利完成ping消息通信时,则将该节点标记为主观下线状态. 客观下线 当某个节点判断另一个节点主观下 ...

  6. Redis的持久化的两种方式drbd以及aof日志方式

    redis的持久化配置: 主要包括两种方式:1.快照  2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...

  7. [转帖]Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案

    Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案 https://www.cnblogs.com/xlecho/p/11834011.html echo编辑整理,欢迎转载,转 ...

  8. linux 双Redis + keepalived 主从复制+宕机自主切换

    主要核心思想,如果master 和 salve 全部存活的情况,VIP就漂移到 master.读写都从master操作,如果master宕机,VIP就会漂移到salve,并将之前的salve切换为ma ...

  9. 宕机了,Redis数据丢了怎么办?

    持续原创输出,点击上方蓝字关注我 目录 前言 什么是AOF? 三种写回策略 日志文件太大怎么办? AOF重写会阻塞主线程吗? AOF的缺点 总结 什么是RDB? 给哪些数据做快照? 快照时能够修改数据 ...

随机推荐

  1. 基于C语言文件操作的学生成绩管理系统

    原理 在一个班级学生成绩管理系统中,希望处理每个学生的学习情况信息,其中包括学生的学号.姓名.各科名称和成绩等并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找.浏览.插入.排 ...

  2. 保存数据到csv文件报错:Permission denied: './train_data.csv'

    如果你此前已经输出,创建了文件,很有可能是你打开了此文件,导致写入不进去报错,关掉文件重新运行程序即可!

  3. 【SQLite】教程05-SQLite创建数据库、附加、分离数据库

    创建数据库 .quit命令 退出sqlite 提示符 .quit .dump 命令 使用 SQLite .dump 点命令来导出完整的数据库在一个文本文件中,如下所示: sqlite3 Test.db ...

  4. Unicode编码转换, MD5加密,URL16进制加密解密

    一.站长网址:http://www.msxindl.com/ 1.Unicode与中文互转 16进制Unicode编码转换.还原   :http://www.msxindl.com/tools/uni ...

  5. PTA题目集总结

    PTA题目集1-3总结 一:前言 我认为题目集一的有八个题目,题量可能稍微有点多,但是题型较为简单,基本为入门题:题集二有五道题,题量适度,难度也适中:题集三虽然只有三道题,但是难度却骤然提升,前两题 ...

  6. [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架

    [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 目录 [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 0x00 摘要 0x01 架构图 ...

  7. 终于明白为什么要加 final 关键字了

    在开发过程中,由于习惯的原因,我们可能对某种编程语言的一些特性习以为常,特别是只用一种语言作为日常开发的情况.但是当你使用超过一种语言进行开发的时候就会发现,虽然都是高级语言,但是它们之间很多特性都是 ...

  8. Huawei USG6530防火墙

    CF卡:(Compact Flash)最初是一种用于便携式电子设备的数据存储设备.作为一种存储设备,它革命性的使用了闪存 与sd卡的区别:SD卡的优点是安全.体积小巧,价格较之CF卡相对比较低,适合用 ...

  9. Pandas高级教程之:处理缺失数据

    目录 简介 NaN的例子 整数类型的缺失值 Datetimes 类型的缺失值 None 和 np.nan 的转换 缺失值的计算 使用fillna填充NaN数据 使用dropna删除包含NA的数据 插值 ...

  10. .net core Redis消息队列中间件【InitQ】

    前言 这是一篇拖更很久的博客,不知不觉InitQ在nuget下载量已经过15K了,奈何胸无点墨也不晓得怎么写(懒),随便在github上挂了个md,现在好好唠唠如何在redis里使用队列 队列缓存分布 ...