Redis支持RDB和AOF两种持久化机制
RDB持久化
把当前进程数据生成快照保存到硬盘的过程,分为手动触发和自动触发
手动触发:save和bgsave
save:阻塞当前Redis进程,直到RDB过程完成为止(已废弃)
bgsave:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。
自动触发:
1)使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。
2)如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点
3)执行debug reload命令重新加载Redis时,也会自动触发save操作。
4)默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。
整体流程
配置:config set dir{newDir}和config set dbfilename{newFileName}运行期动态执行,当下次运行时RDB文件会保存到新目录。
AOF(append only file)持久化
以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。(默认不开启)
配置:appendonly yes(开启)
appendfilename(文件名)
dir(文件路径)
工作流程:命令写入、文件同步、文件重写、重新加载
命令写入:以文本协议格式将写入命令追加到aof_buf缓冲区中。
文本协议格式的优点:
1)文本协议具有良好的兼容性
2)写入命令直接追加,避免协议间转换带来的二次开销
3)文本格式便于随时查看和修改
aof_buf缓冲区的作用:
1)避免每次写入都直接追加硬盘而带来的性能瓶颈。
2)redis提供多种缓冲区同步硬盘策略,很好的平衡了性能与安全。
文件同步:aof_buf缓冲区的数据写入aof文件的过程。
缓冲区同步策略:appendfsync aways|everysec|no
aways:系统调用fsync操作同步aof文件,fsync完成后线程返回
everysec:系统调用write操作,write完成后线程返回。fsync操作由专门的线程每秒调用一次。(默认、推荐)
no:系统调用write操作,不对aof文件做fsync操作,同步硬盘操作由操作系统完成,通常同步周期最长30秒
文件重写:把redis进程中的数据转化为写命令同步到新AOF的过程。
作用:1)多条写命令合并成一条,压缩aof文件体积,可以更好地被redis加载。
2)过滤已超时的数据, 踢出原有文件中的无效命令。
手动触发:bgrewriteaof
自动触发:配置如下参数
auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。
auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。
流程图
fork完成后,所有的修改命令依然会写入aof_buf缓冲区中,并同步到硬盘。为了保证aof期间父进程响应命令的丢失,这部分命令被保存在aof_rewrite_buf(aof重写缓冲区)。新aof写入完成,发送消息给父进程更新统计信息,父进程把重写缓冲区的数据写入新的aof中,写入完成后替换久aof文件。
重新加载:服务器重启时,重新加载文件中的数据。
流程:1)AOF持久化开启且存在AOF文件时,优先加载AOF文件。
2)AOF关闭或者AOF文件不存在时,加载RDB文件。
3)加载AOF/RDB文件成功后,Redis启动成功。
4)AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。