redis 持久化RDB和 AOF 简述
文章目录
RDB
Redis DateBase
内存快照RDB: 把当前进程的数据生成快照保存到本地磁盘的过程
(全部数据,相当于全表扫描)
**适用于全表复制,备份 **
命名
save阻塞当前Redis服务,直到RDB过程完成为止,对于内存比较大的实例,效率低。不推荐使用。
bgsaveRedis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束,阻赛之出现在fork阶段。时间很短
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ur4oQhKT-1649671568068)(redis 持久化RDB和 AOF 简述.assets/image-20220411130425062.png)]
自动触发
- redis.conf中配置save…
- 主从复制时,从节点进行全量复制时也会触发bgsave,生成当时的快照发送到从节点
- 执行debug reload 命令重新加载redis时
- 默认执行 shutdown命令,没开启AOF 时,触发bgsave
redis.conf
# 900秒内 1个key 变化,进行快照
save 900 1
# 300秒内 10个key 变化,进行快照
save 300 10
# 关闭快照
save ""
配置项 | 说明 |
---|---|
dbfilename | RDB文件的名称 |
dir | rdb 文件储存路径 |
stop-wrifes-on-bgsave-error | 持久化出错,是否停止写入 yes/no |
rdbcompression | 字符串写入磁盘时,是否启用LZF压缩算法 yes/no |
rdbchecksum | 导入检查 牺牲10% 作用的性能提高RDB文件的完整性 |
AOF
写后日志,执行完成的命令做记录。
命令可正常执行,记录在每次操作之后,非阻塞
配置项 | 回写时机 | 有点 | 缺点 |
---|---|---|---|
Always | 同步写回 | 可靠性高,每条数据都做记录 | 磁盘开销大,影响性能 |
Everysec | 每秒写回 | 性能适中 | 宕机时丢失1秒内数据 |
No | 操作系统控制写回 | 性能好 | 不可控,宕机丢失数据较多 |
redis.conf配置
配置项 | 说明 |
---|---|
appendonly | 开启AOF 持久化 |
appendfilename | 持久化文件名称 |
dir | 文件存放路径 |
appendfsync | 同步策略 always、everysec、no |
no-appendfsync-on-rewrite | aof重写期间是否同步 |
auto-aof-rewrite-percentage | 重写触发 倍率 例如上次重写完 1MB,这次就是2MB重写 |
auto-aof-rewrite-min-size | 重写 最小值 |
重写简单说明
redis 创建一个新的aof 文件替换现有的aof,会去掉 冗余命令,无效命令
重写是由后台进程 bgrewriteaof 来完成,主线程fork出后台的bgrewriteaof 子进程,fork会把主线程的内存拷贝一份给bgrewriteaof子进程
重写日志时,新的写入数据
子进程完成日志文件重写后,会提示主线程完成重写操作,主线程会将AOF重写缓存中的命令,追加到最新的日志文件后面
在高并发的时候的,aof重写的缓存区积累 会很大,这样会造成阻塞
主线程在重写过程中的阻赛
- fork 子进程,拷贝虚拟页表
- 主进程bigkey 写入时,操作系统会创建页面的副本,并拷贝原有数据
- 子进程重写日志完成后,主进程追加aof重写缓冲区时
RDB 和AOF 混合方式
redis4.0 开始
内存快照以一定频率之行,在两次快照之间,使用AOF日志记录这期间所有命令操作