🔗网课链接: 尚硅谷超经典Redis教程,redis实战,阳哥版从入门到精通
Redis持久化
Redis持久化
RDB Redis DataBase
定义
在指定的时间间隔内将内存中的数据快照写入磁盘
行话: snapshot快照, 它恢复时是将快照文件直接读到内存里
Redis会单独创建(fork) 一个子进程来进行持久化, 会先将数据写入到一个临时文件中, 等持久化过程都结束了, 再用这个临时文件替换上次持久化好的文件
整个过程中, 主进程是不进行任何IO操作的, 这就确保了极高的性能
如果需大规模数据的恢复, 且对精度(完整性)要求不高, 那在选择持久化策略上:
RDB >> AOF
RDB的缺点是最后一次持久化后的数据可能丢失
Fork()
Fork的作用是复制一个与当前线程一样的线程, 所有数据(数据包括变量,环境变量,程序计数器等)数值都和原进程一致, 但是是一个全新的进程, 并作为原进程的子进程
最大隐患是: fork会将redis的内存需求翻倍
Rdb保存—dump.rdb文件 & 配置位置
save
save <seconds> <changes>
- save for every
<seconds>
seconds if at least<changes>
keys changed- 一分钟内改1万次
- 或5分钟内改10万次
- 或15分钟内改1次
- RDB是整个内存的压缩后的Snapshot, RDB的数据结构, 可以配置符合的快照出发条件
Stop-writes-on-bgsave-error
- 默认yes
- 如果配置为no, 表示你不在乎数据不一致或者有其他的手段发现和控制
rdbcompression
- 默认yes
- 对于存储到磁盘中的快照, 可以设置是否进行压缩存储. 如果是的话, redis会采用LZF算法进行压缩. 如果你不想消耗CPU来进行压缩的话, 可以关闭此功能
rdbchecksum
- 默认yes
- 在存储快照后, 还可以让redis使用CRC64算法来进行数据校验, 但是这样做会增加大约10%的性能消耗, 如果希望获取到最大的性能提升, 可以关闭此功能
dbfilename
dump.rdb
dir
如何触发RDB快照
- 配置文件中默认的快照配置
- 冷拷贝后重新使用
- 命令save或者是bgsave
- Save: save时只管保存, 其他不管, 全部阻塞
- BGSAVE: Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求. 可以通过lastsave命令获取最后一次成功执行快照的时间
- 执行flushall命令, 也会产生dump.rdb文件, 但里面是空的, 无意义
如何恢复
- 将备份文件dump.rdb 移动到redis安装目录并启动服务即可
- CONFIG GET dir获取目录
优势
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高
劣势
- 在redis意外宕机时, 就会丢失最后一次快照后的所有修改
- Fork的时候, 内存中的数据被克隆了一份, 大致2倍的膨胀性需要考虑
如何停止
动态停止RDB保存规则的方法: redis-cli config set save “”
小结
- RDB是一个非常紧凑的文件。
- RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他I0操作,所以RDB持久化方式可以最大化redis的性能。
- 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一一些。
- 数据丢失风险大。
- RDB需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候fork的过程是非常耗时的吗,可能会导致Redis在一些毫秒级不能回应客户端请求。
AOF Append Only File
定义
以日志的形式来记录每个写操作, 将redis执行过的所有写指令记录下来(读操作不记录), 只许最佳文件但不可以改写文件, redis启动之初会读取该文件重新构建数据, 换言之, redis重启的话就根据日志文件的内容将鞋指令从前到后执行一次以完成数据的恢复工作
Aof 保存的是appendonly.aof文件
append.aof 会如实记录所有的有效操作, 包括 FLUSHALL不建议手动更改.aof文件
假如aof文件被非法篡改, redis无法正常启动. 可以通过redis-check-aof --fix xxxx.aof
去清除aof文件中不符合语法规范的内容.
Append Only Mode追加 & 配置位置
appendonly
appendfilename
appendfsync
- Always: 同步持久化, 每次发生数据变更会被立即记录到磁盘, 性能差但是数据完整性比较好
- Everysec: 出厂默认推荐, 异步操作, 每秒记录, 如果一秒内宕机, 有数据丢失
- No:
No-appendfsync-on-rewrite: 重写时是否可以运用Appendfsync, 用默认no即可, 保证数据安全性
Auto-aof-rewrite-min-size: 设置重写的基准值, 上次rewrite的倍数 100 = 1倍
Auto-aof-rewrite-percentage: 设置重写的基准值, 默认64 mb 但是大公司3g起
Aof启动/修复/恢复
正常恢复
- 启动: 设置Yes, 默认情况下设置为No
- 将有数据的aof文件复制一份保存到对应目录 (config get dir)
- 恢复: 重启redis然后重新加载
异常恢复
- 启动: 设置Yes
- 备份被写坏的AOF文件
- 修复: redis-check-aof --fix 进行修复
- redis-check-dump
- 恢复: 重启redis然后重新加载
Rewrite
AOF会越写越多,执行中进行精简操作进行压缩
触发条件
- AOF采用文件追加方式, 文件会越来越大为避免出现此中情况, 新增了重写机制, 当AOF文件的大小超过所设定的阈值时, Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集, 可以使用命令bgrewriteaof
重写原理
- AOF文件持续增长以至于过大时, 会fork出一条新进程来将文件重写(也是先写临时文件最后再rename).
- 遍历新进程的内存中数据, 每条记录有一条的Set语句. 重写Aof文件的操作, 并没有读取旧的aof文件, 而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件, 这点和快照有点类似.
触发机制
- redis会记录上次重写的AOF大小
- 默认配置
- 当AOF文件大小是上次rewrite后文件大小的一倍 & 超过64mb的时候
优势
- 每秒同步
- 每修改同步
- 不同步
劣势
- 相同数据集的数据而言aof文件要远大于rdb文件, 恢复数独慢于rdb
- aof运行效率要慢于rdb, 没秒同步策略效率较好, 不同步效率和rdb相同
- 因为是逐条恢复
小结
- AOF文件时一个只进行追加的日志文件
- Redis可以在AOF文件体积变得过大时,自动地在后台对AOF进行重写
- AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松
- 对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积
- 根据所使用的fsync 策略,AOF的速度可能会慢于RDB
总结
- RDB持久化方式能够在指定的时间间隔内对数据进行快照存储
- AOF持久化方式记录每次对服务器的写操作, 当服务器重启的时候会重新执行这些命令来恢复原始的数据, AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积大至于过大.
- 只做缓存: 如果数据只在服务器运行的时候存在, 你也可以不使用任何持久化方式
- 同时开启两种持久化方式
- 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据. 因为通常情况下AOF文件保存数据集要比RDB文件保存的数据集要完整
- RDB的数据不实时, 同时使用两者时服务器重启也只会找AOF文件.
- 那要不要只使用AOF? 建议不要
- 因为RDB更适合用于备份数据库(AOF在不断变化不好备份). 快速重启, 而且不会有AOF可能潜在的bug, 留着作为一个万一的手段