1、redis的两种持久化方式
- RDB 这种持久化方式每隔一段时间,就把当前时间点的数据快照保存到一个.rdb文件中。
- AOF 每次实例接收到写命令时,就会把这条命令追加到AOF文件中。当AOF文件比较大时,redis可以新建一个文件继续写入。
- 可以同时开启AOF和RDB持久化,此时如果机器重启会使用AOF文件来恢复数据,因为AOF文件的数据更完整。
2、RDB持久化方案的优点
- RDB文件相对AOF比较小。
- RDB方案对redis的性能影响小,因为redis主线程只需要产生一个子线程,后续的持久化工作都有这个子线程完成。主线程不需要执行磁盘io等操作
- 对于比较大的数据集,RDB恢复起来比AOF快
3、RDB的缺点
- 可以设置RDB多久进行一次持久化,例如可以设置5分钟内如果有超过100次的写入,则进行一次持久化。当实例因为断电等非正常关闭时,最多会丢失5分钟的数据。如果是正常执行SHUNTDOWN命令关闭实例,实例会先进行一次实例化,然后再关闭。
- 当redis要生成RDB快照时,会调用fork() ,当数据集比较大时,可能会造成实例几毫秒内不能服务,如果数据集特别大,可能会有1秒钟不能服务。AOF机制也需要执行fork,但是可以设置多久执行一次追加buffer中的写命令到AOF文件中。
4、AOF的优点
-
AOF可以设置多种策略:不进行持久化,每1秒持久化一次、每条命令都持久化一次。默认是每秒持久化一次,并且这种配置下,redis的写性能依旧很好。最多只会丢失1秒的数据。持久化是指AOF文件中新增的内容从操作系统的缓存中持久化到磁盘中,客户端执行每条命令都会被追加到AOF文件中,只是这些追加的内容会暂时放到缓存中,并没有进行持久化,需要根据配置进行持久化。
-
AOF存储的是一条条的redis命令,所以可读性很好。
5、AOF的缺点
- 相同的数据集,AOF比RDB文件大。
- 根据不同的同步设置,采用AOF的实例性能可能会比采用RDB的实例性能低一些。默认每1秒同步一次的配置下,AOF实例的性能仍然很高。当设置为不同步时,AOF和RDB的性能几乎一样。但是在巨大的写入负载下,RDB相比较之下更能保证一个最大的延迟时间。
- AOF文件中的可能会出现一些不可预知的字符,如果无法找到这些错误的字符并清除,那只能使用
redis-check-aof工具自动修复,工具可能会把从出现错误字符的地方到结尾的命令全部删除。
6、到底应该使用RDB还是AOF
- 如果想要数据十分安全,那么就要两种持久化方式同时使用。
-
如果允许数据有几分钟的丢失,那么可以只使用RDB
-
很多用户只使用AOF的持久化方式,这种方式我们不推荐。因为如果没有RDB文件,那么就没办法进行方便的备份,快速启动。当AOF文件出现bug时可能无法恢复数据。
7、RDB快照生成细节
- RDB快照文件是一个名为dump.rdb的二进制文件,可以配置N秒内redis数据集有M次改变就进行一次快照,或者直接使用SAVE or BGSAVE 命令手动进行配置。下面的命令表示,60s内如果有1000次数据集的改动就进行一次快照。
save 60 1000
- rdb文件的生成步骤
- redis主线程生成一个子线程
- 子线程把数据集生成一个临时的rdb文件
- 当子线程完全生成好文件之后,就替换掉旧的rdb文件
8、AOF机制的细节
- 在redis.conf 中开启AOF
appendonly yes
- 重写AOF文件
因为AOF文件是把每条命令都记录下来,所以文件会比较大。所以redis有一个优化AOF文件的机制,当执行 BGREWRITEAOF 命令的时候,redis会把当前redis的数据,用最少的命令生成一个新的AOF文件,替换旧的AOF文件。具体步骤:
- redis主线程生成一个子线程
- 子线程开始用当前redis数据集生成一个临时AOF文件
- 主线程会把客户端发送的新命令加入到缓存中,同时也会把这些命令继续追加到旧的AOF文件中。
- 当子线程创建临时AOF文件完成时,主线程得到一个信号,把缓存中的命令追加到这个临时文件中。
- redis重命名这个新文件,redis开始把新的命令追加到这个新的AOF文件中
- AOF文件同步到磁盘的频率设置,默认是
appendfsync everysec
appendfsync always: 每次有新命令追加到AOF中时就同步到磁盘,很安全但是很慢。appendfsync everysec: 每秒同步一次,性能和RDB差不多,最多丢失一秒的数据。appendfsync no: 从不同步,这个设置会使用系统级别的同步机制,一般是每30秒刷新缓存到磁盘中。
9、如何从RDB持久化切换到AOF持久化
- 备份一下最新的dump.rdb文件
- 执行 redis-cli config set appendonly yes命令, 开启AOF
- 执行 redis-cli config set save ""命令,关闭RDB
- 确认生成的AOF文件是否正常
注意:记得修改redis.conf文件相应的配置。