Redis持久化,Redis持久化是如何完成,如何使用Redis持久化,RDB快照式和AOF日志式两种持久化方式

发布于:2023-01-04 ⋅ 阅读:(276) ⋅ 点赞:(0)

目录

一、redis的简单介绍

二、redis持久化

1.RDB快照式存储

1.1 如何使用RDB持久化

1.2 bgsave的持久化流程

1.3 RDB文件处理相关

1.4 RDB的优缺点

2.AOF日志式存储

2.1 如何使用AOF持久化

2.2 AOF的工作流程

2.3 AOF命令写入相关

2.4 AOF文件同步策略(缓冲区同步硬盘)

2.5 AOF重写机制

2.6 AOF重启加载

2.7 文件校验

补充

1.info Persistence统计信息相关

2.LZF算法对生成的RDB文件做压缩处理


一、redis的简单介绍

Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、 hash(哈希)、list(列表)、set(集合)、zset(有序集合)、 Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景,而且因为Redis会 将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样 在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。

这次我们来看一下redis的持久化存储

二、redis持久化

Redis支持RDB和AOF两种持久化机制,Redis的持久化功能有效避免因进程退出造成的数据丢失问题,通过持久化文件进行数据的恢复;

1.RDB快照式存储

1.1 如何使用RDB持久化

  •   手动触发:save和bgsave命令

1)save命令:执行该命令时redis服务器阻塞,直到RDB过程完成,阻塞时间很长

2)bgsave命令:save命令的优化,执行fork操作创建子线程,RDB过程交给子进程执行,阻塞只发生在fork阶段,阻塞时间很短

Redis内部所有 的涉及RDB的操作都采用bgsave的方式

  •   自动触发:

1)配置redis.conf文件  save m n   m秒内数据有n次修改 就会自动触发bgsave

2)节点执行全量复制操作,主节点自动执行bgsave生成 RDB文件并发送给从节点

3)执行debug reload命令重新加载Redis时,也会自动触发save操 作

4)执行shutdown命令时,如果没有开启AOF持久化功 能则自动执行bgsave

1.2 bgsave的持久化流程

1)执行bgsave命令,父进程判断当前是否存在正在执行的子 进程,如RDB/AOF子进程,如果存在bgsave命令直接返回

2)执行fork操作创建子进程,fork操作过程中父进程会阻塞

3)fork完成后,bgsave命令返回“Background saving started”父进程不再阻塞,继续响应其他命令

4)子进程创建RDB文件,根据父进程内存生成临时快照文件,对原有文件进行原子替换

5)子进程发送信号给父进程表示完成,父进程更新统计信息

1.3 RDB文件处理相关

RDB文件保存:

通过修改redis.conf配置文件

dir 配置项指定保存目录

dbfilename 配置项指定文件名

坏盘或磁盘写满等情况,可以通过config set dir{newDir} 动态在线修改文件路径,config set dbfilename{newFileName}运行期动态执行指定文件名,当下次运行时RDB文件会保存到新目录

RDB文件压缩:

采用LZF算法对生成的RDB文件做压缩处理,默认开启,压缩后的文件远远小于内存大小

可以通过参数config set rdbcompression{yes|no}动态修改

压缩RDB会消耗CPU,但可以大幅降低文件的体积,建议开启

数据恢复常见运维问题:

如果Redis加载损坏的RDB文件时拒绝启动,并打印日志

# Short read or OOM loading DB. Unrecoverable error, aborting now.

这时可以使用Redis提供的redis-check-dump工具检测RDB文件并获取对应的错误报告

1.4 RDB的优缺点

优点:

  • 文件体积小:紧凑压缩的二进制文件,适合全量复制和备份
  • 数据恢复快:RDB恢复数据远远快于AOF

缺点:

  • 实时性:不能做到实时持久化/秒级持久化,每次运行都要执行fork操作创建子进程
  • 兼容性:存在老版本Redis服务无法兼容新版RDB格式的问题
  • 安全性:可能存在信息丢失的问题,数据安全性差

2.AOF日志式存储

以独立日志的方式记录每次信息修改操作,通过执行AOF文件中的命令达到恢复数据的目的。

主要特点是保证数据的安全性和持久化的实时性

2.1 如何使用AOF持久化

redis.conf配置文件 常用配置项:

appendonly yes  AOF功能开关 默认不开启

appendfilename 指定生产的持久化文件名

dir 配置文件保存路径 (同RDB方式一样)

appendfsync  always|everysec|no 文件同步策略(默认everysec下面有详细介绍)

auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage 文件重写触发时机(下面详细介绍)

2.2 AOF的工作流程

AOF的工作流程主要有以下几步:命令写入、文件同步、文件重写、重启加载

1)修改信息的命令会追加到缓冲区(aof_buf)

2)AOF缓冲区根据对应的策略向硬盘同步写入文件

3)定期对AOF文件进行重写,达到压缩文件的目的

4)redis服务重启会重新加载AOF文件,起到redis内存数据恢复的作用

下面我们对命令写入、文件同步、重写机制和重启加载这四个重要流程进行详细的讲解

2.3 AOF命令写入相关

1)AOF命令写入的内容直接是Redis文本协议格式

        采用文本协议的优点:

  • 文本协议具有很好的兼容性
  • 开启AOF后,所有写入命令都包含追加操作,直接采用协议格 式,避免了二次处理开销
  • 可读性好,方便直接修改和处理

2)AOF修改命令先追加到aof_buf缓冲区

Redis是单线程响应命令,如果每次命令都直接追加到硬盘,硬盘负载压力大,性能低

Redis提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡

2.4 AOF文件同步策略(缓冲区同步硬盘)

先介绍两种系统操作write、fsync

1)write操作会触发延迟写(delayed write)机制,Linux在内核提供页 缓冲区用来提高硬盘IO性能。write操作在写入系统缓冲区后直接返回。 同步硬盘操作依赖于系统调度机制,例如:缓冲区页空间写满或达到特 定时间周期。同步文件之前,如果此时系统故障宕机,缓冲区内数据将 丢失。

2)fsync针对单个文件操作(比如AOF文件),做强制硬盘同步, fsync将阻塞直到写入硬盘完成后返回,保证了数据持久化。

我们可以通过redis.conf文件配置AOF缓冲区同步文件策略

appendfsync  always|everysec|no

  • always:

工作机制:写入到aof_buf缓冲区,系统调用fsync操作,同步到AOF文件,完成后线程返回;

性能:每次写入都要同步AOF文件,Redis一般只能支持大约几百TPS写入可能导致redis性能降低,不建议配置;

  • everysec(默认配置):

工作机制:写入到aof_buf缓冲区,系统调用write操作,完成后线程返回,fsync操作由单独线程控制每秒调用一次;

性能:兼顾性 能和数据安全性,理论上只有在系统突然宕机的情况下丢失1秒的数据;

  • no:

工作机制:写入到aof_buf缓冲区,系统调用write操作,不对AOF文件做fsync同步,同步硬盘操作由操作系统负责,同步周期最长30秒;

性能:操作系统每次同步AOF文件的周期不可控,可能会加大每次同步硬盘的数据量,性能提升,数据安全性无法保证;

2.5 AOF重写机制

随着命令不断写入AOF,文件会越来越大,Redis引入了AOF重写机制压缩文件体积,当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩。

AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程。

Redis 会fork出一条新进程,读取内存中的数据,并重新写到一个临时文件中,最后替换旧的aof文件;并不是读取的旧文件。

作用:

  • AOF重写降低了文件占用空间
  • 更小的AOF文件可以更快地被Redis加载提高数据恢复效率

重写后的AOF文件变小的原因:

1.进程内已经超时的数据不再写文件

2.旧的AOF文件含有无效命令,如del key1、set a 111、set a 222等。重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令

3.多条写命令可以合并为一个,如lpush list a、lpush list b、 lpush list c 可以转化为:lpush list a b c;为了防止单条命令过大造成客户 端缓冲区溢出,对于list、set、hash、zset等类型操作,以64个元素为界 拆分为多条。

触发机制:

  • 手动触发:

直接调用bgrewriteaof命令

  • 自动触发:

auto-aof-rewrite-min-size   表示运行AOF重写时文件最小体积, 默认为64MB

auto-aof-rewrite-percentage   代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的 比值

auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机

自动触发时机=aof_current_size>auto-aof-rewrite-min-size&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewrite-percentage

aof_current_size和aof_base_size可以在info Persistence统计信息中查看

AOF重写的运行流程:

1)执行AOF重写请求:

  • 如果当前进程正在执行AOF重写,请求不执行并返回如下响应:ERR Background append only file rewriting already in progress
  • 如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成之 后再执行,返回如下响应:Background append only file rewriting scheduled

2)父进程执行fork创建子进程

3)AOF缓冲区和AOF重写缓冲区

  • 3.1:父进程fork操作完成后,继续响应其他命令。所有修改命令依然写入AOF缓冲区并根据文件同步策略同步到硬盘,保证原有AOF机制正确性
  • 3.2:由于fork操作运用写时复制技术,子进程只能共享fork操作时 的内存数据。由于父进程依然响应命令,Redis使用“AOF重写缓冲区”保存这部分新数据,防止新AOF文件生成期间丢失这部分数据

4)子进程根据内存快照,按照命令合并规则写入到新的AOF文件。每次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync 控制, 默认为32MB,防止单次刷盘数据过多造成硬盘阻塞

5)

  • 5.1:新AOF文件写入完成后,子进程发送信号给父进程,父进程 更新统计信息:info persistence下的aof_*相关统计
  • 5.2:父进程把AOF重写缓冲区的数据写入到新的AOF文件
  • 5.3:使用新AOF文件替换老文件,完成AOF重写

2.6 AOF重启加载

AOF和RDB文件都可以用于服务器重启时的数据恢复

Redis持久化文件加载流程:

 从流程图我们可以看出,AOF持久化优先加载,在AOF关闭或者AOF文件不存在时才会去加载通过RDB方式持久化的文件,具体流程分析如下:

1)AOF持久化开启且存在AOF文件时,优先加载AOF文件

日志输出:DB loaded from append only file: 5.841 seconds

2)AOF关闭或者AOF文件不存在时,加载RDB文件

日志输出:DB loaded from disk: 5.586 seconds

3)加载AOF/RDB文件成功后,Redis启动成功

4)AOF/RDB文件存在错误时,Redis启动失败并打印错误信息

2.7 文件校验

加载损坏的AOF文件时会拒绝启动,并打印如下日志:

Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix

处理方法:

1)备份错误格式的AOF文件

2)采用redis-check-aof-- fix命令进行修复

3)修复后使用diff-u对比数据的差异,找出丢失的数据人工修改补全

常见问题:AOF文件可能存在结尾不完整的情况,服务器断电导致AOF尾部文件命令写入不全,Redis默认开启aof-load-truncated 配置可以兼容这种情况。加载AOF时忽略此问题并继续启动,同时打印如下警告日志:

# !!! Warning: short read while loading the AOF file !!! # !!! Truncating the AOF at offset 397856725 !!! # AOF loaded anyway because aof-load-truncated is enabled

补充

1.info Persistence统计信息相关

http://t.csdn.cn/AFK04

2.LZF算法对生成的RDB文件做压缩处理

http://t.csdn.cn/11idJ


网站公告

今日签到

点亮在社区的每一天
去签到