Redis中AOF数据持久化

news2024/10/5 14:20:36

AOF介绍

AOF(Append Only File)持久化:以独立日志的方式存储了 Redis 服务器的顺序指令序列,并只记录对内存进行修改的指令。
当Redis服务发生雪崩等故障时,可以重启服务并重新执行AOF文件中的指令达到恢复数据的目的。也就是说,通过重放(replay),来重新建立 Redis 当前实例的内存数据结构。这种模式有没有很熟悉,可以联想到MySQL主从同步时的relay log。
AOF的主要作用是解决了数据持久化的实时性,并且已经是Redis持久化的主流方式。

AOF实现日志记录

开启AOF日志记录

开启AOF日志记录:在redis.conf文件中,找到 APPEND ONLY MODE 设置

appendonly yes  # 默认不开启, 为 no

配置默认文件名:在redis.conf文件中设置

appendfilename “appendonly.aof”

 执行流程

流程如上图所示,我们解析如下:

1、将所有的写命令(set、hset)Append 到aof_buf缓冲区中

Redis 接收到 set keyName someValue 命令的时候,会先将数据写到内存,Redis 会按照如下格式写入 AOF 文件。

  1. *3:表示当前指令分为三个部分,每个部分都是 $ + 数字开头,后面是3部分的具体内容:指令、键、值。

  2. 数字:表示这部分的命令、键、值多占用的字节大小。比如 $3表示这部分包含 3 个字符,也就是 set 的长度。

2、AOF缓冲区根据策略向硬盘做sync同步

AOF为什么把命令append到aof_buf中,然后再进行同步?
这是因为Redis使用单进程响应命令,如果每次写AOF文件命令都直接持久化到硬盘,那么操作会是不是被间断,且性能完全取决于硬盘I/O负载。这个跟 MySQL 就没什么区别了。
先写入缓冲区aof_buf中,Redis可以提供多种缓冲区同步硬盘的策略,在性能、安全、数据可靠性方面做出平衡。

同步策略需关注以下几个配置:

 appendfsync 模式

appendfsync always  # 接受写命令后立即写入磁盘,强持久化但执行慢,不推荐appendfsync everysec # 每秒写入磁盘一次, 性能和持久化方面做了折中, 推荐appendfsync no  #  依赖操作系统自身同步的配置和策略,性能较佳,但是没法保证实时和完全持久化
no-appendfsync-on-rewrite
在 AOF 重写期间是否禁用 fsync。这可以提高重写性能,但可能会增加数据丢失的风险。
# 默认值:no# 可选值:yes 或 nono-appendfsync-on-rewrite yes

3、AOF文件Rewrite实现压缩 

 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩减负的目的,避免AOF文件过大导致性能和数据可靠性问题。
重写后的AOF文件变小的原因主要有以下几点:
3.1、进程内已超时的数据不再写入:在重写过程中,Redis不会将已经超时的数据写入新的AOF文件,这有助于减少不必要的数据记录。
3.2、删除无效命令:旧的AOF文件中可能包含无效的命令,如del key1hdel key2srem keysset a111等。重写过程会识别并删除这些无效命令,只保留最终数据的写入命令,从而减小了文件大小。
3.3、合并多条写命令:为了进一步优化AOF文件的大小,重写过程会将多条写命令合并为一个。例如,lpush list alpush list blpush list c可以合并为lpush list a b c。这种合并减少了命令的数量,进而减小了AOF文件的大小。
3.4、防止单条命令过大:对于某些操作类型(如list、set、hash、zset),为了防止单条命令过大造成客户端缓冲区溢出,重写过程会以64个元素为界拆分多条命令。虽然这在一定程度上可能增加了命令的数量,但它确保了每条命令的大小都在可控范围内,有助于维持整体文件大小的合理性。
总之AOF重写降低了文件占用空间,同时提升加载性能,因为更小的AOF 文件可以更快地被Redis加载。

AOF重写关注以下配置:
(1)、auto-aof-rewrite-percentage
触发 AOF 重写的增长百分比。例如,如果当前 AOF 文件大小是 100MB,并且这个值设置为 100,那么当 AOF 文件增长到 200MB 时,说明增长了100%,Redis 会尝试重写 AOF。

# 默认值:`100``auto-aof-rewrite-percentage 100`

(2)、auto-aof-rewrite-min-size

AOF 文件的最小大小,以便触发重写。即使 AOF 文件的增长百分比超过了 auto-aof-rewrite-percentage 设置的值,但如果文件大小小于这个值,Redis 也不会触发重写。​​​​​​​

# 默认值:`64mb`auto-aof-rewrite-min-size 64mb

4、故障重启时的数据恢复 

当Redis服务器重启时,可以加载AOF文件进行数据恢复。

流程如下:

  1. 当AOF和RDB文件同时存在时,优先加载AOF

  2. 若关闭了AOF(apendonly no),则加载RDB文件

  3. 加载AOF/RDB成功之后,redis重启成功。如果无相关的持久化,则直接启动成功。

  4. 如果AOF/RDB 数据恢复存在错误,则启动失败,并打印输出错误信息

RDB和AOF的比较和混合持久化 

现实情况下,无论使用RDB或者AOF都差点意思。使用 rdb 来恢复内存状态,势必会丢失一部分数据。使用 AOF 日志重放,重放对性能有一定的影响,而且在 Redis 实例很大的情况下,需要花费很长的时间。
Redis 4.0 解决了这个问题,才用了一个新的持久化模式——混合持久化,该混合模式默认是关闭状态的。
将 RDB 文件的内容和 rdb快照时间点之后的增量的 AOF 日志文件存在一起。这时候 AOF 日志不需要再是全量的日志,而是最近一次快照时间点之后到当下发生的增量 AOF 日志,通常这部分 AOF 日志很小。
所以执行有如下顺序:

  • 查找rdb内容,如果存在先加载 rdb内容再 重放剩余的 aof。

  • 没有rdb内容,直接以aof格式重放整个文件。
    这样快照就不用频繁的执行,同时由于 AOF 只需要记录最近一次快照之后的数据,不需要记录所有的操作,避免了出现单次重放文件过大的问题。

开启混合持久化模式:

aof-use-rdb-preamble yes

这个设置告诉Redis在AOF重写时使用混合持久化模式。当这个选项设置为yes时,重写后的AOF文件将包含RDB格式的数据前缀和AOF格式的增量修改操作。

总结

  • RDB提供了快照模式,记录某个时间的Redis内存状态。RDB设计了 bgsave 和写时复制,尽可能避免执行快照期间对读写指令的影响,但是频繁快照会给磁盘带来压力以及 fork 阻塞主线程。需把握频率。

  • AOF 日志存储了 Redis 服务的顺序指令序列,通过重放(replay)指令来写入日志文件,并通过写回策略来避免高频读写给Redis带来压力。

  • RDB快照的照片时间间隔,必然会带来数据缺失,如果允许分钟级别的数据丢失,可以只使用 RDB。

  • 如果只用 AOF,写回策略优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡。

  • 数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows系统中安装docker及镜像加速的配置

文章目录 一.安装wsl二.下载docker desktop三.更换Docker镜像引用出处 一.安装wsl 在安装wsl之前,先在Windows中配置WSL环境,步骤很简单,按照以下文章进行 Windows10/11配置WSL(Ubuntu)环境 以管理员身份打开Windows PowerShell,执行以下命…

怎样将PPT转成文本格式?PPT文本一键生成文本格式 工作经验分享

在日常工作和学习中,我们经常需要将PPT文件转换为文本格式,以便更好地进行编辑、搜索和分享。下面,我将介绍2种常见的PPT转文本格式的方法,帮助大家轻松实现这一需求。 方法一、使用汇帮PDF转换器软件里的“PPT文件操作”菜单进行…

Linux面试题汇总!附答案详解!学习提升必备!(30w+收藏)

Linux 概述 什么是Linux Unix和Linux有什么区别? 什么是 Linux 内核? Linux的基本组件是什么? Linux 的体系结构 BASH和DOS之间的基本区别是什么? Linux 开机启动过程? Linux系统缺省的运行级别? L…

Python docx学习笔记

个人学习笔记。 1 工具介绍 python-docx 是用于创建可修改 微软 Word 的一个 python 库,提供全套的 Word 操作,是最常用的 Word 工具。 1.1 基本概念 Document:是一个 Word 文档 对象,不同于 VBA 中 Worksheet 的概念&#xf…

带你搞清楚strtok函数和strerror函数的使用!

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

Linux 多进程开发(上)

第二章 Linux 多进程开发 2.1 进程概述2.2 进程状态转换2.3 进程创建2.4 exec 函数族2.5 进程控制 网络编程系列文章: 第1章 Linux系统编程入门(上) 第1章 Linux系统编程入门(下) 第2章 Linux多进程开发(…

python 基础知识点(蓝桥杯python科目个人复习计划62)

今日复习内容:做题 例题1:付账问题 问题描述: 几个人一起出去吃饭是常有的事,但在结账的时候,常常会出现一些争执。 现在有n个人出去吃饭,他们总共消费了S元,其中第i人带了ai元。幸运的是&a…

关于仅销售预包装食品的食品经营者备案有关事项的通知

江北新区、各区市场监督管理局、行政审批局: 为贯彻落实《中华人民共和国食品安全法》第三十五条规定和国务院《关于深化“证照分离”改革进一步激发食品安全发展活力的通知》精神《市场主体》(国发[2021]7号),现将仅销售预包装食…

ModuleNotFoundError: No module named ‘serial.tools‘

解决以上报错的方法: 1、大家在使用以下代码时: port_list list(serial.tools.list_ports.comports()) 会出现报错: ModuleNotFoundError: No module named serial.tools; serial is not a package 这个时候我们应该先安装serial 然…

Codeforces Round 933 (Div. 3)C:Rudolf and the Ugly String

题目链接:Dashboard - Codeforces Round 933 (Div. 3) - Codeforces 解题思路: 解题思路: 题目大概意思是字符串中最少去掉几个单词可以使字符串变漂亮,其实只要找“map"和”pie“这两个单词数量,注意判断&quo…

19、deque赋值操作

#include <iostream> using namespace std; #include <deque>void printdeque (const deque<int>& d) {for (deque<int>::const_iterator it d.begin(); it ! d.end(); it ){//*it 100 容器中的数据不可修改cout << *it << " &…

CAN一致性测试:物理层测试之位时间测试

从本周开始结合工作实践&#xff0c;给大家总结CAN一致性相关的测试 包括&#xff1a;物理层、数据链路层、应用层三大块知识点 CAN一致性测试:物理层测试之位时间测试 试验目的&#xff1a;测试控制器输出的差分电平位信号的特征。 试验依据&#xff1a;GMW3122&#xff0…

C++第二弹---C++入门(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 C入门 1、函数重载 1.1、函数重载概念 1.2、C支持函数重载的原理--名字修饰(name Mangling) 3、引用 3.1、引用概念 3.2、引用特性 3.3、常引用 …

图片和PDF 加水印去水印

图片和PDF 加水印去水印 前要1. 图片加水印1.1 方法11.2 方法2 2. 去水印3. pdf加水印4. pdf 去水印 前要 网上查了很多资料, 汇总了几个不错的代码, 顺便做个笔记 1. 图片加水印 1.1 方法1 简单方便, 后也好处理 # -*- coding:utf-8 -*- import os from PIL import Imag…

蓝桥杯练习系统(算法训练)ALGO-975 P0802字符串表达式

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个字符串表达式求解函数int expression(char* s); 输入一个字符串表达式&#xff0c;返回它的结果。表达式长度不会超过100。表…

基于springboot+vue的汽车改装方案网站(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 对于当今社会发展趋势越来越迅猛&#xff0c;传统汽车改装模式的没落,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变&#xff0c;人们的娱乐方式不仅仅再是读书看报。由于近些…

【基于HTML5的网页设计及应用】——判断是否为闰年

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Linux运维之管理工具篇

一、前言 因运维过程中&#xff0c;经常会借助于很多工具来实现我们的监控、备份、校验&#xff0c;安全测试&#xff0c;批量操作&#xff0c;可视化辅助&#xff0c;集中管理等&#xff0c;甚至AI相关&#xff0c;本文特对常用工具进行梳理记录&#xff0c;以备不时之需及后…

【Consul】注册Consul服务时报错404

【Consul】注册Consul服务时报错404 大家好 我是寸铁&#x1f44a; 总结了一篇golang注册Consul服务时报错404✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 今天寸铁想注册一个服务到Consul服务中心&#xff0c;却发现报错了&#xff0c;错误码是404&#xff0c;下面和…

精通 Python 装饰器:代码复用与功能增强技巧

精通 Python 装饰器&#xff1a;代码复用与功能增强技巧 引言装饰器基础装饰器的定义基本装饰器的实现方法理解 符号的用法简单装饰器示例代码 使用装饰器增强函数功能日志记录性能测试事务处理小结 装饰器进阶应用管理用户认证缓存机制的实现参数化装饰器的创建和应用多个装饰…