redis学习笔记之五:Redis的持久化

n Redis持久化概述
Redis持久化分成两种方式:RDB(Redis DataBase)和AOF(Append Only File)
1:RDB是在不同的时间点,将Redis某一时刻的数据生成快照并存储到磁盘上
2:AOF是只允许追加不允许改写的文件,是将Redis执行过的所有写指令记录下来,在下次
Redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了
3:RDB和AOF两种方式可以同时使用,在这种情况下,如果Redis重启的话,则会优先采用AOF
方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高
4:可以关闭RDB和AOF,这样的话,Redis将变成一个纯内存数据库,就像Memcache一样
5:通过配置redis.conf中的appendonly为yes就可以打开AOF功能


n RDB
RDB方式,Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到
一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方
式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。


n RDB的问题
1:fork一个进程时,内存的数据也被复制了,即内存会是原来的两倍
2:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数
据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可
能会严重影响性能。
3:由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就
会丢失最后一次快照后的所有修改。
n 触发快照的情况
1:根据配置规则进行自动快照
2:用户执行save或bgsave命令
3:执行flushall命令
4:执行复制replication时


n save命令
执行Save命令时,Redis会阻塞所有客户端的请求,然后同步进行快照操作。
 

n bgsave命令
执行bgsave命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端
请求。可以通过lastsave命令获取最后一次成功执行快照的时间。


n flushall命令
这个命令会导致Redis清除内存中的所有数据,如果定义了自动快照的条件,那么无
论是否满足条件,都会进行一次快照操作;如果没有定义自动快照的条件,那么不会进行
快照


n AOF
默认的AOF持久化策略是每秒钟fsync一次,fsync是指把缓存中的写指令记录到磁盘
中,在这种情况下,Redis仍可以保持很高的性能。
当然由于OS会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样
aof方式的持久化也还是有可能会丢失部分修改。不过可以通过配置文件告诉Redis,想要
通过fsync函数强制os写入到磁盘的时机。
AOF方式在同等数据规模的情况下,AOF文件要比RDB文件的体积大,因此AOF方式的
恢复速度也要慢于RDB方式。
 

n AOF日志恢复
如果在追加日志时,恰好遇到磁盘空间满或断电等情况,导致日志写入不
完整,也没有关系,Redis提供了redis-check-aof工具,可以用来进行日志修
复,基本步骤如下:
1:备份被写坏的AOF文件
2:运行redis-check-aof –fix进行修复
3:用diff -u来看下两个文件的差异,确认问题点
4:重启redis,加载修复后的AOF文件


n AOF重写
AOF采用文件追加方式,这会导致AOF文件越来越大,为此,Redis提供了
AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,Redis
就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。可以使用命
令bgrewriteaof 。


n AOF重写的触发机制
Redis是这样工作的:Redis会记录上次重写时的AOF大小。假如自启动至今还没有进
行过重写,那么启动时AOF文件的大小会被作为基准值,这个基准值会和当前的AOF大小进
行比较,如果当前AOF大小超出所设置的增长比例,则会触发重写。另外,你还需要设置一
个最小大小,是为了防止在AOF很小时就触发重写


n AOF重写的基本原理
1:在重写开始前,redis会创建一个“重写子进程”,这个子进程会读取现有的AOF文件,并
将其包含的指令进行分析压缩并写入到一个临时文件中。
2:与此同时,主进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有
的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。
3:当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将
内存中缓存的写指令追加到新AOF文件中
4:当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追
加到新的AOF文件中
5:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的
方式重写了一个新的aof文件,这点和快照有点类似
 

猜你喜欢

转载自blog.csdn.net/u010800970/article/details/81349165