Redis的AOF持久化
每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当重启Redis服务时,AOF文件里的命令会被重新执行一次,重新恢复数据。当AOF过大时将重写AOF文件。
工作原理
> lpush list 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
appendonly.aof文件中
*2
$6
SELECT
$1
0
*6
$5
lpush
$4
list
$1
1
$1
2
$1
3
$1
4
*2
$4
lpop
$4
list
可以看到上面的示例中写操作有lpush和lpop命令,在AOF文件中存在lpush和lpop。SELECT命令为AOF程序自动加上的选择数据库。
AOF命令写入的内容为文本协议格式,如:命令lpush list 1 2 3 4 的文本形式为"*6 $5 lpushr $4r list $1 1$1 2$1 3$1 4 "。将文本内容追加到aof_buf(缓冲区)中,AOF缓冲区根据相应的策略同步写入AOF文件中,当AOF文件越来越大时,将AOF文件重写。
启动AOF持久化
在redis.conf文件中
appendonly no #写成yes,打开AOF持久化
AOF写入频率
# appendfsync always
appendfsync everysec # 默认
# appendfsync no
- alaws:总是同步到AOF文件,每一个命令都写入,安全,速度慢
- everysec:每秒写入一次,安全性好,最多丢失1秒钟的数据
- no:写入AOF文件工作交给操作系统,由操作系统写入AOF文件,安全性一般
文件
aof文件目录通过RDB文件目录,他们共享同一个目录
dir ./
appendfilename "appendonly.aof"
通过config set dir {newDir}
动态修改dir配置
通过config set dbfilename {appendfilename}
动态修改AOF文件名称
重写
AOF文件过大时,Redis将fork()一个子进程对内存数据进行比那里逆化成Redis命令,序列化文本格式后写入到新的AOF文件中。然后将重写时发生的增量AOF文件追加到新的AOF文件中,最后替换旧的AOF文件。
自动重写
auto-aof-rewrite-percentage 100 # 比上次重写时文件增大了100%就重写AOF文件
auto-aof-rewrite-min-size 64mb # AOF文件至少超过为64M时重写AOF文件
自动重写必须满足:当前AOF文件大小 > auto-aof-rewrite-min-size &&(当前文件AOF文件大小减去上次重写时AOF文件大小)除以 上次重写时AOF文件大小 = auto-aof-rewrite-percentage
手动重写
> bgrewriteaof
Background append only file rewriting started
优缺点
优点
- 比RDB文件可靠,everysec模式下只丢1秒数据。
- AOF文件为纯文本文件。文件协议格式容易恢复成Redis命令。
- AOF文件太大会进行自动重写。
缺点
- 同等数据下,比RDB文件大。
- 同步过程中Redis主进程会被阻塞,everysec是个折中方案。
数据恢复
Redis读取AOF文件数据还原过程
- 创建一个不带网络的客户端
- 读取AOF文件内容,还原成命令
- 将命令在1中的客户端执行
- 重复2,3的过程
结语
本人深知水平有限,欢迎指正本文错误之处。