持久化介绍
redis 是一个内存型数据库,DRAM 的特性之一就是掉电数据丢失,所以如何保存数据就成了Redis 问世之初就需要考虑的问题,如何保存数据用专业的说法就是数据持久化. Redis目前有两种持久化策略,RDB(redis datebase backup),AOF(append only file)。
RDB
记录的是数据库某一时刻的全部数据,是二进制格式的数据库镜像
恢复通过加载二进制镜像文件恢复
怎么开启RDB
配置文件 /etc/redis.conf 找到如下字段进行配置
#sample
#save 900 1 #900 秒之内,对数据库进行了至少 1 次修改;
#save 300 10 #300 秒之内,对数据库进行了至少 10 次修改
#save 60 10000 #60 秒之内,对数据库进行了至少 10000 次修改
# 1、Redis 7重新指定自动触发 rdb 备份文件的标准
save 3600 1 300 100 60 10000 # 也可以自定义
# 2、指定生成rdb文件的名称
dbfilename dump.rdb
# 3、指定rdb文件的保存路径
dir ./testdata
# 4、备份出错停止接受新的请求
stop-writes-on-bgsave-error yes # 默认开启
# 5、开启压缩rdb功能
rdbcompression yes # 会消耗cpu资源,看情况开启,默认开启
# 6、数据校验
rdbchecksum yes # 默认开启
AOF
追加文本形式的记录执行的为一条指令(相当于操作日志)
恢复通过AOF记录的命令重放
怎么开启AOF
配置文件 /etc/redis.conf 找到如下字段进行配置
# 1、开启 aof 备份
appendonly yes # 默认为 no
# 2、指定aof文件名
appendfilename "appendonly.aof"
# 3、指定aof保存路径,此路径是拼接 dir 的路径(与redis6有差别)
appenddirname "appendonlydir"
# 4、将aof文件刷新到磁盘的频率
# appendfsync always # 有写操作就刷新
appendfsync everysec # 每秒刷新一次
# appendfsync no # 不刷新,由操作系统决定
# 5、redis7 将aof文件分成3个部分
appendonly.aof.1.base.rdb # 基本文件
appendonly.aof.1.incr.aof # 增加写操作记录文件
appendonly.aof.manifest # 清单文件
# 6、aof文件重写
auto-aof-rewrite-percentage 100 # 根据上次重写后的aof大小,判断当前aof大小是不是增长了1倍
auto-aof-rewrite-min-size 64mb # 重写时满足的文件大小为64mb
RDB 和 AOF区别
同样的数据文件大小上,RDB是二进制文件格式紧凑,AOF本质上是文本格式上的日志文件,所以RDB 更小
记录内容上,RDB是某时刻数据库全部数据的镜像,AOF 是开机以来记录的所有执行过的指令
恢复速度,RDB直接加载,速度快于AOF命令重放
数据完整性,AOF 记录的是执行过的每一条指令,虽然可能有出现刷盘中或者未来得及刷盘就断电的情况,但是数据完整性是要比RDB要完整的。
那种更好,怎么选?
根据场景:
如果是旁路缓存之类的可以不开(回味穿过缓存打数据库返回的结果Redis 会缓存进去,供下次查询使用),大不了直接打数据库上(当然有可能会把数据库干崩)
数据非常重要,开RDB + AOF
如果能接受丢失几分钟内的数据的开RDB
注意Redis 默认持久化策略是RDB,AOF 需要手动开启,单独开AOF 官方不建议,因为备份数据最有效手段始终是数据镜像,单开AOF 其实并不能完全兜底。-- 你开AOF 说明数据很重要,为什么不开RDB兜底??
注意事项
同时开启RDB 和 AOF 时恢复数据时发现AOF文件损坏恢复备份失败后不会使用RDB继续恢复 -- 因为AOF一般情况下记录的数据是最完整的,且两个策略都开了说明数据很重要,所以此时不会继续恢复(恢复了可能会为后续业务埋坑),应当告警,让人工评估损失作后续处理
RDB 数据备份是fork一个子进程作数据镜像,子进程开辟是比较耗费系统资源的,所以要注意配置RDB备份频率.