简述
redis 持久化主要用作灾难恢复的.也是类高可用的(挂掉重启就是需要的).
redis持久化的方式: RDB, AOF
RDB持久化方式: 周期性的将redis内存中的数据生成一份完整的快照
AOF持久化方式: Redis将每条进来的数据同步写到linux OS cache中,然后一定时间后,将os cache中的数据放到disk file(每隔一秒或者几秒)
Redis中的数据是有一定的限量的,不可能无线增长,进而导致AOF文件无线增长.,内存大小是一定的,到瓶颈,redis就会使用缓存淘汰算法,LRU,自动将一部分数据从内存中清除.
AOF,是存放每条写命令的,所以会不端膨胀,当大到一定时候,AOF做rewrite操作,也就是说,会基于当时reids内存中的数据,来重新构造一个更小的AOF文件,然后将旧的膨胀的很大的文件给删除掉.如下图所示:
注 : 同时开启会优先使用AOF重新加载redis,因为AOF的日志时间粒度更小.更加完整.
配置相关:
配置RDB持久化机制:
save 60 1000 (redis配置文件中)
每隔60秒.如果超过1000个key发生了变化.那就生成一个新的dump.rdb文件,也就是当前redis的完整数据快照,这个操作也被称为snaphoting.快照也可以手动用save或者bgsave命令,同步或者异步执行rdb的快照 可以配置多个save节点,也就是多个检查节点
rdb工作流程:
1 redis根据配置自己尝试去生成rdb快照文件
2 fork一个字进程出去
3 子进程尝试将数据dump到临时的rdb快照文件中
4 完成rdb快照文件的生成后,替换掉原来的rdb文件
配置AOF持久化机制:( 默认是打开RDB持久化配置)
配置AOF:
appendonly on/yes
打开AOF持久化之后,redis每次借到一条写命令,就会写入日志文件中.同样的,还是先写到os cache中,然后隔一段时间fsync一下
配置AOF的fsync策略,有三种:1 每次写入就fsync一次 2 隔一秒执行一次 3 不主动执行
其中: 每次写入都执行,性能非常差,吞吐量低
mysql -> 内存策略 QPS 1~2K
redis -> 内存 磁盘持久化,QPS单机上万Qps
everysec : 每秒钟 将os cache 中fsync 到磁盘 为默认选项,性能较好
Aof工作流程:
1 redis fork一个子进程
2 子进程基于当前内存中的数据,构建日志,开始往一个新的临时AOF文件中写入日志
3 子进程在内存中写入日志,同时新的日志也继续写入旧的AOF文件
4 子进程写完后,主进程将内存中的新日志再次追加到新的AOF文件中
5 用新的AOF文件替换掉旧的AOF文件
AOf破损文件修复:
如果redis在append数据到AOf文件时,机器宕机,可能会将aof文件损坏
redis-check-aof --fix 命令来修复AOF文件
最后:
AOF与RDB同时工作:
1 如果rdb在执行snapshotting操作,那么redis不会执行AOF rewrite,如果redis在执行AOF rewrite,那么不会执行RDB snapshotting
2 如果RDB在执行Snapshotting,此时用户执行 BGERWRITE (aof rewrite)命令,那么等RDB快照生成以后,才会去执行AOF rewrite
3 重启先aof