RDB工作原理:
每隔N分钟或N次写的操作后,Redis将数据库快照保存在名字为dump.rdb的二进制文件中。压缩,然后放到备份目录中。
比如说,一下设置会让Redis在满足“60秒内有至少1000个键被改动”这一条件时,自己保存数据集:
save 60 1000
这种方法持久化方式被称为快照。
RDB相关参数:
save 900 1 #刷新快照到磁盘中,必须满足2个要求才会触发,即900秒之后只是有1个关键字发生变化
stop-wrties-on-bgsave-error yes #后台存储错误停止写
rebcompression yes #使用LZF压缩rdb文件
rebchecksum yes #存储和加载rdb文件时校验
dbfilename dump.rdb #设置rdb文件名
dir ./ #设置工作目录,rdb文件会写入该目录。
RDB的优点:
1.RDB是一个非常紧凑的文件,它保存了Redis在某个时间段的数据集。这种文件非常适合备份,比如说,你可以在最近24小时内,每小时备份一次RDB文件,并且在每个月的每一天,也备份一次RDB文件。这样的话,即使遇到了问题,也可以还原到不同的版本。
2.RDB在恢复大数据集时比aof恢复速度快
3.RDB可以最大化Redis性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进行,然后这个子进程就会处理接下来所有保存工作,父进程无须操作I/O操作
4.RDB保存的是一个镜像文件,可以将它直接传送到别人数据模块中
RDB的缺点:
如果在2个保存点之后保存数据,可能会丢失1-N分钟的数据;如果你需要尽量在服务器故障时丢失数据,那么RDB不适合你。虽然RDB允许你设置不同的保存点来控制保存RDB文件的频率。但是,因为RDB文件需要保存的是整个数据集的状态,所以它并不是一个轻松的操作。因为你可能需要5分钟才保存一次RDB文件。在这种情况下,可能会丢失好几分钟的数据。
AOF工作原理:
也就是使用日志文件来记录所有的写操作命令,并在服务器启动时,重新启动这次命令来还原数据集。
AOF相关参数:
appendonly no #是否打开aof日志功能
appendfsync always #每一个命令都立即写入到aof,安全,速度慢
appendfsync everysec #每秒写1次
appendfsync no #写入功能让操作系统判断缓存区大小统一写入到aof,同步速率慢,速度快
no-appendfasy-on-rewrite yes #正在导入rdb快照过程中,需不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 60mb #aof文件超过60M时才进行重写
注:在dump.rdb过程中 ,aof如果停止同步,会不会丢失?
答:不会,所有的操作缓存在内存的队列里,dump完成后,统一操作
注:aof重写是指什么?
答:aof重写是指把内存中命令,逆话命令,写入到aof日志里。
问:如果rdb文件与aof文件同时存在,优先用谁来恢复数据?
答:aof
问:恢复时rdb与aof哪个恢复的快?
答:rdb,因为其是数据的内存映射,直接载入到内存。而aof是命令,需要逐条执行
AOF的重写的执行步骤:
1.Redis执行fork(),现在同时拥有父进程和子进程
2.子进程开始将新AOF文件的内容写入到临时文件
3.对于所有新执行的写入命令,父进程一边将它们累计到一个内存缓存中,一边将这些改动追加到现有AOF文件的末尾;这样即使在重写的过程中发生停机,现有的aof文件也是安全的
AOF的优点
1.aof默认的策略是每秒钟执行一次,在这种配置下,Redis仍然可以保持良好的性能,并且就算发生了故障,也是丢失一秒钟的数据
2.Redis可以在AOF文件过大的情况自动进行重写:重写后的新aof文件包含了恢复当前数据集所需的最小命令集合,因为Redis在创建新的aof文件时,会继续将命令追加到现有的aof文件里面,即使重写过程发生了停机,而aof文件而不会丢失。而一旦新aof文件创建完毕,Redis就会从旧的aof文件中切换到新的aof文件,并开始对新的aof文件进行追加操作。
AOF的缺点
1对于相同数据集的文件,aof文件的体积通常比rdb文件大
2.根据fasy策略,aof的速度比rdb慢
3.aof在国庆曾经发生了这样的问题,因为个别命令的原因,导入aof文件重新载入时,无法将数据集恢复到保存时的原样。
4.当子线程完成重写工作时,它给父进程发送一个信号,父进程在接收信号之后,将内存中所有数据追加到新aof文件的末尾。
备份Redis数据
磁盘故障,节点失效,众多的问题都可能让你的数据消失不见,不进行备份是非常危险的
Redis对于数据备份是非常友好的。比如它可以在服务器运行的时候对数据进行备份的:RDB文件一旦创建之后,就不会进行任何修改。当服务器创建了一个新的RDB文件时,它先将文件的内容保存在一个临时的文件里,当临时文件写完之后,才会用临时文件去替换原来的RDB文件