? 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,那也是由于它只关注于数据结果导致的。那么我们想,有没有一种方式能够把数据存储了,删除了这种变化的过程记录下来,也就是记录那些set,hset语句,等到redis重启后直接执行一遍这些语句,达到数据恢复的效果呢?这样的话是不是就不会过多的丢失数据呢?由于是记录的过程,它可能仅仅会丢失宕机时的那一刻那一秒的数据而已。此刻,一种补充性的持久化机制AOF应运而生了,它就是一种只关注过程不关注结果的持久化机制。
? AOF(append only file)是redis持久化的另一种机制,在默认情况下是不开启的。根据英文append only file 翻译成英文的意思:仅仅追加文件,意思是不断的去追加记录那些写入命令写入文件中,可以明白这是一个过程的记录。
? 当redis开启AOF持久化后,redis将所有对数据库进行过的写入的命令(及其参数)记录到AOF文件,以此达到记录数据库状态的目的。
? 也就是说当redis重启之后只要按顺序回放这些命令就会恢复到原始状态了。
? 再重申一遍,AOF会记录过程,RDB只管结果。
通过配置redis.conf来进行开启和其他的一些设置
# 可以通过修改redis。conf配置文件中的appendonly参数开启
appendonly yes
#AOF文件的保存位置和ROB文件的保存位置相同,通过dir ./参数设置的
dir ./
#默认的文件名是appendonly.aof, 可以通过appendfilename参数修改
appendfilename appendonly.aof
AOF文件中存储的是redis的命令,同步命令到 AOF 文件的整个过程可以分为三个阶段,他们分别是:命令传播,缓存追加,文件写入和保存。
Redis目前支持三种的AOF保存模式,他们分别是:
AOF不断的记录数据的变化过程,时间一长,数据就会越来越多,它就得需要重写一下,进行数据的瘦身,所谓AOF重写,无非就是把针对于某个数据的操作去除中间过程,只保留起始即可,毕竟我们想恢复的是一个最终态。举个例子帮助理解:
命令输入 | 没有重写的AOF数据记录 | 重写后的AOF数据记录 |
---|---|---|
step1:set singer xusong | set singer xusong | set singer xuezhiqian |
step2:set singer wangsulong | set singer wangsulong | |
step3:set singer xuezhiqian | set singer xuezhiqian |
很明显,重写后的AOF文件记录的比没有重写的少记录两行,大大节省空间。
Redis不希望AOF重写造成服务无法处理请求,所以redis决定将重写程序放在子进程里面执行,这样做有几个好处:
但是有个问题,子进程在进行AOF重写期间,主进程还有可能继续执行命令,导致当前数据库的数据和重写后的AOF文件中的数据不一致。这里需要引入一个AOF重写缓存,关于这一块的知识点,大家可以参考这篇大牛的博客,写的很详细:https://blog.csdn.net/hezhiqiang1314/article/details/69396887.
如何触发AOF的重写机制呢?
配置触发,在redis.conf中配置。
# 表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以
启动时aof文件大小为准
auto-aof-rewrite-percentage 100
# 限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化
auto-aof-rewrite-min-size 64mb
执行bgrewriteaof命令。
如何实现混合持久化
混合持久化,顾名思义就是同时使用AOF和RDB。如果把混合持久化打开,AOF重写的时候就直接把 RDB 的内容写到 AOF文件开头。
开启混合持久化的命令:aof-use-rdb-preamble yes
之前也说了,AOF文件里面保存着重建数据库状态所需要的所有写命令,所以服务器重新启动时只需要重新的载入读取AOF文件,执行一遍新建命令即可。
详细步骤如下:
原文:https://www.cnblogs.com/zaevn00001/p/14859628.html