解决Redis数据丢失难题:深入理解RDB与AOF持久化机制

前篇我们了解了Redis的一些基础使用,回忆一下,Redis是一个基于键值对的NoSQL数据库,所有数据都存储在内存中,所以它的读写性能非常快。但是存储在内存中的数据在服务器重启或断电情况下数据都会丢失,持久化正是为解决此问题而生,该过程将内存的数据利用快照和日志的形式保存到硬盘上,下面我们将了解RDB持久化过程:

一、RDB

1.1、RDB持久化

RDB(Redis DataBase)持久化将当前进程数据生成快照保存到硬盘的过程 ,触发RDB持久化的过程分为手动触发自动触发

快照:将Redis服务器进程的内存中此时此刻存在的所有键值对数据,像拍照的形式存储下来。类似于警方调查一个现场,拍照片记录现场情况,并试图还原案发过程

1.2、RDB手动触发

1.2.1、save命令

该命令会阻塞当前Redis服务器,直到RDB'持久化'过程完成为止,对于数据量庞大的内容,该过程会长时间的阻塞Redis服务器

向Redis中插入两条数据,并执行save命令

1.2.2、bgsave命令

Redis进程执行fork操作创建子进程,RDB持久化由子进程完成

工作流程

执行bgsave命令,会先判断是否有其他进程在执行 fork ,没有的话,父进程会调用fork()系统调用(阻塞性操作,但速度非常短暂,微秒级别),然后就clone 一个子进程,子进程就会遍历内存中所有数据库和键值对,按照RDB文件格式,将其序列化,压缩并写入一个临时RDB文件(二进制) ,完成后对原有文件进行原子替换,最后进程发送信号给父进程表示完成。在此过程中父进程会继续响应其他命令

删除后再次插入两个键值对:

插入键值对:

因为刚插入不一定立即生效,需要满足手动或自动触发后才会写入rdb 文件中,执行bgsave:

1.3、RDB自动触发

1.3.1、save配置

进入配置文件:

1.3.2、主从复制全量同步时(目前未知)
1.3.3、执行shutdown时

如果开启了 RDB 持久化,在关闭服务器时会自动执行一次save (阻塞式),保证数据不丢失

对Redis服务进行关闭后,立即查看dump.rdb文件可以看到,数据已被持久化写入RDB文件中

二、AOF

2.1、AOF的持久化

AOF(Append Only File)持久化通过记录每次写操作命令来实现数据持久化,它以独立日志的形式存储所有写命令,服务重启时通过重新执行这些命令来恢复数据。有效解决了数据持久化的实时性问题

2.2、AOF的使用

2.2.1、开启AOF

打开Linux系统,进入Redis配置文件

输入/appendon等,匹配到下图关键词

更改保存后,重启Redis服务即可

注意:开启AOF后,RDB就不生效了,启动的时候不再读取RBD文件内容,而是读取上图aof文件内容进行数据的恢复。

2.2.2、AOF工作流程

AOF机制致使我们写入一个命令,其就更新一下,又要写内存,又要写硬盘,难道不会影响Redis的速度嘛?我们来看一下AOF机制的工作流程:

实际上,AOF机制并未让工作线程把数据写入硬盘,而是先写入内存中的一个缓冲区,积累一部分数据后再根据对应策略向硬盘进行同步操作(减少IO次数,提高性能)

2.2.3、缓冲区刷新策略

Redis提供了多种AOF缓冲区同步文件策略:

fsync策略:针对单个文件操作,它会强制将数据同步到硬盘。fsync调用会阻塞进程,直到数据被完全写入硬盘

write策略:该操作会触发延迟写(delayed write)机制(延迟写(Delayed Write)是一种文件系统或数据库管理中的优化技术,将数据写入操作暂时缓存在内存中,而非立即同步到磁盘)

通俗来说,always 是读入一个命令,立马写到硬盘;everysec 是每一秒写入一次硬盘;no是由操作系统自行决定

2.3、重写机制

场景:AOF文件会记录所有的命令操作,随着我们不断使用Redis 各种命令,aof 文件也会越来越大,会影响我们启动Redis 的速度,更可恶的是,其中还有很多冗余的操作,比如插入某个key ,后来删除、更改keyvalue ......,因此Redis 就存在重写机制,对aof文件内容进行整理,剔除或者合并其中的冗余内容!

2.3.1、手动触发

和RDB持久化过程类似,手动触发是调用 bgrewriteaof命令完成

工作流程

(1)父进程执行fork()操作创建一个子进程 (2),(3.1)父进程继续负责接收请求 ,(4)创建出来的子进程会获取父进程当前的内存数据以AOF格式写入一个新的AOF文件中,但写入的过程中,父进程新进行的操作子进程是获取不到的 ,(3.2)父进程会把新的操作命令写入aof_rewirte_buf 内存缓冲区中 ,(5.1)等子进程把创建时内存的数据写完并通知父进程后, (5.2)父进程再把aof_rewirte_buf 内存缓冲区的数据写入新的AOF文件 ,(5.3)最后替换原来的AOF文件

2.3.2、自动触发

自动触发AOF重写的时机由以下两个参数决定:

auto-aof-rewrite-min-size:设置触发重写时的最小AOF文件大小,默认值为64MB

auto-aof-rewrite-percentage:表示当前AOF文件大小相比上次重写时的增长比例

相关推荐
Blossom i2 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
雾时之林3 小时前
Linux--软件管理、源码包安装
linux·服务器·数据库
thesky1234563 小时前
智能体面试准备(二十六):Agent 成本工程——模型路由、缓存、预算控制与大小模型分工
缓存·llmops·智能体·模型路由·成本工程·预算控制·小模型分工
老纪的技术唠嗑局4 小时前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
CLOUD ACE5 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
AI大模型-小雄5 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex
少晓年5 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql
SelectDB6 小时前
Apache Doris AI RAG 实战:从基础 RAG 到知识图谱增强的技术能力与选型
数据库
SelectDB6 小时前
电商企业 PostgreSQL 迁移 Apache Doris:80TB 分析数据统一平台技术能力与实践
数据库
SelectDB6 小时前
阶跃星辰 Agent 可观测:Apache Doris / SelectDB 的技术能力与实践
数据库