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的日志备份,如果开启则命令将会失效。

image-20210331152611943

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

工作原理

​ 如下图所示:

image-20210331153316741

  1. 在重写期间,由于主进程依然在响应命令,为了保证最终备份的完整性;因此它依然会写入旧的AOF file中,如果重写失败,能够保证数据不丢失。

  2. 为了把重写期间响应的写入信息也写入到新的文件中,因此也会为子进程保留一个buf,防止新写的file丢失数据。

  3. 重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并。

  4. AOF文件直接采用的文本协议,主要是兼容性好、追加方便、可读性高可认为修改修复。

​ AOF文件仅能有1个,这与MySQL的多个binlog进行日志轮询并不一样。

​ Redis的AOF日志备份仅关注结果,不关注过程,换而言之,如果你的操作是下面这样:

set k1 "v1"
set k1 "v2"

​ 则记录的变更日志会根据结果进行精简,只记录一条:

set k1 "v2"

​ 这样的策略能最大限度减少AOF文件数据大小,但也造成了无法通过AOF恢复误操作数据的情况,因此谨慎使用。

恢复原理

​ 以下是恢复原理,如果AOF与RDB同时启用,优先恢复AOF:

image-20210331154144096

临时关闭备份

​ 以下两条命令可在redis-shell中临时关闭备份:

config set save ""     # 临时关闭RDB备份
config set appendfsync # 临时关闭AOF备份
posted @ 2021-03-31 15:48  云崖君  阅读(61)  评论(0编辑  收藏  举报