redis持久化
一、RDB:Redis Database
1.RDB是什么?
就是在指定的时间间隔内,将内存中的数据集快照(Snapshot)写入到本地磁盘
2.Fork:Fork的作用是复制一个与当前进程一样的进程,新进程的所有数据都和原进程一致,但是是一个全新的进程,并作为远进程的子进程
3.rdb保存的是dump.rdb文件,隔一段时间redis都会备份一份最新的数据去替换掉原来的dump.rdb文件以保证备份数据的完整性
4.当服务器器重启的时候redis会自动加载dump.rdb文件恢复数据
5.rdb是整个内存的压缩过的Snapshot,rdb的数据结构,可以配置复合的快照触发条件,
默认的快照触发条件:是1分钟内改变了1万次或5分钟内改了10次,或15分钟内改了1次
6.快照:
• save:触发快照,save时只管保存,其他不管,全部阻塞
• BGSAVE:Redis会在后台异步进行快照操作,快照同时还可以相应客户端请求,可以通过lastsave命令来获取最后一次成功执行快照的时间
• 执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义
7.如何恢复:将备份文件dump.rdb文件移动到redis安装目录并启动服务即可
8.优势:适合大规模的数据恢复
9.劣势:
• 在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
• Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
二、AOF:Append Only File
1.AOF是什么?
AOF是以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读指令不记录),只许追加文件,但不可以改写文件,reids启动之初会读取该文件重新构建数据。
换言之,就是redis启动的时候根据这个日志文件中的内容从前到后执行一遍以完成数据的恢复工作。
2.aof保存的是appendonly.aof文件,appendonly.aof文件和dump.rdb文件是可以共存的,如果两个文件都在,redis会加载aof文件,如果aof文件出错则启动不起来;
如果执行了flushall命令,这时可以通过手动删除appendonly.aof文件中的flushall命令达到数据恢复的目的;
如果appendonly.aof文件语法有误,可以手动加载redis-check-aof文件恢复,redis-check-aof文件会自动删除那些语法有误的日志
3.aof启动/修复/恢复:
• 正常恢复:
• 启动:设置Yes:修改默认的appendonly no 改为yes
• 备份:最好将aof文件备份一份到其他电脑上,这样就算这台电脑的硬件坏了也可以使用备份文件
• 恢复:重启redis然后重新加载
• 异常恢复:redis-check-aof --fix 进行修复
3.Appendfsync:追锁策略
• Always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性较好
• Everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内宕机,则丢失这一秒的数据
• No:从不同步
4.rewrite:重写策略
• 是什么? aof采用文件追加的方式,文件难免会越来越大为避免出现这种情况,新增了重写机制,当aof文件的大小超过所设定的阈值时,redis就会启动aof文件的内容压缩,只保留可以恢复数据的最小指令集
• 重写原理:aof文件持续增长而过大时,会fork出一条新进程来将文件重写,这点和快照有点相似
• 触发机制:redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64M时触发
5.优势: aof每秒同步策略效率较好,不同步效率和rdb相同
6.劣势:aof运行效率要慢于rdb,相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb