Redis的 AOF 和 RDB 备份
-
我们的这个
Redis
示例使用AOF
进行持久化(appendonly
)appendfsync
策略采用的是everysec刷盘。但是AOF随着时间推移,文件会越来越大,因此,Redis
还有一个rewrite
策略,实现AOF
文件的减肥,但是结果的幂等的。我们no-appendfsync-on-rewrite
的策略是no
. 这就会导致在进行rewrite
操作时,appendfsync
会被阻塞。如果当前AOF
文件很大,那么相应的rewrite
时间会变长,appendfsync
被阻塞的时间也会更长。
-
这不是什么新问题,很多开启AOF的业务场景都会遇到这个问题。解决的办法有这么几个:
-
将
no-appendfsync-on-rewrite
设置为yes
. 这样可以避免与appendfsync
争用文件句柄,但是在rewrite
期间的AOF
有丢失的风险。 -
给当前
Redis
实例添加slave
节点,当前节点设置为master
, 然后master
节点关闭AOF
,slave
节点开启AOF
。这样的方式的风险是如果master
挂掉,尚没有同步到salve
的数据会丢失。
-
AOF(append-only file只追加文件)
持久化会将执行的写命令追加到AOF
文件的末尾。在恢复数据时,只要从头到尾的执行AOF
文件中包含的所有写命令即可(全量复制数据是这样实现的)
AOF
可用配置:
image.png
- 其实主要的就是
appendfsync
配置项,有三个可选值,-
always
(每次执行写操作都要同步写入硬盘), -
everysec
(每秒执行一次同步), -
no
(让系统决定何时执行同步)。
-
虽然选择
always
可将数据丢失减少到最少,但这种策略会对硬盘进行大量的写入操作,处理命令速度受到硬盘限制。建议选择everysec
。
-
AOF
优缺点-
优点:
比快照方式可靠,默认每秒同步一次,意味着最多丢失一秒的数据
-
缺点:
相同数据集大小,
AOF
文件会比快照文件大
-
-
AOF
文件格式一开始以为
Redis
就是将写命令原封不动的存储到AOF
文件中,自己试了一下才知道,AOF
文件是使用Redis
网络通讯协议的格式来保存这些命令。 -
压缩
AOF
文件Redis
可以自动压缩(也可以叫重写)AOF
文件,用户也可以通过BGREWRITEAOF
命令来压缩AOF
文件。这里的压缩,不是平时说的压缩的意思,是指创建一个新的文件来替换旧的文件,两个文件保存的数据状态完全一致。如果在本地手动执行BGREWRITEAOF
命令,可以看到会生成一个temp-rewriteaof-*.aof
的临时文件,在结束后替换appendonly.aof
文件,从而减小appendonly.aof
文件的大小。
需要注意的是:
Redis
是启用子进程来进行AOF
文件的压缩,在这期间主进程还是可以继续处理请求的,如果这时请求有写操作就可能导致当前数据库与压缩后的AOF
不一致。Redis
增加了一个缓存来解决这个问题,主进程在接收到新的写操作命令之后,会将命令写入现有的AOF
文件和缓存中。在子进程完成新的AOF
文件之后会将缓存的内容写入到新的AOF
文件中,并改名覆盖旧的AOF
文件。
RDB
快照持久化
image.png
-
RDB
文件结构:RDB
文件是一个经过压缩的二进制文件,不同类型的键值对会采用不同的方式来保存它们。具体的结构我也还没理清楚。。可以参考这篇文章 http://redisbook.com/preview/rdb/rdb_struct.html -
创建快照, 创建快照的方式有以下几种:
- 客户端发送
BGSAVE
命令。与压缩AOF
文件一样,Redis
会fork
出一个子进程,由子进程负责将快照写入硬盘。 - 客户端发送
SAVE
命令。Redis
会开始创建快照,并且在快照创建完成之前不再处理其他命令。不常使用SAVE
命令 - 在满足配置的
save m n
选项时。比如,配置了save 60 1000
,会在满足60秒内有1000次写入的时候开始创建快照。 - 当接收到
SHUTDOWN
请求时,Redis
会执行SAVE
命令,并且不再执行任何其他命令。 - 当从服务器向主服务器发送
SYNC
命令时,如果主服务器不是刚刚执行过BGSAVE
命令,就会开始执行BGSAVE
来创建快照
- 客户端发送
-
快照优缺点
-
优点:
- 文件紧凑,适用于做不同版本的数据备份
- 与
AOF
相比在恢复大数据集时,更快 - 很方便传送到另一个数据中心
-
缺点:
- 一旦
Redis
出现问题,上一次创建快照之后的数据就丢失了
- 一旦
-