系列文章目录
【深入理解使用Redis(初识)】
【深入理解使用Redis (Redis API的理解和使用)】
前言
Redis支持RDB和AOF俩种持久化机制,持久化能有效的避免数据丢失问题。同时在启动Redis的可利用之前的持久化文件实现数据恢复或者初始化。本文将全面讲解持久化,并分析介绍常用的场景和问题
一、持久化之RDB
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,RDB持久化可自动触发也可手动触发
1.触发机制
手动触发分别对应save和bgsave命令
- save 命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例阻塞实际较长,不建议线上环境使用
- bgsave 命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞时间短。因此一般采用bgsave命令
自动一般就是save的相关配置 比如 save m n m秒内数据集存在n次修改时,自动触发bgsave
全量复制操作,也会自动bgsave,执行shutdown命令时,如果没有开启AOF持久化功能也会自动执行bgsave
2.RDB文件的处理
- 保存:RDB文件保存在dir配置的指定的目录下,文件名通过dbfilename配置指定,可以通过执行config set dir {newDir} 和config set dbfilename {newfilename运行期动态执行,当下次运行时RDB文件会保存到新目录 }
- 压缩:Redis默认才有LZF算法对生成的RDB文件做压缩处理,压缩后的文件远远小于内存大小,默认开启
- 校验:如果Rdis加损坏的RDB文件时会拒绝启动
2.RDB优缺点
- 优点
a,RDB是紧凑压缩的二进制文件,是Redis在某个时间点的数据快照。非常适合用于备份,全量复制等场景。用于灾难恢复
b, Redis加载RDB恢复数据快于AOF的方式 - 缺点
a, RDB方式数据没办法做到实时持久化/秒级持久化。
b, RDB采用定制的二进制格式保存,存在老版本redis无法兼容新版本RDB格式的问题
二、持久化之AOF
AOF全称append only file ,是以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用时解决了数据持久化的实时性。目前也是Redis持久化的主流方式。
1.使用
开启AOF需要设置配置:appendonly yes, 默认是不开启的。AOF的文件名通过appendfilename配置设置,默认的文件名是appendonly.aof。保存路径同RDB持久化方式一致
AOF的操作流程如下:
1) 写入命令追加到aof_buf 缓冲区中
2) AOF缓冲区根据对应策列向硬盘做同步操作
2.1)同步策略:always 每次写入倒要同步AOF文件,不建议;everysec 默认配置,建议使用,no 同步操作交给操作系统,每次同步AOF的文件周期不可控,数据安全性无法保证
3)随着AOF的文件越来越大,要定期重写
3.1)重写时把Redis进程内的数据转化为写命令同步到新的AOF文件,这样会过滤掉超时数据的写命令,以及一些无效命令,并且之前的多条命令可以合并成一个。
3.2)重写手动触发:直接调用bgrewriteaof 命令,自动触发根据参数配置auto-aof-rewrite-min-size,表示重写时文件最小体积
4)Redis重启时,加载AOF文件数据恢复
三、问题定位与优化
- fork操作
- 当Redis做RDB或AOF重新的时候,必不可少的就是执行fork操作创建子进程,该操作耗时跟进程总内存相关,建议使用物理机,或者每个Redis实例的内存控制在10G以内。
- 子进程开销监控和优化,主要涉及的消耗是CPU,内存和硬盘。如果有问题可通过这三个角度分析问题
- CPU消耗优化:CPU不要是单核,不要和其他CPU密集型服务部署到一起,避免造成过度竞争,如果有多个redis实例,尽量保证同一时间只有一个子进程在执行重写工作
- 内存消耗优化:避免大量写入的时候做子进程重写操作
- 硬盘开销优化:避免高硬盘负载的服务部署在一起,AOF重写时不进行fsync操作
- AOF追加阻塞
AOF持久化同步策略常用的是everysec,对于这种方式,redis会使用另外一条线程每秒执行fsync同步硬盘。当系统硬盘资源繁忙时,就会造成阻塞。
总结
1)Redis提供俩种持久化方式:RDB和AOF
2) RDB 是一次性快照的方式,产生的文件紧凑,更有效,读取速度更快,当时开销比较大,无法实时持久化,常用于数据冷备和复制传输
3)AOF是追加命令到文件实时持久化。但是这样文件会逐渐变大,且命令冗余,需要定期执行重写操作来优化文件
4)多实例的情况下,注意避免CPU和IO资源竞争。
5)持久化注意阻塞场景