DBA Redis 持久化存储
功能概述
Redis会将数据全部存储在内存中,这意味着一旦服务停止,所有数据都将被丢失。
因此Redis提供了2种持久化方式,RDB与AOF:
- RDB:根据配置的指定时间间隔与数据提交频率进行快照存储
- AOF:仅记录变更日志,当服务重启后进行回放操作,达到数据恢复的目的
Redis默认开启了RDB持久化方式,但是我们仍然需要对其具有充分的了解
RDB方式
相关配置
在Redis配置文件中,可指定RDB快照存储的配置项如下所示:
# 是否开启快照保存,以下配置是禁用,默认启用
# save ""
# 时间策略
save 900 1
save 300 10
save 60 10000
# 指定RDB持久化存储的文件名称,默认为dump.rdb
dbfilename dump.rdb
# 指定RDB持久化存储的文件所在目录,默认为当前工作目录
dir /usr/local/redis_cluster/redis_6379
# 备份出错后,是否允许新的变更操作进行执行?
stop-writes-on-bgsave-error yes
# 是否压缩?不建议开启,影响性能
rdbcompression yes
# 导入时是否检查?不建议开启,影响性能
rdbchecksum yes
1)时间策略:
- 当900s内有1条变更记录,就触发一次快照备份
- 当300s内有10条变更记录,就触发一次快照备份
- 当60s内有10000条变更记录,就触发一次快照备份
操作方式
除开上面配置的自动进行快照备份策略外,你也可以在redis-shell中执行以下2条命令手动进行快照备份:
- save:不fork子进程进行快照备份,会阻塞新的变更操作,不建议使用
- bgsave:fork出一个子进行进行快照备份,不会阻塞新的变更操作,建议使用
此外,在对服务进行shutdown的操作时且没有开启AOF备份方式,也会自动的进行bgsave的操作。
如果是kill -9等暴力的将服务进程进行关闭,则不会执行bgsave的操作,因此应当避免使用kill -9等暴力的进行结束方式。
工作原理
RDB的bgsave命令在触发时,会检查是否开启AOF的日志备份,如果开启则命令将会失效。
AOF方式
相关配置
在Redis配置文件中,可指定AOF日志存储的配置项如下所示:
# 是否开启aof
appendonly yes
# 文件名称
appendfilename "appendonly.aof"
# 同步方式
appendfsync everysec
# aof重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 回放aof时如果有错如何处理
aof-load-truncated yes
# 文件重写策略
aof-rewrite-incremental-fsync yes
1)appendfsync指定同步方式:
- always:把每个写命令都立即同步到aof,很慢,但是很安全
- everysec:每秒同步一次,是折中方案,推荐使用
- no:redis不处理交给OS来处理,非常快,但是也最不安全
2)aof-load-truncated回放异常处理:
- yes:继续执行回放
- no:必须修复aof文件后再进行回放
操作方式
除开上面配置的自动进行日志备份策略外,你可以在redis-shell中执行以下条命令手动进行日志备份:
- bgrewriteaof
工作原理
如下图所示:
-
在重写期间,由于主进程依然在响应命令,为了保证最终备份的完整性;因此它依然会写入旧的AOF file中,如果重写失败,能够保证数据不丢失。
-
为了把重写期间响应的写入信息也写入到新的文件中,因此也会为子进程保留一个buf,防止新写的file丢失数据。
-
重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并。
-
AOF文件直接采用的文本协议,主要是兼容性好、追加方便、可读性高可认为修改修复。
AOF文件仅能有1个,这与MySQL的多个binlog进行日志轮询并不一样。
Redis的AOF日志备份仅关注结果,不关注过程,换而言之,如果你的操作是下面这样:
set k1 "v1"
set k1 "v2"
则记录的变更日志会根据结果进行精简,只记录一条:
set k1 "v2"
这样的策略能最大限度减少AOF文件数据大小,但也造成了无法通过AOF恢复误操作数据的情况,因此谨慎使用。
恢复原理
以下是恢复原理,如果AOF与RDB同时启用,优先恢复AOF:
临时关闭备份
以下两条命令可在redis-shell中临时关闭备份:
config set save "" # 临时关闭RDB备份
config set appendfsync # 临时关闭AOF备份