# RDB - 快照 - 在指定的时间间隔内将数据进行快照存储,新的RBD文件会覆盖掉旧文件 ## 优化配置 - stop-writes-on-bgsave-error 默认yes,在快照写入失败时,redis将继续接受新的写请求 - rdbcompression yes 默认启用压缩,采用lzf算法 - rdbchedksum yes 在存储快照后,可以让redis使用CRC64算法进行数据校验,但是会增加大约10%的性能消耗 - rdb-del-sync-files no 默认禁用,在没有持久化的情况下删除复制中使用的RDB文件 ## 优点 - 保存了某个时间点的数据,非常适用于数据集的备份,可以根据需求恢复到不同版本的数据集 - 可以很方便将RDB文件发送到远端服务器,非常适用于灾难恢复 - RDB保存RDB文件时,父进程只需要fork出一个子进程,接下来的操作全部由子进程操作,父进程不需要进行io操作,RDB可以最大化redis性能 - 恢复大数据集时RDB会比AOF更会一些 ## 缺点 - redis在意外停止时,可能为丢失数据当数据集大时 - fork子进程是非常耗时的,在进行毫秒级操作时可能会不能响应客户端的请求 ## RDB配置 ``` # 默认:满足其中一个条件时就会被存储到RDB文件中 # 15分钟内至少有一个键被更改 save 900 1 # 5分钟内至少有10个键被更改 save 300 10 # 1分钟内至少有10000个键被更改 save 60 10000 # 存储的文件名 dbfilename dump.rdb # 存储的位置 dir ./ # 默认启用压缩 rdbcompression yes ``` ## RDB手动快照 ``` # 使用主进程,会阻塞 redis-cli> save # 使用子进程 redis-cli> bgsave ``` # AOF ## 工作流程 - 命令到达redis server时并不是直接写入aof文件,会将这些命令先放入aof缓存中进行保存,这里的aop缓冲区实际上是内存中的一片区域,存放的目的是当这些命令达到一定量以后在写入磁盘,避免频繁的磁盘io - aof缓冲会根据aof缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件 - 随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(AOF重写),从而起到aof文件压缩的目的 ## 写回策略 - always 每个写命令执行完立刻同步将数据写入磁盘(最安全但是最慢) - everysec 每秒同步(默认同步策略) - no 不主动同步,由操作系统来决定(最快但最不安全) ## 说明 - 记录每次对服务写的操作,会将操作追加到日志文件的末尾,服务重启时会重新执行这些命令来恢复数据,redis可以对AOF文件进行重写,使文件大小不至于过大 ## 优点 - 数据更加可靠 - 是一个追加的日志文件,即使由于某些原因(磁盘已满,写过程中宕机)未能写入完整命令,可以使用redis-check-of工具进行修复 - redis在AOF文件体积过大时,会自动对AOF重写 - 文件非常容易读懂,对文件分析也很轻松 ## 缺点 - 文件体积大于RDB - AOF速度会慢于RDB # RDB和AOF区别 - AOF存储的数据集要比RBD更完整,当两种持久化方式同时启用时,redis重启时会优先使用AOF来恢复数据 ## AOF配置 ``` # 开启AOF appendonly no # AOF文件名 appendfilename "appendonly.aof" # 同步策略,3选1 # 每次都同步(最安全但是最慢) appendfsync always # 每秒同步(默认同步策略) appendfsync everysec # 不主动同步,有操作系统来决定(最快但最不安全) appendfsync no # 日志重写 # 当前文件的大小超过上一次文件大小的100时,将自动执行重写命令,如果之前没有重写过,以初始的aof文件大小为依据 auto-aof-rewrite-percentage 100 # Aof文件重写时的最小大小 auto-aof-rewrite-min-size 64mb ``` ## 手动触发AOF重写 ``` redis-cli> bgrewriteaof ``` # 纯缓存模式 ## 修改配置文件 - save "" 禁用rdb,仍然后可以使用save、bgsave生成rdb文件 - appendonly no 禁用aof,仍然后可以使用bgrewriteaof生成aof文件 # RDB和AOF的选择 - 为保证数据完整性、安全性 要同时开启两个持久化 - 可以承受数分钟内的数据丢失,可以只是用RDB - 定时生成RBD快照,非常适用于数据备份 ## RDB+AOF混合模式 - 开启混合模式 ``` 配置文件 aof-use-rdb-preamble yes ``` - 先使用RBD进行快照存储,然后使用AOF持久化记录所有的写操作,当重写触发时,将最新的数据存储为新的RDB记录 ## RDB方式切换到AOF方式 ``` # 将最新的dump.rdb文件进行备份 # 执行命令: redis-cli> config set appendonly yes redis-cli> config set save '' ``` - 注意 - bgsave和bgrewriteaof不能同时执行