Redis持久化机制

118 阅读3分钟

一、RDB持久化

redis可以通过创建快照来获得某个时间节点上存储在内存里面的数据副本。redis创建快照后可以对快照进行备份,可以将快照复制到其他服务器而创建具有相同数据的服务器副本(主从结构),还可以将快照留在原地以便重启服务器的时候使用

生成RDB快照文件的两个命令save、bgsave

save:同步保存操作,会阻塞redis主线程

bgsave:fork出一个子进程来执行,不阻塞主线程,默认选项

二、AOF持久化(Appened Only File|只追加文件

每执行一条会更改数据的命令,Redis就会将该命令写到AOF缓冲区server.aof_buf中,然后再写入到AOF文件中,最后再根据持久化方式来决定何时刷盘(将AOF文件系统内核缓存区同步到硬盘中)

开启AOF持久化(Redis6.0之后默认开启

默认情况下Redis没有开启AOF持久化。通过appendonly参数开启

appendonly yes

AOF持久化方式

在主线程调用write后立即返回

appendfsync always:后台线程立即调用fsync刷盘,

appendfsync everysec:后台线程每秒中调用fsync刷盘

appendfsync no:不调用fsync,操作系统决定何时进行同步,Linux下一般30秒一次

AOF基本工作流程

1、命令追加:所有的写命令会追加到AOF缓冲区

2、文件写入:将缓冲区数据写入到AOF文件中。这一步调用write函数,调用完直接返回

3、文件同步:根据对应的持久化方式调用fsync刷盘

4、文件重写:随着AOF文件越来越大,需要定期对AOF文件进行重写达到压缩的目的。

5、重启加载:当Redis重启时,可以加载AOF文件进行数据恢复。

AOF重写(rewrite)

当AOF变的太大时,Redis能在后台自动重写一个新的AOF文件,这个新的AOF文件和原有的AOF文件所保存的数据库状态一样,但是体积更小。

AOF文件重写期间,Redis会维护一个AOF重写缓冲区,该缓冲区会在子进程创建新AOF文件期间,记录服务器执行的所有写命令。待新AOF文件创建完成后追加到文件的末尾。

开启AOF重写

可以调用BGREWRITEAOF手动执行AOF重写

根据配置项自动执行AOF重写

auto-aof-rewrite-min-size:如果AOF文件大小小于该值,则不会触发重写,默认值为64MB

auto-aof-rewrite-percentage:当前AOF大小和上一次重写时AOF大小的比值,如果当前AOF文件大小增加了这个百分比值,将触发AOF重写。将此值设置为0将禁用自动AOF重写,默认值为100。

三、RDB和AOF混合持久化

由于RDB和AOF各有优势,Redis4.0开始支持RDB和AOF的混合持久化(默认关闭,通过配置项aof-use-rdb-preamble开启)。

如果开启混合持久化,AOF重写的时候就直接把RDB的内容写到AOF文件开头,好处是结合RDB和AOF的优点,快速加载同时避免丢失过多的数据。当然缺点也有,AOF里面的RDB部分是压缩格式不再是AOF格式,可读性较差。

总结:如何选择RDB和AOF

redis保存的数据丢失一些也没什么影响的话,可以选择使用RDB

不建议单独使用AOF,因为时不时地创建一个RDB快照可以进行数据库备份、更快的重启以及解决AOF引擎错误。

如果要求安全性比较高的话,建议同时开启RDB和AOF持久化或者开启RDB和AOF混合持久化。