Redis持久化

目录

一、Redis的持久化介绍

二、RDB

2.1手动触发

2.1.1 save

2.1.2 bgsave

2.1.3 对比

2.2 自动触发

2.3 流程说明

2.4 RDB文件的处理

2.4.1 保存

2.4.2 压缩

2.4.3 校验

2.5 RDB的优缺点

三、AOF

3.1 使用AOF

3.2 AOF工作流程

3.2.1 命令写入

3.2.2  文件同步

3.2.3 重写机制

3.2.4 重启加载

一、Redis的持久化介绍

Redis支持RDB 和 AOF两种持久化机制,持久化功能有效的避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

二、RDB

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发

2.1手动触发

2.1.1 save

阻塞当前Redis服务器,直到RDB过程完成为止,对内存比较大的实例会造成长时间的阻塞

2.1.2 bgsave

Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,时间很短

2.1.3 对比

显然bgsave命令是针对save阻塞问题做的优化,因此Redis内部所有涉及RDB的操作都采用bgsave的方式

2.2 自动触发

1.使用save相关配置,如:save m n 。表示m秒内数据集存在n次修改时自动触发bgsave

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

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

4.默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave

2.3 流程说明

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

2.父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,父进程fork完成后bgsave命令返回"Background saving started"信息并不在阻塞父进程

3.子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行替换。

4.子进程发送信号给父进程表示完成,父进程更新统计数据

2.4 RDB文件的处理

2.4.1 保存

RDB文件保存在dir配置制定的目录下,文件名通过dbfilename配置制定。可以通过执行config set dir {newDir} 和 config set dbfilename {newFileName} 运行期动态执行,当下次运行时RDB文件会保存到新目录。

2.4.2 压缩

Redis默认采用LZF算法对生成的RDB文件做压缩处理,默认开启,可以通过 config set rdbcompression{yes|no}动态修改

2.4.3 校验

如果Redis加载损坏的RDB文件时拒绝启动,可以使用Redis提供的redis-check-dump工具检测RDB文件并获取对应的错误报告

2.5 RDB的优缺点

优点:

1.RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照,比如每6小时执行bgsave备份,并把RDB文件拷贝到远程机器或者文件系统中

2.Redis加载RDB恢复数据远远快于AOF

缺点:

1.RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高

2.RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题

三、AOF

AOF持久化:以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性。

3.1 使用AOF

开启AOF功能需要设置配置:appendonly yes,默认是不开启

AOF文件名通过appendfilename 配置设置,默认文件名是appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置制定

3.2 AOF工作流程

命令写入→文件同步→文件重写→重启加载

1).所有的写入命令会追加从到aof_buf(AOF缓冲区)中

2).AOF缓冲区根据对应的策略向硬盘做同步操作

3).随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的

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

3.2.1 命令写入

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

1.AOF为什么直接采用文本协议格式?

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

2.AOF为什么把命令追加到aof_buf中?

Redis使用单线程响应命令,如果每次写AOF文件命令都直接追加到硬盘,那么性能完全取决与当前硬盘负载。先写入缓存区,redis可以提供多种缓存区同步硬盘的策略,在性能和安全方面做出平衡

3.2.2  文件同步

Redis提供了多种AOF缓存区同步文件策略,由参数appendfsync控制

  • always:命令写入缓存区后调用系统fsync操作同步到AOF文件,fsync完成后线程返回
  • everysec:命令写入缓存区后调用系统write操作,write完成后线程返回。fsync同步文件操作由专门线程每秒调用一次(系统推荐最优配置)
  • no:命令写入缓存区后调用系统write操作,不对AOF文件做fsync同步,同步硬盘操作由操作系统负责,通常同步周期最长30秒

3.2.3 重写机制

随着命令不断写入AOF,文件会越来越大,Redis引入AOF重写机制压缩文件体积,AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程

重写后AOF文件为什么变小?

  • 进程内已经超时的数据不再写入文件
  • 旧的AOF文件含有无效命令,如如del,hdel等,重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令
  • 多条命令可以合并为一个,如lpush list a、 lpush list b 可以转化为lpush list a b c。

AOF重写降低了文件占用空间,可以更快的被Redis加载

AOF重写过程可以手动触发和自动触发:

手动触发:直接调用bgrewriteaof命令

自动触发:根据auto-aof-rewrite-size(表示运行AOF重写时文件最小体积,默认64MB)和auto0aof-rewrite-percentage(代表当前AOF文件空间和上一次重写后AOF文件空间的比值)参数确定自动触发时机

重写流程:

  1. 执行AOF重写请求,如果当前进程正在执行AOF重写,请求不执行;如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成后执行。
  2. 父进程执行fork创建子进程,开销等同于bgsave过程
  3. 主进程fork完成后继续响应其他命令,所有修改命令依然写入AOF缓冲区并根据appendfsync策略同步到硬盘,保证与哪有AOF机制正确性
  4. 由于fork操作运用写时复制技术,子进程只能贡献fork操作时的内存数据。由于父进程依然响应命令,Redis使用“AOF重写缓存区”保存这部分新数据,防止新AOF文件生成期间丢失这部分数据
  5. 子进程根据内存快照按照命令合并规则写入到新的AOF文件。每次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync控制,默认32MB,防止单次刷盘数据过多造成硬盘阻塞。
  6. 新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息
  7. 父进程把AOF重写缓存区的数据写入到新的AOF文件
  8. 使用新AOF文件替换老文件,完成AOF重写

3.2.4 重启加载

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

  1. AOF持久化开启且存在AOF文件时,优先加载AOF文件
  2. AOF关闭或者AOF文件不存在时,加载RDB文件
  3. 加载AOF/RDB文件成功后,Redis启动成功
  4. AOF/RDB文件存在错误时,Redis启动失败并打印错误信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值