接下来两篇将记录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. Python小白的数学建模课-06 固定费用问题

    Python 实例介绍固定费用问题的建模与求解. 学习 PuLP工具包中处理复杂问题的快捷使用方式. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达人. 前文讲到几种典型 ...

  2. 一、Nginx的安装

    1.下载nginx软件 http://nginx.org/download/ 2.安装依赖包 [root@client ~]# useradd -s /sbin/nologin nginx 创建ngi ...

  3. 【NX二次开发】Block UI RGB颜色选择器

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  4. 管理后台Vue

    管理后台 遇到的问题 搭建 基于vue 3.0 Vue CLI 4.x Ant Design Vue 2.0 搭建后台管理系统 Ant Design Vue 2.0 npm i --save ant- ...

  5. Python进程和线程实例详解

    前言 进程是什么? 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需 ...

  6. 性能工具之linux三剑客awk、grep、sed详解

    前言 linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, he ...

  7. [INS-32033] Central Inventory location is not writable

    这个是因为之前安装过一次图形界面,已经创建过Inventory,所以会报错. 解决:删除oraInventory这个目录.

  8. Linux常见信号介绍

    1.信号 首先信号我们要和信号量区分开来,虽然两者都是操作系统进程通信的方式.可以简单的理解,信号是用来通知进程发生了什么需要做什么,信号量一般是用作进程同步(pv操作) 2.常见信号量 (以下数字标 ...

  9. Web端在线实时聊天,基于WebSocket(前后端分离)

    这是一个简易的Demo,已经实现了基础的功能 之前一直想实现一个实时聊天的系统,一直没有去实践他.有一天吃饭的时候扫码点菜,几个人点菜能够实时更新,当时就在想,这应该是同一种技术. 刚好前段时间项目上 ...

  10. Kubernetes将弃用docker?

    1.前言 近日,Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时.并在1.23后不再支持dock ...