Redis持久化处理配置

Redis持久化

参考资料:Redis Persistence – Redis

这里只是总结一些常见的使用方法,需要详细的信息可以到以上地址

Redis提供持久化方式

  • RDB(Redis DataBase)可以提供某个时间节点的数据集快照
  • AOF(Append Only File)可以提供全部写入命令的合集,服务器在启动时通过命令对数据进行恢复

持久化过程

image-20210218161640612

RDB(Redis DataBase)

RDB优势

  • RDB是非常紧凑的数据文件,保存了Redis某个时间点的数据集,这种格式非常适合备份。
  • RDB非常适合灾难恢复,可以传输到异地保存。
  • RDB可以保证Redis最大性能,Redis启动一个子进程处理RDB文件,不会在主进程进行频繁IO操作。
  • RDB在恢复大的数据集时比AOF更快。

RDB劣势

  • 在服务故障时将比AOF丢失更多的数据,如果更改为频繁的备份,则可能会丧失一部分性能。
  • 如果RDB保存点设置较多的情况下会启动更多的子线程处理持久化,处理大数据集时,子线程将消耗更多的CPU资源,若系统CPU吃紧,则会影响Redis服务性能

RDB配置

以下用于配置文件redis.conf

  • save <seconds> <changes>:在时间内发生了个数据变更,则保存数据快照。
  • stop-writes-on-bgsave-error:在持久化线程发生错误时是否停止接受客户端写入命令,yes停止接受,no继续写入。
  • rdbcompression:是否对rdb进行压缩,yes启用,no不启用,这将节省一部分CPU资源。
  • rdbchecksum:是否对rdb文件启动CRC64校验,yes启用,添加CRC64校验到文件末尾,文件更不容易损坏,但是会损失一部分的性能,大约10%。no不启用,将节省一部分性能开销。
  • dbfilename:rdb文件名称
  • dir:设置rdb文件存储目录

RDB快照生成

  • Redis调用fork(), 拥有父进程和子进程
  • 子进程将数据集写入一个RDB文件中。
  • 子进程完成新的RDB文件写入时,Redis用新的RDB文件替换原来的RDB文件,并删除旧的RDB文件。

AOF(Append Only File)

AOF优势

  • AOF持久化可以通过配置不用的策略,在发生故障时损失更少的数据。
  • AOF文件是一个只进行追加的日志文件,如果在服务断电等情况下发生损坏,也可以通过redis-check-aof工具修复。
  • Redis可以自动重写AOF文件,当AOF文件过大时,Redis会基于当前数据集重写AOF文件,保证最小操作集,以减小文件大小。
  • AOF文件格式更容易理解和解析,可轻松导出AOF文件。

AOF劣势

  • AOF文件大小通常大于通数据集下RDB文件。
  • AOF持久化可能被RDB慢,取决于fsync策略的设置。
  • AOF出现过一个BUG,再恢复数据时部分命令可能影响得到的数据集与源数据不一致。

AOF配置

以下配置适用redis.conf

  • appendonly:配置开启AOF,yes开启,no不开启
  • appendfilename:配置AOF文件名称
  • appendfsync:fsync策略配置
  • no-appendfsync-on-rewrite:配置BGSAVE或BGREWRITEAOF进行时,是否使用主进程写AOF
  • auto-aof-rewrite-percentage:AOF重写比例,设置0禁用重写功能
  • auto-aof-rewrite-min-size:AOF重写文件最小大小
  • aof-load-truncated:设置在redis服务启动时,AOF文件不完整时动作
  • aof-use-rdb-preamble:配置重写AOF时是否使用RDB同步码重写AOF

AOF fsync配置

always

每次命令追加到AOF文件,这将非常慢,但是安全

everysec

每一秒追加到AOF文件,已经足够快,如果发生故障,仅损失1秒的数据

no

不控制,由操作系统控制,更快,更不安全

AOF重写

随着命令的不断写入,AOF文件越来越大,Redis自动触发或者接受到BGREWRITEAOF指令,Redis会启动AOF文件重写,重写的目的是减小AOF文件,在不打断服务客户端的情况下重写。

  • Redis执行fork(),同时拥有父进程和子进程。
  • 子进程开始将新AOF文件的内容写入临时文件中。
  • 对于新的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加现有的AOF文件末尾。
  • 当子进程完成重写工作时,它给父进程一个信号,父进程在收到信号之后,将内存缓存区中所有的数据追加到新的AOF文件末尾
  • 最后,Redis原子地用新文件替换旧文件,之后所有的命令直接追加到新的AOF文件末尾

RDB与AOF

同时启用

Redis服务重新启动时,将优先是用AOF文件重建数据集,应为他是最完整的。

从RDB切换到AOF

备份.rdb文件

将此备份转移到安全的地方

执行以下命令

检查数据库中key的数量是否相同

检查AOF文件是否正常生成并追加

redis-cli config set appendonly yes
#该命令用与开启AOF,Redis会阻塞知道初始AOF文件创建完成,之后Redis继续处理命令,并将命令写入AOF文件末尾
redis-cli config set save ""
#该命令用与关闭RDB,不关闭,则保持RDB和AOF同时运行